-
Notifications
You must be signed in to change notification settings - Fork 201
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice catch!
(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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: can be combined with match (slot, timestamp).cmp((...)) { ... }
maybe?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 #