windows 上的独占文件锁定,缓慢
Exclusive file lock on windows, slowness
我正在尝试使用独占文件锁定作为不同主机上进程 运行 之间的锁定。大多数时候它工作正常。它要么成功,要么 returns ERROR_SHARING_VIOLATION
在一个循环中,我这样做:
CreateFileW(name,
FILE_APPEND_DATA,
FILE_SHARE_DELETE,
NULL,
OPEN_ALWAYS, // open or create
FILE_FLAG_DELETE_ON_CLOSE, // delete at close file
NULL);
定期 returns ERROR_ACCESS_DENIED 但重试成功。
问题:
在极少数情况下:
打开文件时启动的进程堆栈:
假设有几个成功了,但其余的(20 个进程)卡住了很长一段时间(50 分钟)
锁定文件可见且时间戳已更新。
然后一个进程通过,在稍后的某个时刻,所有提醒进程在相对较短的时间内(例如几秒钟)成功通过
那么 2 个问题
- 如何解决此类行为?
- 小问题:为什么 ERROR_ACCESS_DENIED 返回?
谢谢。
环境:
- 文件位于 Windows Server 2012 R2
- 关于 Windows 2008 R2 协议的程序
- SMB 2.1
ACCESS_DENIED 可能是这样的:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
If you call CreateFile on a file that is pending deletion as a result of a previous call to DeleteFile, the function fails. The operating system delays file deletion until all handles to the file are closed. GetLastError returns ERROR_ACCESS_DENIED.
你不调用 DeleteFile,但你做同样的事情。
您没有完全指出您观察到的行为中不受欢迎的部分是什么。我猜 Creates 会卡住——在这种情况下,我建议您尝试添加 FILE_COMPLETE_IF_OPLOCKED 标志。
您可能会受到影响的另一件事是隧道和关闭时删除。检查此 https://support.microsoft.com/en-us/kb/172190。所以禁用隧道,看看它给你带来了什么。
要进一步诊断,您可能需要 运行 在受影响的客户端和包含受影响的 SMB 共享的服务器上进行 procmon 跟踪。
我正在尝试使用独占文件锁定作为不同主机上进程 运行 之间的锁定。大多数时候它工作正常。它要么成功,要么 returns ERROR_SHARING_VIOLATION 在一个循环中,我这样做:
CreateFileW(name,
FILE_APPEND_DATA,
FILE_SHARE_DELETE,
NULL,
OPEN_ALWAYS, // open or create
FILE_FLAG_DELETE_ON_CLOSE, // delete at close file
NULL);
定期 returns ERROR_ACCESS_DENIED 但重试成功。
问题: 在极少数情况下: 打开文件时启动的进程堆栈: 假设有几个成功了,但其余的(20 个进程)卡住了很长一段时间(50 分钟) 锁定文件可见且时间戳已更新。
然后一个进程通过,在稍后的某个时刻,所有提醒进程在相对较短的时间内(例如几秒钟)成功通过
那么 2 个问题
- 如何解决此类行为?
- 小问题:为什么 ERROR_ACCESS_DENIED 返回?
谢谢。
环境:
- 文件位于 Windows Server 2012 R2
- 关于 Windows 2008 R2 协议的程序
- SMB 2.1
ACCESS_DENIED 可能是这样的:
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
If you call CreateFile on a file that is pending deletion as a result of a previous call to DeleteFile, the function fails. The operating system delays file deletion until all handles to the file are closed. GetLastError returns ERROR_ACCESS_DENIED.
你不调用 DeleteFile,但你做同样的事情。
您没有完全指出您观察到的行为中不受欢迎的部分是什么。我猜 Creates 会卡住——在这种情况下,我建议您尝试添加 FILE_COMPLETE_IF_OPLOCKED 标志。
您可能会受到影响的另一件事是隧道和关闭时删除。检查此 https://support.microsoft.com/en-us/kb/172190。所以禁用隧道,看看它给你带来了什么。
要进一步诊断,您可能需要 运行 在受影响的客户端和包含受影响的 SMB 共享的服务器上进行 procmon 跟踪。