fix: ensure vote packets can be retried#2605
Conversation
|
Backports to the stable branch are to be avoided unless absolutely necessary for fixing bugs, security issues, and perf regressions. Changes intended for backport should be structured such that a minimum effective diff can be committed separately from any refactoring, plumbing, cleanup, etc that are not strictly necessary to achieve the goal. Any of the latter should go only into master and ride the normal stabilization schedule. |
|
Backports to the beta branch are to be avoided unless absolutely necessary for fixing bugs, security issues, and perf regressions. Changes intended for backport should be structured such that a minimum effective diff can be committed separately from any refactoring, plumbing, cleanup, etc that are not strictly necessary to achieve the goal. Any of the latter should go only into master and ride the normal stabilization schedule. Exceptions include CI/metrics changes, CLI improvements and documentation updates on a case by case basis. |
cc63f99 to
7782a79
Compare
7782a79 to
6c3b3d5
Compare
(cherry picked from commit ecb44d7) # Conflicts: # core/src/banking_stage/latest_unprocessed_votes.rs
(cherry picked from commit ecb44d7)
| match slot.cmp(&latest_vote.slot()) { | ||
| cmp::Ordering::Less => return false, | ||
| cmp::Ordering::Greater => return true, | ||
| cmp::Ordering::Equal => {} | ||
| }; | ||
|
|
||
| // Slots are equal, now check timestamp | ||
| match timestamp.cmp(&latest_vote.timestamp()) { | ||
| cmp::Ordering::Less => return false, | ||
| cmp::Ordering::Greater => return true, | ||
| cmp::Ordering::Equal => {} | ||
| }; |
There was a problem hiding this comment.
nit: can be combined with match (slot, timestamp).cmp((...)) { ... } maybe?
There was a problem hiding this comment.
That's neat. I'm satisfied with the less elegant way though :)
Problem
Retryable vote packets are not retried so any votes received at the end of a block won't ever get processed by the current leader leading to higher voting latency
This is because when we try to reinsert retryable vote tx packets, the reinserted vote tx's will have timestamps equal to but not greater than the latest stored vote tx's timestamp. So the "taken" vote packet never gets replenished.
Summary of Changes
Allow replacing existing latest votes when the latest vote is "taken" and the slot and timestamps are equivalent to the replaced vote.
Fixes #