#3212 [file mkdir] race condition

obsolete: 8.4.9
Jeff Woods

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

ActiveState ActiveTcl 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

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


  • Vince Darley

    Vince Darley - 2005-08-17

    Logged In: YES

    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

    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

  • Jeffrey Hobbs

    Jeffrey Hobbs - 2005-08-17

    Logged In: YES

    If it isn't merged into 8.4, then it wouldn't be in 8.4.11,
    but AT 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

    Backported the simple change to 8.4 branch.

  • Jeffrey Hobbs

    Jeffrey Hobbs - 2005-08-17
    • status: open --> closed-fixed

Get latest updates about Open Source Projects, Conferences and News.

Sign up for the SourceForge newsletter:

No, thanks