ReserveAndAppendLog 函数 (clfsw32.h)

为日志缓冲区保留空间,或将日志记录追加到日志中,或同时执行这两项操作。 函数是原子函数。

语法

CLFSUSER_API BOOL ReserveAndAppendLog(
  [in]                PVOID             pvMarshal,
  [in, optional]      PCLFS_WRITE_ENTRY rgWriteEntries,
  [in]                ULONG             cWriteEntries,
  [in, optional]      PCLFS_LSN         plsnUndoNext,
  [in, optional]      PCLFS_LSN         plsnPrevious,
  [in]                ULONG             cReserveRecords,
  [in, out, optional] LONGLONG []       rgcbReservation,
  [in]                ULONG             fFlags,
  [out, optional]     PCLFS_LSN         plsn,
  [in, out, optional] LPOVERLAPPED      pOverlapped
);

参数

[in] pvMarshal

指向使用 CreateLogMarshallingArea 函数分配的封送处理上下文的指针。

[in, optional] rgWriteEntries

指向要封送到一条记录中的 CLFS_WRITE_ENTRY 缓冲区数组的指针。

如果 cWriteEntries 参数为零,则忽略此参数。

[in] cWriteEntries

rgWriteEntries 数组中的写入条目数。

如果此值为非零值,则必须在 rgWriteEntries 参数中指定缓冲区。

[in, optional] plsnUndoNext

指向 CLFS_LSN 结构的指针,该结构指定撤消链中下一条记录的日志序列号 (LSN) 。

[in, optional] plsnPrevious

指向 CLFS_LSN 结构的指针,该结构指定上一条链中上一条记录的 LSN。

[in] cReserveRecords

rgcbReservation 数组中的记录大小数。

[in, out, optional] rgcbReservation

指向 cReserveRecords 参数指定的每个记录的预留大小的数组的指针。

如果 cReserveRecords 参数为零,则忽略此参数。 如果预留大小为负,则会释放该大小的预留。

为每条记录保留的实际空间(包括所需的开销)在成功完成后在各个数组元素中返回。 可以将这些值传递给 FreeReservedLog 函数,以调整封送处理区域中保留的空间。

[in] fFlags

指定此函数行为的标志。

可以组合以下一个或多个值。

含义
CLFS_FLAG_FORCE_APPEND
为日志中以前未分配物理位置的所有追加记录分配物理位置。

所有这些记录都可用于从其他封送上下文读取。

CLFS_FLAG_FORCE_FLUSH
为日志中以前未分配物理位置的所有追加记录分配物理位置。

所有这些记录都可用于从其他封送上下文读取。 然后,记录将刷新到磁盘。

CLFS_FLAG_NO_FLAGS
不分配任何标志。
CLFS_FLAG_USE_RESERVATION
使用封送处理区域中保留的空间追加当前记录。

[out, optional] plsn

指向接收追加记录的 LSN 的 CLFS_LSN 结构的指针。

[in, out, optional] pOverlapped

指向 OVERLAPPED 结构的指针。

如果未使用异步操作,此参数可以为 NULL

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 若要获得更多的错误信息,请调用 GetLastError 函数。

以下列表标识了可能的错误代码:

注解

ReserveAndAppendLog 函数返回的 LSN 不一定是使用的下一个 LSN。 返回的 LSN 是下一个 LSN 的估计值,它根据 fFlags 参数指定的标志而异。 移动基尾时,可以使用返回的 LSN。 此 LSN 因下一次调用此函数而失效。

如果 ReserveAndAppendLog 函数返回 ERROR_LOG_FILE_FULL,则日志中不再有空间。 可以通过以下方法之一解决此问题:

  • 释放任何不需要的预留。
  • 推进基本 LSN 或日志存档尾部,或同时推进两者,以回收容器。
  • 将容器添加到日志。
CLFS 管理 API 还提供了一种处理涉及完整日志的方案的方法。

如果使用有效的 pOverlapped 结构调用 ReserveAndAppendLog 函数,并且日志句柄是使用重叠选项创建的,则如果对此函数的调用失败并出现错误代码ERROR_IO_PENDING,则指向有效读取上下文的指针将放置在 ppvReadContext 参数指向的变量中。

若要完成日志记录复制,客户端应首先使用 GetOverlappedResult 函数或其中一个同步 Wait 函数将其执行与重叠 I/O 操作的延迟完成同步。 有关详细信息,请参阅 同步和重叠输入和输出

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 R2 [仅限桌面应用]
目标平台 Windows
标头 clfsw32.h
Library Clfsw32.lib
DLL Clfsw32.dll

另请参阅

CLFS_LSN

CLFS_WRITE_ENTRY

常见日志文件系统函数

OVERLAPPED