C.3. Glocks

GFS2 принципиально отличается от других файловых систем тем, что в ней реализован механизм блокировки glocks. На уровне кода glock представляет собой структуру данных, объединяющую блокировку DLM с функциями кэширования в конечный автомат с одним состоянием. Каждый glock связан с одной блокировкой DLM, состояние которой хранится в кэше, чтобы в случае повторного обращения с того же узла не требовалось заново вызывать DLM. Блокировки glock подразделяются на две основных категории в зависимости от того, кэшируют ли они метаданные или нет. Так, блокировки индексных дескрипторов и групп ресурсов кэшируют метаданные. Более того, при блокировке дескрипторов кэшируются и обычные данные, что обуславливает довольно сложную логику этой блокировки.

Таблица C.1. Режимы блокировки glock и DLM

Режим glockРежим DLMОписание
UNIV/NLНе заблокировано (блокировка DLM не назначена или назначена в режиме NL, о чем свидетельствует установленный флаг «I»).
SHPRСовместный доступ (защищенное чтение).
EXEXМонопольная блокировка.
DFCWПараллельная запись. Используется для прямого ввода-вывода.
Glock остается в памяти до тех пор, пока он не будет освобожден (по запросу другого узла или виртуальной машины). После освобождения он будет удален из хэш-таблицы glock. В свою очередь, при создании glock изначально он не связан с блокировкой DLM, но как только будет сделан первый вызов к DLM, она будет назначена, о чем свидетельствует установленный флаг «I» (см. Таблица C.4, «Флаги glock»). Пока glock удерживается, блокировка DLM тоже будет удерживаться как минимум в состоянии NL (Null). Понижение статуса NL снимает блокировку DLM и выполняется только при освобождении glock.

Примечание

В Red Hat Enterprise Linux 5 снятие блокировки DLM, связанной с активным glock, не запрещалось. В Red Hat Enterprise Linux 6 это поведение изменилось вследствие интеграции модуля lock_dlm в GFS2, поэтому блокировка DLM освобождается одновременно с glock.
Один glock может обрабатывать несколько запросов с вышестоящих уровней файловой системы. В целях защиты критических секций кода, добавление запросов в очередь осуществляется через системные вызовы GFS2.
В основе реализации конечного автомата glock лежит рабочая очередь — workqueue. В интересах производительности лучше всего подошли бы микропотоки tasklet, однако в текущей реализации ввод-вывод обрабатывается в контексте, не допускающем их использование.

Примечание

Механизм workqueue использует свои события трассировки, которые можно комбинировать с обработчиками GFS2.
Таблица C.2, «Кэширование glock» показывает, в каких режимах glock разрешается кэширование и допускается использование несогласованного кэша. Это касается блокировок inode и групп ресурсов (хотя при блокировке групп ресурсов кэшируются только метаданные).

Таблица C.2. Кэширование glock

Режим glockДанныеМетаданныеНесогласованные данныеНесогласованные метаданные
UNнетнетнетнет
SHдаданетнет
DFнетданетнет
EXдададада