Nat*_*ons 5 windows git perl 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:设备或资源繁忙
在/ usr/lib/git-core/git-svn第5240行
但是,确切的锁定文件和行号并不总是相同.我已将实际问题跟踪到3679行
sysopen(my $fh, $db_lock, O_RDWR | O_CREAT)
Run Code Online (Sandbox Code Playgroud)
这是创建一个新的.lock文件,我试过相当于无效.
open(my $fh, ">", $db_lock)
Run Code Online (Sandbox Code Playgroud)
我检查了目录的权限,它是drwxr-xr-x,所以不应该有任何问题,或者如果它们是,它们就不会那么不一致.
这可能是因为脚本正在快速连续多次创建和重命名这个文件,XP无法处理它?编辑:我怀疑是这种情况,因为当我使用perl调试器并手动启动每个sysopen的执行时,我提取的100个修订版本没有问题.
编辑:一些Git开发人员更愿意找出根本原因,而不是发生工作的黑客(我认为正确的方法).那么,任何人都可以帮我找到否认我允许打开这些.lock文件的罪魁祸首吗?我有许多理论上可以用于此目的的工具,但它们并不完全是这样的:
简而言之,有没有什么方法可以在不成为微软员工的情况下获得更多信息?
编辑2:它可能不是赛门铁克,而是我们在联网计算机上运行的另一个程序.我有一些人在研究它,他们应该能够至少缩小原因.
我目前解决的问题是用这个替换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;'
Run Code Online (Sandbox Code Playgroud)
到目前为止,它运作良好.大多数时候它不会打印任何.的,偶尔会打印一个,而且我还没有看到它连续打印多个.这个解决方案太难了吗?
编辑:我的代码被ÆvarArnfjörðBjarmason的清理版所取代.