Neon walproposer进程状态机 WAL Proposer 完整状态机全局状态wp-stateWalProposerStateWPS_COLLECTING_TERMS → WPS_CAMPAIGN → WPS_ELECTED 收集握手/term 投票中 已当选开始流复制每个 Safekeeper 状态sk-stateSafekeeperState┌──────────────────────────────────────────┐ │ 任何状态出错 → 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_WRITETCP握手--HandleConnectionEventCONNECTING_* → (polling)START_WAL_PUSH-SQL querySendStartWALPushCONNECTING_* → WAIT_EXEC_RESULT执行结果CopyBoth响应-RecvStartWALPushResultWAIT_EXEC_RESULT → HANDSHAKE_RECV握手-gGreetingSendProposerGreetingHANDSHAKE_RECV握手响应gGreeting-RecvAcceptorGreetingHANDSHAKE_RECV → WAIT_VOTING投票开始-vVoteRequestSendVoteRequestWAIT_VOTING → WAIT_VERDICT投票响应vVoteResponse-RecvVoteResponseWAIT_VERDICT → WAIT_ELECTED宣布当选-eProposerElectedSendProposerElectedWAIT_ELECTED → SEND_ELECTED_FLUSHFlush--AsyncFlush→StartStreamingSEND_ELECTED_FLUSH →SS_ACTIVEWAL/心跳aAppendResponseaAppendRequestHandleActiveStateSS_ACTIVE 循环断连--ShutdownConnection任意 →SS_OFFLINESS_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-stateWPS_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 流复制 / 心跳阶段

本周精选

本月热点