Примеры оппортунистической блокировки
В следующих примерах показаны данные и движения сообщений 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 отправляет сообщение "закрыть" или "готово" на сервер, событие 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. Client X теперь отправляет близкое сообщение по сети, событие 13. Событие 14 следует, как сервер открывает файл для клиента Y. Приложение на клиенте X закрыло файл, поэтому он больше не передается на сервер или с сервера для этого файла. Клиент Y начинает передачу данных как обычно в случае 15.
Между временем клиент X предоставляет блокировку файла в событии 2 и окончательном закрытии в событии 13 любые данные файла, кэшированные клиентом, допустимы, несмотря на операции открытия и закрытия приложения. Однако после разрыва оппортунистической блокировки кэшированные данные нельзя считать допустимыми.
Фильтрация оппортунистической блокировки
На следующей схеме показан представление сетевого трафика для блокировки фильтра оппортунистической блокировки. Стрелки указывают направление перемещения данных, если таковые есть.
Событие | Клиент X | Сервер | Клиент Y |
---|---|---|---|
1 | Открывает файл без прав доступа ==> | ||
2 | <== Открывает файл | ||
3 | Запросы filter lock==> | ||
4 | <== Блокировка грантов | ||
5 | Открывает файл для чтения ==> | ||
6 | <== повторно открывает файл | ||
7 | Считывает данные с помощью дескриптора чтения ==> | ||
8 | <== Отправляет данные | ||
9 | <== Отправляет данные | ||
10 | <== Отправляет данные | ||
11 | <== Открывает файл | ||
12 | Открывает файл ==> | ||
13 | <== Блокировка фильтра запросов | ||
14 | Запрещает блокировку фильтра==> | ||
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 закрывает файл. Сетевой перенаправление клиента отказывается от кэшированных данных. Сервер закрывает файл.