mkdir 仍然是原子的吗? (安装在 SAN 上的 Windows 7 文件系统)

2024-02-24

我们有一些通过基于目录的队列进行通信的旧应用程序。队列中的每个项目都是一个文件,并且有一个头文件维护队列中项目的文件名的有序列表。

当然,这个旧代码需要在推送和弹出项目时锁定队列。它所做的是创建一个锁定子目录,假设 mkdir() 是一个原子操作 - 如果多个进程尝试创建一个目录,只有其中一个会成功。

我的一位同事一直在试图找出一个模糊的问题,他认为原因是当进程在不同的机器上运行时,以及当有问题的文件系统安装在 SAN 上时,这种锁定不再起作用。 。

他有可能是正确的吗?


我知道很老的问题,但我希望有人觉得这很有趣。

我使用 PowerShell 创建共享文件夹用作互斥体时也得到了令人困惑的结果,因此我创建了一个测试脚本。

function New-FolderMutex {
    try {
        New-Item -ItemType directory -Path .\TheMutex -ErrorAction Stop > $null
        $true
    } catch {
        $false
    }
}

function Remove-FolderMutex {
    Remove-Item -Path .\TheMutex
}

1..100 | % {
    if (New-FolderMutex) {
        Write-Host "Inside loop $_"
        Remove-FolderMutex
    }
}

当当前目录位于网络共享中时运行此脚本。

当我在两个单独的 PowerShell 控制台中同时运行此脚本时,从错误消息中可以清楚地看出该方法注定失败。对Remove-Item 的调用会产生许多不同的错误,即使它仅由创建该文件夹的进程调用。似乎在幕后发生了一大堆非原子步骤。

当然,OP问的是mkdir(可能是系统调用),我的示例使用更高级别的 PowerShell cmdlet,但我希望这会引起一些兴趣。

两个进程之一的示例输出(为简洁起见进行了编辑)

Inside loop 30
Inside loop 31
Inside loop 32
Inside loop 33
Inside loop 34
Remove-Item : Access to the path 'H:\My Documents\PowerShell\MutexFolder\TheMutex' is denied.
At H:\My Documents\PowerShell\MutexFolder\Test-FolderMutex.ps1:93 char:5
+     Remove-Item -Path .\TheMutex
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : PermissionDenied: (H:\My Documents...Folder\TheMutex:String) [Remove-Item], UnauthorizedAccessException
    + FullyQualifiedErrorId : RemoveItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.RemoveItemCommand

Inside loop 39
Remove-Item : H:\My Documents\PowerShell\MutexFolder\TheMutex is a NTFS junction point. Use the Force parameter to delete or modify.
At H:\My Documents\PowerShell\MutexFolder\Test-FolderMutex.ps1:93 char:5
+     Remove-Item -Path .\TheMutex
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (H:\My Documents...Folder\TheMutex:DirectoryInfo) [Remove-Item], IOException
    + FullyQualifiedErrorId : DirectoryNotEmpty,Microsoft.PowerShell.Commands.RemoveItemCommand

Inside loop 42
Remove-Item : Could not find a part of the path 'H:\My Documents\PowerShell\MutexFolder\TheMutex'.
At H:\My Documents\PowerShell\MutexFolder\Test-FolderMutex.ps1:93 char:5
+     Remove-Item -Path .\TheMutex
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (H:\My Documents...Folder\TheMutex:String) [Remove-Item], DirectoryNotFoundException
    + FullyQualifiedErrorId : RemoveItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand

Inside loop 44
Inside loop 45
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mkdir 仍然是原子的吗? (安装在 SAN 上的 Windows 7 文件系统) 的相关文章

随机推荐