首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mkdir原子性

mkdir原子性
EN

Stack Overflow用户
提问于 2018-01-04 12:17:57
回答 1查看 1.2K关注 0票数 1

在NFS v3文件系统上,我遇到了一个奇怪的问题(我觉得这很重要),并行运行两个进程(按照下面的注释和我自己对这个问题的了解,我认为语言不应该重要,而且我认为这是足够可读的):

代码语言:javascript
复制
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。这个问题并不总是会发生,但是在运行回归过程中,我们可能会碰到这样的情况:

代码语言:javascript
复制
Error: can't create directory "$dir": file already exists

如果在处理file mkdir过程中$dir是一个现有的非目录文件,则只会发生$dir。有两个问题,第一个问题对我来说更重要:

  1. mkdir不是原子的吗?特别是,文件系统中的文件节点在创建过程中是否可以作为一个非目录存在?
  2. 假设这确实是一个错误,是否有一种简单的原子方法来做到这一点?我考虑过exec mkdir -p,但如果我是对的,这将遭受同样的问题。

很难重现这一点,所以我宁愿在尝试修复之前尽可能地确定。我是在跟踪一个提示之后来到这里的,它说nfs FS可能是问题所在,但我需要更多的专家建议。我不管他们是否都成功,我只是不希望他们失败(在第一次尝试)。

最后注

过了很长一段时间,我回过头来讨论这个问题----这确实是一个tcl问题,但不仅仅是在nfs上,尽管nfs似乎使它变得更糟了!

仍然在寻找答案,解释为什么我看到了我所看到的--看答案。

将其作为一个bug打开

https://core.tcl.tk/tcl/tktview/270f78ca95b642fbed81ed03ad381d64a0d0f7df

Bug已经修好了!

tcl核心的人很快!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-04 20:29:29

在TCL核心的男生和女孩已经修复了这一天后,我张贴的错误!

https://core.tcl.tk/tcl/tktview/270f78ca95b642fbed81ed03ad381d64a0d0f7df

固定在1c12ee9e45222d6c

A感谢卡尔文先生的建议。

旧的测试尝试:

过了很长一段时间,我又回到了这里,并进行了以下测试(在ext4上):

带有tclsh双终端

代码语言:javascript
复制
1: while {1} {file mkdir bla}
2: while {1} {file mkdir bla; file delete bla}

1:上的最终错误

代码语言:javascript
复制
can't create directory "bla": no such file or directory

带有tclsh的双终端

代码语言:javascript
复制
1: while {1} {exec mkdir -p bla}
2: while {1} {exec mkdir -p bla; file delete bla}

无错误.

tclsh 单终端Bash 1

代码语言:javascript
复制
1: while [ 1 ]; do mkdir -p bla; done
2: while {1} {file mkdir bla; file delete bla}

最后我上了1:

代码语言:javascript
复制
mkdir: cannot create directory ‘bla’: File exists

但奇怪的是,,

代码语言:javascript
复制
1: while [ 1 ]; do mkdir -p bla; rm -rf bla; done
2: while {1} {file mkdir bla}

无错误(删除是罪魁祸首?)和

代码语言:javascript
复制
1: while [ 1 ]; do mkdir -p bla; done
2: while {1} {exec mkdir -p bla; file delete bla}

错误的可能性要小得多,(所以删除不是很糟糕吗?)。当然,两个bash shell并不冲突:

代码语言:javascript
复制
1: while [ 1 ]; do mkdir -p bla; rm -rf bla; done
2: while [ 1 ]; do mkdir -p bla; done

在NFS上,而不是在EXT4上

代码语言:javascript
复制
1: while {1} {file mkdir bla; exec rm -rf bla}
2: while {1} {file mkdir bla}

与一起失败

代码语言:javascript
复制
can't create directory "bla": file already exists

1: 2: (随机)。

结论

file mkdir并不像我想象的那样“薄”,它可以产生一个mkdir认为正在创建的目录是一个文件的竞争条件。file delete也可能有这个或类似的问题。它也可能在我的测试中导致失败,但不是在我最初的问题中--对于NFS系统来说,问题变得更糟了,因为只有file mkdir才能很容易地复制错误。

解决方案是使用exec mkdir -p。到目前为止,这对我们的工作是全面的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48095178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档