Windows上的独占文件锁定,速度慢

时间:2015-03-16 17:30:52

标签: windows locking

我正在尝试使用独占文件锁定作为在不同主机上运行的进程之间的锁定。大多数时候它工作正常。它要么成功要么返回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);

它会定期返回ERROR_ACCESS_DENIED,但重试成功。

问题: 在极少数情况下: 在打开文件上启动进程堆栈: 让我们说一些成功,但其余的(20个进程)卡住了相当长的时间(50分钟) 锁定文件可见,其时间戳已更新。

然后一个过程通过,稍后一段时间所有提醒过程在相对较短的时间内成功完成(如几秒钟)

所以2个问题

  1. 如何解决此类行为?
  2. 次要问题:为什么ERROR_ACCESS_DENIED返回?
  3. 谢谢。

    ENV:

    • Windows Server 2012 R2上的文件
    • Windows 2008 R2协议上的程序
    • SMB 2.1

1 个答案:

答案 0 :(得分:1)

ACCESS_DENIED可能是这样的:

  

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

     

如果由于之前调用DeleteFile而在待删除的文件上调用CreateFile,则该函数将失败。操作系统会延迟文件删除,直到关闭文件的所有句柄。 GetLastError返回ERROR_ACCESS_DENIED。

你不能调用DeleteFile,但是你做了同样的事情。

您没有完全指出您观察到的行为的不良部分。我猜想Create卡住了 - 在这种情况下,我建议你尝试添加FILE_COMPLETE_IF_OPLOCKED标志。

您可能受到影响的另一件事是隧道和关闭时删除。检查此https://support.microsoft.com/en-us/kb/172190。因此,禁用隧道并查看它带给您什么。

要进一步诊断,您可能希望在受影响的客户端和包含受影响的SMB共享的服务器上运行procmon跟踪。