отказано в разрешении на sysopen - PullRequest
5 голосов
/ 30 сентября 2010

Я пытаюсь исправить периодически возникающую ошибку в 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 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 ревизий, которые я выбрал.

EDIT : Некоторые разработчики Git гораздо лучше выяснят причину, чем пойдут на взлом, который сработает (я думаю, правильный подход).Итак, может ли кто-нибудь помочь мне найти виновника, отказывающего мне в разрешении открыть эти файлы .lock?У меня есть ряд инструментов, которые теоретически могут быть использованы для этой цели, но они не совсем подходят:

  • Process Explorer - показывает все дескрипторы, принадлежащие процессу, а также может искатьдля всех процессов, владеющих данным дескриптором.Тем не менее, он не работает хорошо для кратковременных процессов или дескрипторов (что делает git svn clone / fetch)
  • Unlocker - обнаруживает, когда появляется общее диалоговое окно «Отказано в доступе», и находит ошибочные дескрипторы) и предлагает разобраться с ними.Однако это не происходит, когда программы без проводника сталкиваются с файловыми ошибками

Короче говоря, есть ли способ получить больше информации, не будучи сотрудником Microsoft?

EDIT 2 : Вероятно, это не Symantec, а другая программа, которую мы запускаем на сетевых компьютерах.У меня есть некоторые люди, изучающие это, и они должны быть в состоянии, по крайней мере, сузить причину здесь.

Ответы [ 4 ]

6 голосов
/ 03 октября 2010

Такое поведение обычно можно отнести к антивирусному компоненту, который держит файл открытым и задерживает удаление.

5 голосов
/ 30 сентября 2010

Мое текущее решение - заменить 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;'

И пока все работает довольно хорошо.В большинстве случаев он не печатает никаких. Иногда он печатает один, и я не видел, чтобы он печатал больше, чем один подряд.Это решение слишком хакерское?

Редактировать: Мой код заменен на очищенную версию versionvar Arnfjörð Bjarmason.

1 голос
/ 08 октября 2010

Если ваша программа где-либо вызывает "fork ()", "system ()" или "exec ()", это, вероятно, может быть причиной проблемы.

1 голос
/ 07 октября 2010

Я бы использовал Process Monitor и позволял ему работать, пока сбой не повторится снова. Затем в Process Monitor вы должны увидеть ошибку, когда ваша программа обращается к файлу (скорее всего, ACCESS_DENIED или SHARING_VIOLATION). Затем вы можете выполнить фильтрацию по этому имени файла и посмотреть, какие другие процессы (если есть) открыли его.

...