Neon walproposer进程状态机

📅 2026/7/18 5:38:06 👁️ 阅读次数 📝 编程学习
Neon walproposer进程状态机

WAL Proposer 完整状态机

全局状态:wp->state(WalProposerState)

WPS_COLLECTING_TERMS → WPS_CAMPAIGN → WPS_ELECTED 收集握手/term 投票中 已当选,开始流复制

每个 Safekeeper 状态:sk->state(SafekeeperState)

┌──────────────────────────────────────────┐ │ 任何状态出错 → ShutdownConnection │ │ ↓ SS_OFFLINE │ │ ReconnectSafekeepers (每1s) │ │ ↓ ResetConnection │ └──────────────────────────────────────────┘ SS_OFFLINE ──ResetConnection──→ SS_CONNECTING_WRITE │ │ │ conn_connect_poll() │ │ │ ┌──────────────┼──────────────┐ │ ↓ ↓ ↓ │ POLLING_WRITING POLLING_READING POLLING_OK │ SS_CONNECTING_ SS_CONNECTING_ │ │ WRITE READ │ │ │ │ │ │ └── poll() ────┘ │ │ ↓ │ SendStartWALPush() │ │ │ ↓ │ SS_WAIT_EXEC_RESULT │ │ │ conn_get_query_result() │ │ │ ↓ COPYBOTH成功 │ SendProposerGreeting() │ │ [消息: ProposerGreeting 'g'] │ ↓ │ SS_HANDSHAKE_RECV │ │ │ AsyncReadMessage() → greetResponse │ │ │ ↓ │ SS_WAIT_VOTING (idle, 等待quorum) │ │ │ TermsCollected() → WPS_CAMPAIGN │ SendVoteRequest() │ │ [消息: VoteRequest 'v'] │ ↓ │ SS_WAIT_VERDICT │ │ │ AsyncReadMessage() → voteResponse │ │ │ VotesCollected() → WPS_ELECTED │ HandleElectedProposer() │ │ │ ↓ │ SS_WAIT_ELECTED (idle) │ │ │ SendProposerElected() [消息: ProposerElected 'e'] │ │ │ ↓ │ SS_SEND_ELECTED_FLUSH │ │ │ AsyncFlush() → OK │ │ │ StartStreaming() │ │ │ ↓ │ SS_ACTIVE ←── 流复制/心跳阶段 │ │ │ ┌───────────┼───────────┐ │ ↓ ↓ ↓ │ SS_ACTIVE_ SS_ACTIVE_ SS_ACTIVE_ │ SEND READ_WAL FLUSH │ │ │ │ └──── 循环 ──────────────┘ │ └── 超时/断连后回到 SS_OFFLINE,重新开始

消息流与处理函数对照表

阶段sk→wp 消息wp→sk 消息入口函数sk->state 变化
连接--ResetConnectionOFFLINE → CONNECTING_WRITE
TCP握手--HandleConnectionEventCONNECTING_* → (polling)
START_WAL_PUSH-SQL querySendStartWALPushCONNECTING_* → WAIT_EXEC_RESULT
执行结果CopyBoth响应-RecvStartWALPushResultWAIT_EXEC_RESULT → HANDSHAKE_RECV
握手-'g'GreetingSendProposerGreetingHANDSHAKE_RECV
握手响应'g'Greeting-RecvAcceptorGreetingHANDSHAKE_RECV → WAIT_VOTING
投票开始-'v'VoteRequestSendVoteRequestWAIT_VOTING → WAIT_VERDICT
投票响应'v'VoteResponse-RecvVoteResponseWAIT_VERDICT → WAIT_ELECTED
宣布当选-'e'ProposerElectedSendProposerElectedWAIT_ELECTED → SEND_ELECTED_FLUSH
Flush--AsyncFlushStartStreamingSEND_ELECTED_FLUSH →SS_ACTIVE
WAL/心跳'a'AppendResponse'a'AppendRequestHandleActiveStateSS_ACTIVE 循环
断连--ShutdownConnection任意 →SS_OFFLINE

SS_ACTIVE 子状态循环

SS_ACTIVE_SEND ──SendAppendRequests()──→ SS_ACTIVE_READ_WAL ↑ │ │ wal_read() 读WAL │ │ │ conn_async_write() │ │ │ ┌───────────┼───────────┐ │ ↓ ↓ ↓ │ WRITE_SUCCESS TRY_FLUSH WRITE_FAIL │ │ │ │ │ SS_ACTIVE_SEND SS_ACTIVE ShutdownConnection │ │ _FLUSH ↓ │ │ │ SS_OFFLINE │ │ AsyncFlush() │ │ │ │ └────┬────┘ │ │ └──── 同时可接收 AppendResponse ──┘ RecvAppendResponses() → HandleSafekeeperResponse() → GetAcknowledgedByQuorumWALPosition() → commitLsn 推进 → BroadcastAppendRequest()

Global 状态转换(wp->state)

WPS_COLLECTING_TERMS │ 每收到一个 Greeting → 检查 TermsCollected() │ 条件: n_connected >= quorum (≥2) │ → 设置 propTerm, voteRequest ↓ WPS_CAMPAIGN │ 每收到一个 VoteResponse → 检查 VotesCollected() │ 条件: quorum 个 safekeeper 在 SS_WAIT_ELECTED │ → HandleElectedProposer() ↓ WPS_ELECTED │ 给所有 SS_WAIT_ELECTED 发 ProposerElected │ → StartStreaming → 进入 WAL 流复制 / 心跳阶段