将数据记录写入 CLFS 流

公共日志文件系统中有两种类型的记录 (CLFS) 流:数据记录和重启记录。 本主题说明如何将数据记录写入流。 有关如何写入重启记录的信息,请参阅 将重启记录写入 CLFS 流

必须先通过调用 ClfsCreateMarshallingArea 来创建封送区域,然后才能将数据记录写入 CLFS 流。 然后,可以将记录追加到位于易失性内存) (封送区域,CLFS 会定期将记录刷新到稳定存储。

将数据记录写入流有几个变化。 例如,可以提前预留空间,然后写入多个记录,或者可以写入记录而无需预留空间。 可以请求将写入封送区域的记录立即排队到稳定存储,也可以让 CLFS 根据其策略对记录进行排队。

对于写入数据记录的所有变体,请完成以下步骤。

  1. 创建一个或多个 CLFS_WRITE_ENTRY 结构的数组。 每个写入入口结构都指向已填充记录数据的缓冲区。

  2. 调用 ClfsReserveAndAppendLogClfsReserveAndAppendLogAligned

以下子部分中的表演示如何设置 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。 有关 previous-LSN 链的详细信息,请参阅 CLFS 日志序列号

cReserveRecords

0

rgcbReservation

Null

fFlags

指定刷新和预留首选项的标志的零个或某些组合。

plsn

指向CLFS_LSN 结构的指针。 (这是一个输出参数,用于接收写入的记录的 LSN。)

前面的表仅显示了保留记录空间和将记录写入 CLFS 流的许多变体中的少数。 在考虑其他变体时,请记住以下几点: ClfsReserveAndAppendLog (或 ClfsReserveAndAppendLogAligned) 执行的操作是原子操作。 例如,你可以对 ClfsReserveAndAppendLog 进行单个调用,该调用将为记录保留空间并将记录写入流。 两个操作 (保留、写入) 要么作为一个整体成功,要么作为一个整体失败。