Search code examples
linuxconcurrencyreaddir

Linux ext3 readdir and concurrent updates


we are receiving about 10000 messages per hour. We store them as individual files in hourly directories on an ext3 filesystem. The file name includes a sequence number. We use rsync to mirror these files every 20 seconds at another location (via a SAN, but that doesn't matter).

Sometimes an rsync run picks up files n-3, n-2, n-1, n+1, and then next rsync run continues with n, n+2, n+3, n+4 and so on.

Is it possible that when one process creates files in a certain sequence within a directory, that another process using readdir() sees the files appearing in a different sequence?

Kind regards, Sebastian


Solution

  • I suppose your question can be restated as:

    If process A creates file d/x and then creates file d/y, is it possible for process B to peform a concurrent readdir() on directory d and see an entry d/y, but not see an entry d/x?

    The answer is Yes. The ordering guarantees for readdir are very weak indeed.

    If you want to enforce an ordering, you will need to explicitly fsync() a file descriptor for the directory d itself after creating each file.