mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-05 20:42:54 +00:00
Fix commit_lsn monotonicity violation.
On ProposerElected message receival WAL is truncated at streaming point; this code expected that, once vote is given for the proposer / term switch happened, flush_lsn can be advanced only by this proposer (or higher one). However, that didn't take into account possibility of accumulating written WAL and flushing it after vote is given -- flushing goes without term checks. Which eventually led to the violation in question. ref #2048
This commit is contained in:
@@ -637,6 +637,17 @@ where
|
||||
&mut self,
|
||||
msg: &VoteRequest,
|
||||
) -> Result<Option<AcceptorProposerMessage>> {
|
||||
// Once voted, we won't accept data from older proposers; flush
|
||||
// everything we've already received so that new proposer starts
|
||||
// streaming at end of our WAL, without overlap. Currently we truncate
|
||||
// WAL at streaming point, so this avoids truncating already committed
|
||||
// WAL.
|
||||
//
|
||||
// TODO: it would be smoother to not truncate committed piece at
|
||||
// handle_elected instead. Currently not a big deal, as proposer is the
|
||||
// only source of WAL; with peer2peer recovery it would be more
|
||||
// important.
|
||||
self.wal_store.flush_wal()?;
|
||||
// initialize with refusal
|
||||
let mut resp = VoteResponse {
|
||||
term: self.state.acceptor_state.term,
|
||||
|
||||
Reference in New Issue
Block a user