sysopen权限被拒绝

时间:2010-09-30 15:54:31

标签: windows perl git git-svn timing

我正在尝试修复git-svn中的间歇性错误。问题出现在Windows XP中,包括Cygwin git(perl v5.10.1)和msysGit(perl v5.8.8)。

对于涉及获取的任何操作,我能够中途通过,然后操作就会消失,类似于

  

无法打开.git / svn / refs / remotes / trunk / .rev_map.cc05479a-e8ea-436f-8d71-e07493b7796c.lock:设备或资源繁忙

     

at / usr / lib / git-core / git-svn line 5240

但是,确切的锁定文件和行号并不总是相同。我已将实际问题跟踪到第3679行

sysopen(my $fh, $db_lock, O_RDWR | O_CREAT)

这是创建一个新的.lock文件,我试过相当于无效。

open(my $fh, ">", $db_lock)

我检查了目录的权限,它是drwxr-xr-x,所以不应该有任何问题,或者如果它们存在,它们就不会那么不一致。

这可能是因为脚本正在快速连续创建和重命名这个文件,XP无法处理它吗?编辑:我怀疑是这种情况,因为当我使用perl调试器并手动启动每个sysopen的执行时,我提取的100个修订版本没有问题。

编辑:一些Git开发人员更愿意找出根本原因而不是正常工作的黑客(我认为正确的方法)。那么,任何人都可以帮我找到否认我允许打开这些.lock文件的罪魁祸首吗?我有许多理论上可以用于此目的的工具,但它们并不完全是这样的:

  • Process Explorer - 显示进程拥有的所有句柄,还可以搜索拥有给定句柄的所有进程。但是,它不适用于短期进程或句柄(这是git svn clone / fetch所做的)
  • 解锁器 - 检测通用的“权限被拒绝”对话框何时出现,并找到有问题的句柄和提议来处理它们。但是,当非资源管理器程序遇到基于文件的错误时,它不会出现

简而言之,有没有什么办法可以在不成为微软员工的情况下获得更多信息?

编辑2 :可能不是赛门铁克,而是我们在联网计算机上运行的另一个程序。我有一些人在研究它,他们应该能够至少缩小原因。

4 个答案:

答案 0 :(得分:6)

这种行为通常可归因于防病毒组件保持文件打开并延迟删除。

答案 1 :(得分:5)

我目前解决的问题是用这个

替换sysopen
my $fh;
if ($^O eq 'MSWin32' or $^O eq 'cygwin') {
   for my $try (1..10) { # Retry up to 10 times on problematic systems
       sysopen($fh, $db_lock, O_RDWR | O_CREAT);
       last if $fh;
   }
} else {
   sysopen($fh, $db_lock, O_RDWR | O_CREAT);
}

croak "Couldnt open $db_lock: $!\n" unless $fh;'

到目前为止,它运作良好。大多数时候它不会打印任何。的,偶尔会打印一个,而且我还没有看到它连续打印多个。这个解决方案太难了吗?

编辑:我的代码被ÆvarArnfjörðBjarmason的清理版所取代。

答案 2 :(得分:1)

我会使用Process Monitor让它运行直到再次发生故障。然后在Process Monitor中,您应该在程序访问文件时看到错误(很可能是ACCESS_DENIED或SHARING_VIOLATION)。然后,您可以按该文件名进行过滤,并查看其他进程(如果有)打开它。

答案 3 :(得分:1)

如果你的程序在任何地方调用“fork()”或“system()”或“exec()”,这很可能是问题的根源。