Примеры оппортунистических блокировок
В следующих примерах показаны перемещения данных и сообщений 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 закрывает файл. Перенаправитель сети клиента отказывается от кэшированных данных. Сервер закрывает файл.