Примеры оппортунистических блокировок

В следующих примерах показаны перемещения данных и сообщений SMB по мере того, как создаются и нарушаются оппортунистические блокировки. Обратите внимание, что клиенты могут кэшировать данные атрибутов файла, а также данные файлов.

Также обратите внимание, что эти примеры основаны на ситуациях, когда клиентские приложения запрашивают оппортунистические блокировки с удаленных серверов. Эти процессы автоматически инициируются сетевым перенаправителем и удаленным сервером— клиентское приложение или приложения не имеют прямого участия. Процессы, описанные в этих примерах, можно обобщить в ситуациях, когда локальные клиентские приложения напрямую запрашивают оппортунистические блокировки из локальной файловой системы, за исключением того, что обмен данными по сети не выполняется.

Оппортунистическая блокировка уровня 1

На следующей схеме показано представление сетевого трафика оппортунистической блокировки файла уровня 1. Стрелки указывают направление перемещения данных, если таковые есть.

Событие Клиент X Сервер Клиент Y
1 Открывает файл, запрашивает уровень блокировки 1 ==>
2 <== Предоставление оппортунистической блокировки уровня 1
3 Выполняет операции чтения, записи и другие операции ==>
4 <== Запросы на открытие файла
5 <== Нарушает оппортунистическую блокировку
6 Отменяет упреждающее чтение данные
7 Записывает данные ==>
8 Отправляет сообщение "close" или "done" ==>
9 Хорошо открытая операция ==>
10 Выполняет операции чтения, записи и другие операции ==> <== Выполняет операции чтения, записи и других операций.

 

В случае 1 клиент X открывает файл и в рамках операции открытия запрашивает оппортунистическую блокировку файла уровня 1. В событии 2 сервер предоставляет блокировку уровня 1, так как файл не открыт ни у другого клиента. Клиент переходит к файлу обычным образом в событии 3.

В случае 4 клиент Y пытается открыть файл и запрашивает оппортунистическую блокировку. Сервер видит, что файл открыт для клиента X. Сервер игнорирует запрос Y, а клиент X очищает все данные записи и покидает кэш чтения для файла.

Сервер принудительно выполняет очистку X, отправляя В X сообщение SMB, нарушающее оппортунистическую блокировку, событие 5. Клиент X "без уведомления" удаляет все упреждаемые для чтения данные; другими словами, этот процесс не создает сетевой трафик. В случае 7 клиент X записывает все кэшированные данные записи на сервер. Когда клиент X завершает запись кэшированных данных на сервер, клиент X отправляет на сервер сообщение "close" или "done" (событие 8).

После того как сервер будет уведомлен о том, что клиент X завершил очистку кэша записи на сервере или закрыл файл, сервер может открыть файл для клиента Y в случае 9. Так как сервер теперь имеет два клиента с одинаковыми открытыми файлами, он предоставляет оппортунистическую блокировку ни одному из этих клиентов. Оба клиента продолжают чтение из файла, и один или ни один из них не записывает в файл.

Оппортунистическая блокировка пакетной службы

На следующей схеме показано представление сетевого трафика пакетной оппортунистической блокировки. Стрелки указывают направление перемещения данных, если таковые есть.

Событие Клиент X Сервер Клиент Y
1 Открывает файл, запрашивает пакетную блокировку ==>
2 <== Предоставляет пакетную оппортунистическую блокировку
3 Считывает файл ==>
4 <== Отправляет данные
5 Закрывает файл
6 Открывает файл
7 Поиск данных
8 Считывает данные ==>
9 <== Отправляет данные
10 Закрывает файл
11 <== Открывает файл
12 <== Нарушает оппортунистическую блокировку
13 Закрывает файл ==>
14 Хорошо открытая операция ==>
15 <== Выполняет операции чтения, записи и других операций.

 

При пакетной оппортунистической блокировке клиент X открывает файл, событие 1, а сервер предоставляет клиенту X пакетную блокировку в случае 2. Клиент X пытается прочитать данные, событие 3, на которое сервер отвечает данными, событие 4.

Событие 5 показывает, что пакетная оппортунистическая блокировка работает. Приложение на клиенте X закрывает файл. Однако перенаправитель сети отфильтровывает операцию закрытия и не передает сообщение о закрытии, тем самым выполняя "автоматическое" закрытие. Перенаправитель сети может сделать это, так как клиент X является единственным владельцем файла. Позже, в случае 6, приложение повторно откроет файл. Опять же, нет потоков данных по сети. Что касается сервера, этот клиент был открыт после события 2.

События 7, 8 и 9 показывают обычный курс сетевого трафика. В случае 10 происходит еще одно автоматическое закрытие.

В случае 11 клиент Y пытается открыть файл. Серверное представление файла показывает, что клиент X открывает его, даже если приложение на клиенте X закрыло его. Таким образом, сервер отправляет клиенту X сообщение о нарушении оппортунистической блокировки. Клиент X теперь отправляет сообщение о закрытии по сети, событие 13. После этого следует событие 14, когда сервер открывает файл для клиента Y. Приложение на клиенте X закрыло файл, поэтому оно больше не выполняет передачу на сервер или с сервера для этого файла. Клиент Y начинает передачу данных обычным образом в случае 15.

Между предоставлением клиенту X блокировки файла в случае 2 и окончательным закрытием в событии 13 все данные файла, кэшированные клиентом, являются допустимыми, несмотря на операции открытия и закрытия промежуточных приложений. Однако после того, как оппортунистическая блокировка будет нарушена, кэшированные данные нельзя считать допустимыми.

Фильтрация оппортунистических блокировок

На следующей схеме показано представление сетевого трафика с оппортунистической блокировкой фильтра. Стрелки указывают направление перемещения данных, если таковые есть.

Событие Клиент X Сервер Клиент Y
1 Открывает файл без прав доступа ==>
2 <== Открывает файл
3 Запросы filter lock==>
4 <== Grant lock
5 Открывает файл для чтения ==>
6 <== Повторное открытие файла
7 Считывает данные с помощью дескриптора чтения ==>
8 <== Отправляет данные
9 <== Отправляет данные
10 <== Отправляет данные
11 <== Открывает файл
12 Открывает файл ==>
13 <== Блокировка фильтра запросов
14 Запрет фильтра lock==>
15 <== Считывает данные
16 Отправляет данные ==>
17 Считывает (кэшированные) данные
18 Закрывает файл ==>
19 <== Закрытие файла

 

В фильтре оппортунистической блокировки клиент X открывает файл, событие 1, и сервер отвечает в случае 2. Затем клиент запрашивает оппортунистическую блокировку фильтра в событии 3, а затем сервер предоставляет оппортунистическую блокировку в событии 4. Затем клиент X снова открывает файл для чтения в событии 5, на который сервер отвечает в событии 6. Затем клиент пытается прочитать данные, на которые сервер отвечает данными, событие 8.

В событии 9 показана оппортунистическая блокировка фильтра. Сервер считывает данные впереди клиента и отправляет данные по сети, даже если клиент не запрашивал их. Клиент кэширует данные. В случае 10 сервер также ожидает будущий запрос данных и отправляет другую часть файла для клиента в кэш.

В случае 11 и 12 другой клиент, Y, открывает файл. Клиент Y также запрашивает оппортунистическую блокировку фильтра. В случае 14 сервер отклоняет его. В случае 15 клиент Y запрашивает данные, которые сервер отправляет в событии 16. Ни одно из этих действий не влияет на клиент X. В любой момент другой клиент может открыть этот файл для чтения. Ни один другой клиент не влияет на блокировку фильтра клиента X.

Событие 17 показывает, что клиент X считывает данные. Однако, так как сервер уже отправил данные, а клиент кэшировал их, трафик не пересекает сеть.

В этом примере клиент X никогда не пытается прочитать все данные в файле, поэтому упреждающее чтение, указанное событиями 9 и 10, является "впустую"; то есть данные никогда не используются. Это приемлемая потеря, так как упреждающее чтение ускорило работу приложения.

В случае 18 клиент X закрывает файл. Перенаправитель сети клиента отказывается от кэшированных данных. Сервер закрывает файл.