【发布时间】:2011-07-06 18:20:30
【问题描述】:
我们遇到了非常奇怪的问题,这让我们发疯了。有时,我们的文件共享 PC 上新创建的文件在一段时间内“不存在”。要重现问题,您至少应该拥有两台计算机,分别调用它们alpha 和beta。在beta PC (\\beta\share\bug) 上创建文件共享并从alpha PC 运行此 PowerShell 脚本:
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")。您甚至可以简单地通过 shell 导航到共享目录并调用 ls 或 dir。
在Windows Server 2008 R2 上发现了错误
请注意,您不能在Windows Explorer 中实时查看alpha PC 上的目录内容,因为如果您在资源管理器中打开此目录,则不会出现错误!因此,请确保在尝试重现错误之前关闭所有此类窗口。每次脚本重新启动后,您应该手动从共享中删除所有已创建的文件(因为脚本相当愚蠢并且总是从 0.txt 开始)。
我们目前有 2 个解决此问题的方法:
- 如果客户看到这种情况,它会在有问题的目录中创建一些临时文件 - 在这些文件神奇地出现之后。
- 禁用 SMB 2.0:http://www.petri.co.il/how-to-disable-smb-2-on-windows-vista-or-server-2008.htm
有没有人发现过类似的问题并能解释为什么会发生以及如何“正确解决”它?
谢谢
【问题讨论】:
-
您是否查看过网络跟踪以了解发生了什么?
-
不,很遗憾我没有查看网络跟踪
-
我认为网络跟踪不会有帮助。这似乎是服务器端的缓存问题。从 Windows 2003 迁移到 2012R2 时,我们遇到了完全相同的问题。似乎 SMB 显示了创建它们的服务器的文件,但随后显示这些文件对于查询它们的其他服务器尚不存在。这很糟糕。