CLFS 封送区域

通用日志文件系统 (CLFS) 客户端将日志记录追加到易失内存中的 封送区 ,CLFS 定期将这些记录写入稳定存储。 封送处理区域是日志 I/O 缓冲区的集合,每个缓冲区可以保存多个日志记录。 日志 I/O 缓冲区保存最近写入流 (但可能不会刷新到稳定存储) 的记录,以及最近从流中读取的记录。

通过调用 ClfsCreateMarshallingArea 创建封送区域,此时必须指定封送处理区域将使用的日志 I/O 缓冲区的大小,以及这些缓冲区是位于分页池中还是非分页池中。 封送处理区域中的所有日志 I/O 缓冲区的大小相同,CLFS 可确保该大小是基础稳定存储介质上的扇区大小的倍数。 也就是说,CLFS 会获取请求的大小,并根据需要对其进行舍入,以使 I/O 缓冲区与稳定的存储介质兼容。

CLFS 会根据需要分配和释放日志 I/O 缓冲区,但你可以选择设置一次可以分配的最大 I/O 缓冲区数。 还可以选择提供自己的缓冲区分配和解除分配函数。

若要指定一次可以分配用于写入日志记录的最大日志 I/O 缓冲区数,请设置 ClfsCreateMarshallingArea 函数的 cMaxWriteBuffers 参数。 限制缓冲区数会影响刷新到稳定存储的频率:在缓冲区较少的情况下,必须更频繁地将日志记录写入稳定的存储。 如果不需要控制刷新频率,请将 cMaxWriteBuffers 设置为 WINbase.h) 中定义的 INFINITE (。

若要指定一次可以分配用于读取日志记录的最大日志 I/O 缓冲区数,请设置 ClfsCreateMarshallingArea 函数的 cMaxReadBuffers 参数。 如果不需要控制分配的读取缓冲区数,请将 cMaxReadBuffers 设置为 INFINITE。

如果要为日志 I/O 缓冲区执行自己的内存分配,请将 ClfsCreateMarshallingArea 函数的 pfnAllocBufferpfnFreeBuffer 参数设置为指向你自己的分配和解除分配函数。 然后,每当需要创建或释放日志 I/O 缓冲区时,CLFS 都会调用函数来执行实际的内存分配和解除分配。

在某些情况下,可能需要提前在封送区域中预留空间。 例如,你可能知道要写入一组 10 条日志记录,并且需要确保封送区域中有足够的空间供整个记录集使用。 若要为 10 条记录保留空间,请创建一个包含 10 个元素的数组来保存记录的大小,然后将该数组传递到 rgcbReservation 参数中的 ClfsReserveAndAppendLog 函数。 ClfsReserveAndAppendLog 是一个多用途函数,可在封送处理区域中保留空间,或将日志记录追加到流中,或者以原子方式执行这两项操作。 通过适当设置参数,可以调用 ClfsReserveAndAppendLog 来保留空间供将来使用,而无需实际将任何记录追加到流中。