From: SourceForge.net <no...@so...> - 2005-08-17 16:10:29
|
Bugs item #1262180, was opened at 2005-08-17 08:05 Message generated for change (Comment added) made by kazrak_ You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=1262180&group_id=10894 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: 36. File System Group: obsolete: 8.4.9 Status: Open Resolution: None Priority: 5 Submitted By: Jeff Woods (kazrak_) Assigned to: Jeffrey Hobbs (hobbs) Summary: [file mkdir] race condition Initial Comment: ------- 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. ---------------------------------------------------------------------- >Comment By: Jeff Woods (kazrak_) Date: 2005-08-17 09:10 Message: 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. ---------------------------------------------------------------------- Comment By: Vince Darley (vincentdarley) Date: 2005-08-17 08:48 Message: 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 <vin...@us...> * generic/tclFCmd.c: correct fix to file mkdir 2005-06-09, [Bug 1219176] 2005-06-09 Vince Darley <vin...@us...> * generic/tclFCmd.c: fix to race condition in file mkdir [Bug 1217375] ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=1262180&group_id=10894 |