Запись записей данных в поток CLFS
В потоке общей файловой системы журналов (CLFS) существует два типа записей: записи данных и записи перезапуска. В этом разделе объясняется, как записывать записи данных в поток. Сведения о записи записей перезапуска см. в разделе Запись записей перезапуска в поток CLFS.
Перед записью записей данных в поток CLFS необходимо создать область маршалинга, вызвав ClfsCreateMarshallingArea. Затем можно добавить записи в область маршалинга (которая находится в энергонезависимой памяти), и CLFS будет периодически сбрасывать записи в стабильное хранилище.
Существует несколько вариантов записи данных в поток. Например, можно заранее зарезервировать пространство, а затем записать несколько записей или записать записи без резервирования пространства. Вы можете запросить немедленное помещение записей, записываемых в область маршалинга, в стабильное хранилище или разрешить CLFS поместить записи в очередь в соответствии с политикой.
Для всех вариантов записи записей данных выполните следующие действия.
Создайте массив из одной или нескольких CLFS_WRITE_ENTRY структур. Каждая структура записи указывает на буфер, заполненный данными записи.
Вызовите 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 , чтобы зарезервировать место для записи и записать запись в поток. Пара действий (резервирования, записи) будет либо выполнена в целом, либо завершится сбоем как целое.