[Gluster-devel] readdir() harmful in threaded code

Vijay Bellur vbellur at redhat.com
Mon Jul 25 00:20:19 UTC 2016


On 07/23/2016 03:25 AM, Pranith Kumar Karampuri wrote:
> Emmanuel,
>        I procrastinated too long on this :-/, It is July already :-(. I
> just looked at the man page in Linux and it is a bit confusing, so I am
> not sure how to go ahead.
>
> For readdir_r(), I see:
>
> DESCRIPTION
>        This function is deprecated; use readdir(3) instead.
>
>        The readdir_r() function was invented as a reentrant version of
> readdir(3).  It reads
>        the next directory entry from the directory stream dirp, and
> returns it in the  call‐
>        er-allocated  buffer  pointed  to by entry.  For details of the
> dirent structure, see
>        readir(3).
>
> For readdir(3) I see:
> ATTRIBUTES
>        For an explanation of the terms used in this section, see
> attributes(7).
>
>        ┌──────────┬───────────────┬──────────────────────────┐
>        │Interface │ Attribute     │ Value                    │
>        ├──────────┼───────────────┼──────────────────────────┤
>        │readdir() │ Thread safety │ MT-Unsafe race:dirstream │
>        └──────────┴───────────────┴──────────────────────────┘
>
>        In the current POSIX.1 specification (POSIX.1-2008), readdir() is
> not required to be thread-safe.  However, in modern implementations
> (including the glibc implementation), concur‐
>        rent  calls  to readdir() that specify different directory
> streams are thread-safe.  In cases where multiple threads must read from
> the same directory stream, using readdir() with
>        external synchronization is still preferable to the use of the
> deprecated readdir_r(3) function.  It is expected that a future version
> of POSIX.1 will require  that  readdir()  be
>        thread-safe when concurrently employed on different directory
> streams.
>
>
> So should we do readdir() with external locks for everything instead?
>

Do you have any concrete examples of problems encountered due to the 
same directory stream being invoked from multiple threads?

Kaleb's recent patch [1] and the updated man page for readdir_r in linux 
[2] has some more context.

-Vijay

[1] http://review.gluster.org/14838
[2] https://manned.org/readdir_r





More information about the Gluster-devel mailing list