Поделиться через


Стабильное хранилище CLFS

При записи записи в поток CLFS запись помещается в блок ввода-вывода журнала (в области маршалинга) в энергонезависимой памяти. Время от времени CLFS сбрасывает блоки ввода-вывода журнала из области маршалинга в стабильное хранилище, например диск. На стабильном устройстве хранения журнал состоит из набора контейнеров, каждый из которых является непрерывным экстентом на физическом носителе. Коллекция контейнеров, образующая стабильное хранилище для потока, называется журналом или физическим журналом.

На следующем рисунке показан контейнер.

схема, иллюстрирующая контейнеры, блоки и записи.

На предыдущем рисунке показан контейнер, содержащий три блока ввода-вывода журнала. Первый блок ввода-вывода журнала содержит три записи, второй — пять, третий — две записи. Как показано на рисунке, начало каждого блока ввода-вывода журнала всегда совпадает с началом сектора на стабильном носителе. Обратите внимание, что блоки ввода-вывода журнала в стабильном хранилище различаются по размеру.

CLFS использует набор из трех чисел для поиска записи в журнале.

  • Идентификатор контейнера идентифицирует контейнер, в котором хранится запись.

  • Смещение блока дает байтовое смещение в контейнере начала блока ввода-вывода журнала, в котором хранится запись.

  • Порядковый номер записи идентифицирует запись в блоке ввода-вывода журнала.

Номер LSN записи журнала CLFS фактически содержит три элемента информации: идентификатор контейнера, смещение блока и порядковый номер записи. Однако имена LSN, предоставленные клиентам журналов, содержат логические идентификаторы контейнеров , которые CLFS должны сопоставить с физическими идентификаторами контейнеров, прежде чем получить доступ к записям в стабильном хранилище.

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

Предположим, что журнал содержит три контейнера, и один клиент записывает записи CLFS в журнал. В следующем сценарии показано, как можно перезаработать контейнер.

  1. Клиент записывает достаточно записей журнала для заполнения всех трех контейнеров.

  2. Клиент задает базу журнала (путем вызова ClfsAdvanceLogBase или ClfsWriteRestartArea.) одной из записей в контейнере 2. Таким образом, клиент говорит, что ему больше не нужны записи в контейнере 1.

  3. Клиент записывает в журнал еще одну запись и возвращает номер LSN новой записи. Идентификатор логического контейнера в этом номере LSN — 4. Когда записи сбрасываются в стабильное хранилище, записи, которые клиент видит в логическом контейнере 4, будут отправляться в физический контейнер 1.

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

схема, иллюстрирующая логические и физические контейнеры.

Идентификатор логического контейнера, смещение блока и порядковый номер записи хранятся в номере LSN таким образом, чтобы номера LSN для определенного потока всегда формировали строго увеличивающуюся последовательность. Это значит, что номер LSN (с идентификатором логического контейнера) записи журнала, записанной в поток, всегда больше LSN записей журнала, ранее записанных в тот же поток. LSN служат двойной цели: 1) они предоставляют клиентам потока упорядоченную последовательность идентификаторов записей и 2) предоставляют CLFS расположение записей в стабильном хранилище.

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

ClfsLsnContainer

ClfsLsnBlockOffset

ClfsLsnRecordSequence

Идентификатор логического контейнера является 32-разрядным числом, поэтому существует 2^32 возможных идентификаторов логических контейнеров, и они находятся в диапазоне 0x0 по 0xFFFFFFFF. Поток может содержать не более 2^32 логических контейнеров.

Смещение блока хранится в 23 битах LSN, но ClfsLsnBlockOffset возвращает 32-разрядное число, соответствующее размеру сектора стабильной среды хранения. Смещение блока всегда кратно 512. Кроме того, смещение блока выравнивается с размером сектора стабильного носителя хранилища. Например, если размер сектора составляет 1024 байта, смещение блока будет кратно 1024.

Порядковый номер записи является 9-разрядным числом, поэтому существует 2^9 (512) возможных порядковых номеров записей, и они находятся в диапазоне от 0x0 до 0x1FF. Блок ввода-вывода журнала может содержать не более 512 записей.