StreamWriter and Samba2 (SMB2)

本文关键字:SMB2 Samba2 and StreamWriter | 更新日期: 2023-09-27 17:49:46

好了,伙计们,这个问题很难回答。

场景:

  • 我有多个服务在多台机器上运行
  • 每个服务都有多个线程,每个线程在我的机器使用的共享存储FILER上写一个文件(使用共享,例如''filername'foo'bar)
  • FILER机器是一台NetApp机器
  • FILER和运行服务的机器都在使用SMB2 (http://en.wikipedia.org/wiki/Server_Message_Block)
  • 用于写入文件的指令与下面[The CODE]
  • 中列出的指令一样简单。

(代码)
using (StreamWriter outfile = new StreamWriter(pathToTheFile, false))
{
  outfile.Write(stringToWriteInTheFile);
}

[/代码]

:

有时服务在此指令上仍然"卡住"。给出的错误是:

进程无法访问文件'''filername'foo'bar'myfile.txt',因为该文件正在被其他进程使用。

出现这些错误后,服务拒绝释放对文件的锁。然后会发生什么?

您可以删除该文件,但该文件将立即重新创建。例如,如果某种永久流是活的,并且无限期地写入文件。

你可以停止服务:它卡住了,不会被停止,所以我强制一个线程。2分钟后中止(是的,我知道,但练习,但还有什么?)

所以,服务现在停止了,但是机器保留了文件的句柄,你不能杀死保持句柄存活的进程,除非重新启动机器…

我不知道现在该怎么办,我想我什么都试过了。

考虑:

以前,FILER和机器使用的是SMB1,这个问题从未出现过。所以我猜后台发生了一些可疑的事情,但我不明白是什么……

我最近更改了用于编写文件的代码,在绝望的尝试中"委托"一切到。net。现在是:

File.WriteAllText(pathToTheFile, stringToWriteInTheFile);

但我的直觉是,在包装下,.net正在做完全相同的事情-这个变化是最近的,所以我仍然不能说"修复"是否有效。

EDIT(根据Vash注释):通常文件是不同的,但它可能发生(它实际上发生)有时多个线程试图写同一个文件,然而:(-做文件。WriteAllText不应该考虑并发问题?

StreamWriter and Samba2 (SMB2)

尝试以"exclusive"模式显式打开FileStream,即

using (var fs = new FileStream("path", 
                              FileMode.Open, FileAccess.ReadWrite, 
                              FileShare.None))
{
    using (var sw = new StreamWriter(fs))
    {
        ...

当然,你的代码在写文件时必须预料到文件可能被锁定,并做出适当的反应。这部分留给读者作为练习:-)

免责声明:我已经在多线程环境中使用了它,但我不能保证它在Samba上也能工作。