在NFS v3文件系统上,我遇到了一个奇怪的问题(我觉得这很重要),并行运行两个进程(按照下面的注释和我自己对这个问题的了解,我认为语言不应该重要,而且我认为这是足够可读的):
if { ! [file isdirectory $dir]} {
if {[catch { file mkdir $dir} err]} {
error "-E- failed to mkdir $dir: $err"
}
} 对于那些不熟悉的人来说,tcl中的file mkdir的行为非常类似于mkdir -p --只有当目录存在而不是目录时,它才会失败。我几乎100% (从来没有100% )在任何进程中都没有创建该文件,只有file mkdir。这个问题并不总是会发生,但是在运行回归过程中,我们可能会碰到这样的情况:
Error: can't create directory "$dir": file already exists如果在处理file mkdir过程中$dir是一个现有的非目录文件,则只会发生$dir。有两个问题,第一个问题对我来说更重要:
exec mkdir -p,但如果我是对的,这将遭受同样的问题。很难重现这一点,所以我宁愿在尝试修复之前尽可能地确定。我是在跟踪一个提示之后来到这里的,它说nfs FS可能是问题所在,但我需要更多的专家建议。我不管他们是否都成功,我只是不希望他们失败(在第一次尝试)。
最后注
过了很长一段时间,我回过头来讨论这个问题----这确实是一个tcl问题,但不仅仅是在nfs上,尽管nfs似乎使它变得更糟了!
仍然在寻找答案,解释为什么我看到了我所看到的--看答案。
将其作为一个bug打开
https://core.tcl.tk/tcl/tktview/270f78ca95b642fbed81ed03ad381d64a0d0f7df
Bug已经修好了!
tcl核心的人很快!
发布于 2018-07-04 20:29:29
在TCL核心的男生和女孩已经修复了这一天后,我张贴的错误!
https://core.tcl.tk/tcl/tktview/270f78ca95b642fbed81ed03ad381d64a0d0f7df
固定在1c12ee9e45222d6c。
A感谢卡尔文先生的建议。
旧的测试尝试:
过了很长一段时间,我又回到了这里,并进行了以下测试(在ext4上):
带有tclsh的双终端
1: while {1} {file mkdir bla}
2: while {1} {file mkdir bla; file delete bla}1:上的最终错误
can't create directory "bla": no such file or directory带有tclsh的双终端
1: while {1} {exec mkdir -p bla}
2: while {1} {exec mkdir -p bla; file delete bla}无错误.
tclsh 单终端Bash 1
1: while [ 1 ]; do mkdir -p bla; done
2: while {1} {file mkdir bla; file delete bla}最后我上了1:
mkdir: cannot create directory ‘bla’: File exists但奇怪的是,,
1: while [ 1 ]; do mkdir -p bla; rm -rf bla; done
2: while {1} {file mkdir bla}无错误(删除是罪魁祸首?)和
1: while [ 1 ]; do mkdir -p bla; done
2: while {1} {exec mkdir -p bla; file delete bla}错误的可能性要小得多,(所以删除不是很糟糕吗?)。当然,两个bash shell并不冲突:
1: while [ 1 ]; do mkdir -p bla; rm -rf bla; done
2: while [ 1 ]; do mkdir -p bla; done在NFS上,而不是在EXT4上
1: while {1} {file mkdir bla; exec rm -rf bla}
2: while {1} {file mkdir bla}与一起失败
can't create directory "bla": file already exists1: 2: (随机)。
结论
file mkdir并不像我想象的那样“薄”,它可以产生一个mkdir认为正在创建的目录是一个文件的竞争条件。file delete也可能有这个或类似的问题。它也可能在我的测试中导致失败,但不是在我最初的问题中--对于NFS系统来说,问题变得更糟了,因为只有file mkdir才能很容易地复制错误。
解决方案是使用exec mkdir -p。到目前为止,这对我们的工作是全面的。
https://stackoverflow.com/questions/48095178
复制相似问题