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


Запись записей данных в поток CLFS

В потоке общей файловой системы журналов (CLFS) существует два типа записей: записи данных и записи перезапуска. В этом разделе объясняется, как записывать записи данных в поток. Сведения о записи записей перезапуска см. в разделе Запись записей перезапуска в поток CLFS.

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

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

Для всех вариантов записи записей данных выполните следующие действия.

  1. Создайте массив из одной или нескольких CLFS_WRITE_ENTRY структур. Каждая структура записи указывает на буфер, заполненный данными записи.

  2. Вызовите ClfsReserveAndAppendLog или ClfsReserveAndAppendLogAligned.

В таблицах в следующих подразделах показано, как задать параметры ClfsReserveAndAppendLog для нескольких вариантов записи записи в поток.

Запись одного буфера данных в поток

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

Имя параметра Значение

pvMarshalContext

Указатель на область маршалинга.

rgWriteEntries

Указатель на структуру CLFS_WRITE_ENTRY .

cWriteEntries

1

plsnUndoNext

CLFS_LSN_INVALID

plsnPrevious

CLFS_LSN_INVALID

cReserveRecords

0

rgcbReservation

NULL

fFlags

0

plsn

Указатель на структуру CLFS_LSN . (Это выходной параметр, который получает номер LSN записываемой записи.)

Резервирование пространства для набора записей журнала CLFS

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

Имя параметра Значение

pvMarshalContext

Указатель на область маршалинга.

rgWriteEntries

NULL

cWriteEntries

0

plsnUndoNext

CLFS_LSN_INVALID

plsnPrevious

CLFS_LSN_INVALID

cReserveRecords

Количество элементов в массиве, на который указывает rgcbReservation.

rgcbReservation

Указатель на массив переменных типа LONGLONG. Каждый элемент в массиве — это размер (в байтах) записи, для которой будет зарезервировано пространство. Обратите внимание, что это размер части данных записи; Вам не нужно включать размер заголовков или заполнения.

fFlags

0

plsn

NULL

Примечание Еще один способ резервирования пространства в области маршалинга — вызвать ClfsAlignReservedLog , а затем ClfsAllocReservedLog.

Запись записи в зарезервированное пространство

Предположим, вы уже зарезервировали пространство для трех записей, размер которых в байтах — 100, 200 и 300. Область маршалинга имеет зарезервированное число записей 3 и достаточно зарезервированного пространства для хранения 600 байт данных записи, заголовков записей и всех заполнения, необходимых для выравнивания.

Теперь предположим, что вы хотите записать одну из этих записей в зарезервированное пространство в области маршалинга. Доступное зарезервированное пространство будет сокращено, а число зарезервированных записей уменьшится с 3 до 2. В следующей таблице показано, как задать параметры при вызове ClfsReserveAndAppendLog.

Имя параметра Значение

pvMarshalContext

Указатель на область маршалинга.

rgWriteEntries

Указатель на массив CLFS_WRITE_ENTRY структур.

cWriteEntries

Количество элементов в массиве, на который указывает rgWriteEntries.

plsnUndoNext

CLFS_LSN_INVALID или номер LSN предыдущей записи в цепочке отмены. Дополнительные сведения о цепочке отмены см. в разделе Порядковые номера журналов CLFS.

plsnPrevious

CLFS_LSN_INVALID или номер LSN предыдущей записи журнала в цепочке предыдущих LSN. Дополнительные сведения о цепочке предыдущих LSN см. в разделе Порядковые номера журналов CLFS.

cReserveRecords

0

rgcbReservation

NULL

fFlags

CLFS_FLAG_USE_RESERVATION

plsn

Указатель на структуру CLFS_LSN . (Это выходной параметр, который получает номер LSN записываемой записи.)

Запись записей с выровненными записями

Предположим, вы хотите написать запись с тремя записями записи записи. Размер записей записи варьируется от 300 до 500 байт, но требуется, чтобы каждая запись записи начинались с 512-байтовой границы. В следующей таблице показано, как задать параметры функции ClfsReserveAndAppendLogAligned .

Имя параметра Значение

pvMarshalContext

Указатель на область маршалинга.

rgWriteEntries

Указатель на массив из трех CLFS_WRITE_ENTRY структур.

cWriteEntries

3

cbEntryAlignment

512

plsnUndoNext

CLFS_LSN_INVALID или номер LSN предыдущей записи в цепочке отмены. Дополнительные сведения о цепочке отмены см. в разделе Порядковые номера журналов CLFS.

plsnPrevious

CLFS_LSN_INVALID или номер LSN предыдущей записи журнала в цепочке предыдущих LSN. Дополнительные сведения о цепочке предыдущих LSN см. в разделе Порядковые номера журналов CLFS.

cReserveRecords

0

rgcbReservation

NULL

fFlags

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

plsn

Указатель на структуру CLFS_LSN. (Это выходной параметр, который получает номер LSN записываемой записи.)

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