StreamWriter и Samba2 (SMB2) - PullRequest
       18

StreamWriter и Samba2 (SMB2)

4 голосов
/ 11 апреля 2011

Хорошо, ребята, это сложный вопрос.

Сценарий :

  • У меня есть несколько служб, работающих на нескольких машинах
  • Каждый сервис имеет несколько потоков, и каждый поток записывает файл на FILER - общее хранилище, используемое моими машинами (с использованием общего ресурса, например \\ filername \ foo \ bar)
  • Машина FILER - это машина NetApp
  • И FILER, и машины, на которых запущены службы, используют SMB2 (http://en.wikipedia.org/wiki/Server_Message_Block)
  • Инструкция, используемая для записи файла, так же проста, как указанная ниже в [КОДЕКС]

[КОД]

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

[/ КОДЕКС]

Проблема :

Иногда служба остается «застрявшей» в этой инструкции. Ошибка:

Процесс не может получить доступ к файлу '\\ filername \ foo \ bar \ myfile.txt', так как он используется другим процессом.

После некоторых из этих ошибок служба отказывается снять блокировку файла. Что происходит потом?

Вы можете удалить файл, но файл НЕМЕДЛЕННО воссоздан. Например, если своего рода постоянный поток жив и продолжает записывать файл бесконечно.

Вы можете остановить службу: она застряла и не будет остановлена, поэтому я вызвал Thread.Abort (да, я знаю, но тренируюсь, но что еще?) Через 2 минуты.

Итак, служба теперь остановлена, но машина сохраняет дескриптор файла, и вы НЕ МОЖЕТЕ убить процесс, сохраняя дескриптор живым, за исключением перезагрузки машины. , .

Я не знаю, что делать сейчас, думаю, я все перепробовал.

Вопросы

Раньше FILER и машины использовали SMB1, и эта проблема никогда не возникала. Поэтому я предполагаю, что на заднем плане происходит что-то подозрительное, но я не могу понять, что ...

Я недавно изменил код, используемый для записи файла, в отчаянной попытке «делегировать» все .net. Теперь это:

File.WriteAllText(pathToTheFile, stringToWriteInTheFile);

но мое внутреннее чувство заключается в том, что .net скрывает то же самое - изменения происходят совсем недавно, поэтому я пока не могу сказать, работает ли "fix" или нет.

РЕДАКТИРОВАТЬ (согласно комментарию Vash): Обычно файл отличается, но может случиться (и это действительно происходит) иногда, когда несколько потоков пытаются записать один и тот же файл, но позаботиться о проблемах параллелизма?

1 Ответ

2 голосов
/ 18 апреля 2011

Попробуйте явно открыть FileStream в «эксклюзивном» режиме, т.е.

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

Конечно, ваш код должен предвидеть, что файл может быть заблокирован, когда он собирается написать его и реагировать соответствующим образом. Эта часть оставлена ​​как упражнение для читателя: -)

Отказ от ответственности: я использовал это в многопоточной среде, но не могу гарантировать, что он будет работать над Samba.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...