#3212 [file mkdir] race condition

obsolete: 8.4.9
closed-fixed
Vince Darley
5
2005-08-17
2005-08-17
Jeff Woods
No

------- Original report to ActiveState by Jeff Woods 2005-
08-16 17:52

ActiveState ActiveTcl 8.4.9.0.121397 Dec 07, 2004

platform: RHEL3 on Dell 2650 (Xeon x86-32)

I think we've stumbled on a race condition in "file mkdir".

The ActiveTcl documentation says (in part):
file mkdir dir ?dir ...?
Creates each directory specified. For each pathname dir
specified, this command will create all non-existing
parent directories as well as dir itself. If an existing
directory is specified, then no action is taken and no
error is returned. Trying to overwrite an existing file with
a directory will result in an error. Arguments are
processed in the order specified, halting at the first error,
if any.

The errorInfo we get is (lightly edited):
can't create
directory "/some/path/to/logs/ACCT/partial/2005/0813":
file already exists
while executing
"file mkdir [file dirname $log]"
(procedure "acctStart" line 20)
invoked from within
"acctStart {$Revision: 1.3 $}"

We use cron to launch two Tcl scripts at midnight UTC
(18:00 local). Both scripts call a Tcl
procedure "acctStart" to log their execution and any
errors that might occur. The "acctStart" procedure
determines the path to the log file including the PID in
the filename and the UTC date in the directory path. Just
before opening the log file, it ensures the directory
exists by executing the failing command above. We've
been using this technique for years to create directories
dynamically and haven't had a problem with it until
tonight.

After the error occurred I checked and the directory
specified in the error exists and contains the log file of
the other process that ran at the time (plus other logs
created in the interim).

I can only imagine this happening if "file mkdir" is using
an algorithm along the lines of "if dirname doesn't exist,
then create it" when it should be doing something more
like "create dirname; if cant create and existing !=
directory, then error".

------- Comments from Jeff Hobbs 2005-08-16 21:06

Please report this core issue to http://tcl.sf.net/.
FWIW, you can see the implementation of 'file mkdir' in
tcl/generic/tclFCmd.c:TclFileMakeDirsCmd.

Discussion

  • Vince Darley
    Vince Darley
    2005-08-17

    Logged In: YES
    user_id=32170

    This is reported against an old version of Tcl. It's
    certainly been fixed in cvs HEAD:

    2005-06-13 Vince Darley <vincentdarley@users.sourceforge.net>

    * generic/tclFCmd.c: correct fix to file mkdir 2005-06-09,
    [Bug 1219176]

    2005-06-09 Vince Darley <vincentdarley@users.sourceforge.net>

    * generic/tclFCmd.c: fix to race condition in file mkdir
    [Bug 1217375]

     
  • Vince Darley
    Vince Darley
    2005-08-17

    • assigned_to: vincentdarley --> hobbs
     
  • Jeff Woods
    Jeff Woods
    2005-08-17

    Logged In: YES
    user_id=109728

    Is it fixed in a shipping stable (non-alpha/non-beta) release?
    If I read the CVS tags correctly, the HEAD fix isn't yet
    merged into the 8.4 branch.

    FWIW, I looked for a bug report against mkdir before filing
    this report but didn't find the old reports. Sorry about the
    duplication.

     
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2005-08-17

    Logged In: YES
    user_id=72656

    If it isn't merged into 8.4, then it wouldn't be in 8.4.11,
    but AT 8.4.11.0 is the most recent stable release. Vince -
    can this be considered for backport?

     
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2005-08-17

    • assigned_to: hobbs --> vincentdarley
     
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2005-08-17

    Logged In: YES
    user_id=72656

    Backported the simple change to 8.4 branch.

     
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2005-08-17

    • status: open --> closed-fixed