Мы столкнулись с очень странной проблемой, которая сводила нас с ума. Иногда вновь созданные файлы на нашем ПК с файлообменником «отсутствовали» в течение некоторого периода времени. Чтобы воспроизвести проблему, у вас должно быть как минимум два компьютера, назовите их alpha
и beta
. Создайте общую папку на beta
ПК (\\beta\share\bug
) и запустите этот сценарий PowerShell с alpha
ПК:
param(
$sharePath="\\beta\share\bug"
)
$sharePC = ($sharePath -split '\\')[2]
$session = New-PSSession -ComputerName $sharePC
$counter = 0
while ($true) {
$fileName = $sharePath + "\$counter.txt"
Invoke-Command -Session $session -ScriptBlock {
param(
$fileName
)
"" > $fileName
} -ArgumentList $fileName
if (Test-Path $fileName) {
Write-Host "File $fileName exists" -fore Green
} else {
Write-Host "!!! File $fileName does NOT exist!" -fore Red
}
$counter = $counter + 1
Start-Sleep 2
}
После запуска этого скрипта вы должны увидеть следующие сообщения:
File \\beta\share\bug\1.txt exists
File \\beta\share\bug\2.txt exists
...
А теперь: откройте cmd.exe
и выполните следующую команду:
if exist \\beta\share\bug\foo.txt echo 1
После этого в течение примерно 10 секунд вы увидите следующие сообщения:
!!! File \\beta\share\bug\3.txt does NOT exist!
!!! File \\beta\share\bug\4.txt does NOT exist!
Мы обнаружили, что ошибка вызвана перечислением общего каталога, в котором создаются новые файлы. В Python
вызовите os.listdir('//beta/share/bug')
, чтобы воспроизвести ошибку. В C#
: Directory.GetDirectories(@"\\beta\share\bug")
. Вы даже можете просто перейти к общему каталогу через оболочку и вызвать ls
или dir
.
Ошибка обнаружена Windows Server 2008 R2
Обратите внимание, что вы не можете просматривать содержимое каталога на alpha
ПК в проводнике Windows в режиме реального времени, потому что если вы откроете этот каталог в проводнике, ошибка не возникнет! Поэтому обязательно закройте все такие окна, прежде чем пытаться воспроизвести ошибку. После каждого перезапуска скрипта вы должны вручную удалять все уже созданные файлы из общей папки (потому что скрипт довольно глупый и всегда начинается с 0.txt).
В настоящее время у нас есть 2 решения этой проблемы:
- Если клиент видит эту ситуацию, он создает какой-то временный файл в проблемном каталоге - после этого файлы волшебным образом появляются.
- Отключите SMB 2.0: http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
Кто-нибудь когда-либо обнаруживал подобную проблему и может объяснить, почему она возникает и как ее «правильно исправить»?
Спасибо