Jan Just Keijser wrote:
> hmmm
> readdir is crashing in a multithreaded application... shouldn't we be
> using readdir_r and readdir64_r when using threads? I've looked at the
> original gridmapdir patch and indeed, it lists
>
> +void
> +gridmapdir_newlease(char * encodedglobusidp,
> + char * usernameprefix)
> +{
> + int ret;
> + char *userfilename, *encodedfilename, *gridmapdir;
> + struct dirent *gridmapdirentry;
> + DIR *gridmapdirstream;
> + struct stat statbuf;
> + + gridmapdir = getenv("GRIDMAPDIR");
> + if (gridmapdir == NULL) return;
> +
> + encodedfilename = malloc(strlen(gridmapdir) + (size_t) 2 +
> + strlen(encodedglobusidp));
> + sprintf(encodedfilename, "%s/%s", gridmapdir, encodedglobusidp);
> +
> + gridmapdirstream = opendir(gridmapdir);
> +
> + while ((gridmapdirentry = readdir(gridmapdirstream)) != NULL)
>
>
> which indeed, is not threadsafe...
> so this is a "sleeping" bug that can hit anybody as soon as
> - the system is under heavy load
> - the gridmapdir gets too large
>
> how can we either
> - limit the number of threads of the network-server
In /opt/edg/etc/edg_wl.conf there are these:
MasterThreads = 8;
DispatcherThreads = 10;
You could try setting either or both of them to 1,
with subsequent performance penalties.
> - patch and recompile the vdt_globus_essentials package, with gridmapdir
> patch
I intend to provide you with that today.
|