海山数据库(He3DB)源码详解:主备复制SyncRepWaitForLSN
背景
He3DB 采用了先进的存储引擎和查询优化技术,能够快速处理大量数据和复杂查询。无论是 OLTP(在线事务处理)还是 OLAP(在线分析处理)场景,都能提供出色的性能表现。He3DB 具备完善的数据备份和恢复机制,能够在系统故障或数据损坏时快速恢复数据,确保业务的连续性。He3DB 支持水平扩展和垂直扩展,可以轻松应对不断增长的数据需求。He3DB 提供了严格的访问控制和数据加密功能,确保数据的安全性和隐私性。
本文基于He3DB,针对主备复制模块进行源码解读分享
流复制——SyncRepWaitForLSN
SyncRepWaitForLSN
主要用于同步复制中的等待特定预写日志(Write-Ahead Log,WAL)位置的处理。
- 前期检查与准备
确保在事务提交期间持有中断,防止后续共享内存队列清理受到外部中断影响
快速退出条件检查:
如果用户未请求同步复制(!SyncRepRequested()
)或者没有定义同步复制备用节点名称(!((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_defined
),则直接返回
根据提交状态调整同步复制等待模式
void
SyncRepWaitForLSN(XLogRecPtr lsn, bool commit)
{
char *new_status = NULL;
const char *old_status;
int mode;
Assert(InterruptHoldoffCount > 0);
if (!SyncRepRequested() ||
!((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_defined)
return;
/* Cap the level for anything other than commit to remote flush only. */
if (commit)
mode = SyncRepWaitMode;
else
mode = Min(SyncRepWaitMode, SYNC_REP_WAIT_FLUSH);
Assert(SHMQueueIsDetached(&(MyProc->syncRepLinks)));
Assert(WalSndCtl != NULL);