Один из наших клиентов имеет файловый сервер 2008R2 Datacenter Edition SP1 и запускает наше приложение на нескольких машинах, которые обращаются к этим файлам. Существует конкретная ситуация, когда файл присутствует (в папке файлового сервера), который каждая машина открывает (для чтения и записи) каждые 20 или 30 секунд, решает, что не может его обработать, и немедленно закрывается снова. Полностью отдельный механизм блокировки предотвращает попытки одновременного открытия файла несколькими узлами.
Это хорошо работает, когда все обращающиеся машины работают под управлением Server 2008R2, даже если в списке открытых файлов сервера файл отображается как постоянно открытый. Но когда компьютер с Windows 2003 запускает то же приложение и ту же блокировку, он всегда не может открыть файл с нарушением общего доступа, и эта машина также не может удалить файл. Закрытие всех средств доступа 2008R2 приводит к исчезновению файла из списка открытых файлов файлового сервера и позволяет машине Windows 2003 открыть файл и удалить его. Однако PROCMON не обнаруживает контакта с файлом, поскольку средство доступа закрыто.
Это как если бы есть частный код, который машины и сервер 2008R2 используют для сохранения файла в псевдооткрытом состоянии, и о котором 2003 не знает, поэтому он думает, что файл действительно открыт. Он не может быть открыт постоянно, потому что узлы 2008 года регулярно открывают его. Если моя теория верна, как наш клиент может ее исправить?
Я сразу же подозреваю, что есть некоторая потеря во взаимодействии клиентов SMB и SMB2, обращающихся к одному и тому же файлу. Вы могли бы, по крайней мере, попытаться изолировать поведение от проблемы взаимодействия SMB / SMB2, отключив SMB2 на клиентах Windows Server 2008 R2. (Это плохо с точки зрения производительности, но это может достаточно изолировать проблему, чтобы сделать вывод о том, что удаление клиентов Windows Server 2003 является «решением».)
Можете ли вы описать, как работает ваш протокол "блокировки"?
Совет Эвана убедителен, так что сначала я последую ему. Если вы не получаете никакой поддержки, есть кое-что, что вам следует знать о Windows Server 2003: у него есть серьезная ошибка состояния гонки / блокировки в rdbss.sys при выполнении некоторых типов действий с общим файловым ресурсом.
Симптомы и обстоятельства могут различаться и даже могут привести к блокировке сервера Windows 2003, если конфликт файлов достаточно сильный. Я не уверен, почему это не проявляется чаще, но я определенно сильно ударил, делая что-то подобное. Также имейте в виду, что даже с независимым механизмом блокировки могут быть другие процессы, обращающиеся к этим файлам, например антивирус.
Вот статьи кб. Не отвлекайтесь на совершенно неуместные названия.
http://support.microsoft.com/kb/960092
http://support.microsoft.com/kb/983169
Чтобы получить лучшее представление о том, что на самом деле происходит, вам нужно будет выполнить захват сетевого пакета на сервере 2003, когда это произойдет. Парсеры NetMon для SMB на самом деле довольно хороши, и обычно вы можете обнаружить проблему конфликта блокировок.