-
Notifications
You must be signed in to change notification settings - Fork 5.5k
blockstore: write only dirty erasure meta and merkle root metas #34269
blockstore: write only dirty erasure meta and merkle root metas #34269
Conversation
e149f88 to
4f95a50
Compare
Codecov ReportAttention:
Additional details and impacted files@@ Coverage Diff @@
## master #34269 +/- ##
=======================================
Coverage 81.8% 81.8%
=======================================
Files 824 824
Lines 222128 222151 +23
=======================================
+ Hits 181742 181789 +47
+ Misses 40386 40362 -24 |
ledger/src/blockstore.rs
Outdated
| fn try_shred_recovery( | ||
| &self, | ||
| erasure_metas: &HashMap<ErasureSetId, ErasureMeta>, | ||
| erasure_metas: &HashMap<ErasureSetId, (ErasureMeta, bool)>, |
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.
Can we use an enum instead of bool? something like
enum Wrapper<T> {
New(T),
Old(T),
}4f95a50 to
a9701c4
Compare
ledger/src/blockstore.rs
Outdated
| Dirty(T), | ||
| Clean(T), |
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.
Can you please add a comment here what each represents?
Clean means we read from blockstore, right?
Dirty means it should be stored to blockstore?!
ledger/src/blockstore.rs
Outdated
| fn unwrap(&self) -> &T { | ||
| match self { | ||
| Self::Dirty(value) => value, | ||
| Self::Clean(value) => value, | ||
| } | ||
| } |
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.
This seems a confusing overload of unwrap.
Can we instead implement From?
https://doc.rust-lang.org/std/convert/trait.From.html
something like:
impl<T> From<WorkingStatus<T>> for T { ...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.
I can't implement From as it violates the orphan rule. I've changed the names a bit to WorkingEntry and fn value hopefully that's less confusing.
a9701c4 to
28d7a20
Compare
ledger/src/blockstore.rs
Outdated
| /// Returns a reference to the underlying value | ||
| fn value(&self) -> &T { | ||
| match self { | ||
| Self::Dirty(value) => value, | ||
| Self::Clean(value) => value, | ||
| } | ||
| } |
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.
This could implement AsRef instead:
https://doc.rust-lang.org/std/convert/trait.AsRef.html
28d7a20 to
bf107c9
Compare
| write_batch.put::<cf::ErasureMeta>((slot, u64::from(fec_set_index)), &erasure_meta)?; | ||
| write_batch.put::<cf::ErasureMeta>( | ||
| (slot, u64::from(fec_set_index)), | ||
| working_erasure_meta.as_ref(), |
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.
I think you can just write & working_erasure_meta.
& will do the .as_ref().
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.
hmm it doesn't seem to work it only recognizes it as a &WorkingEntry<ErasureMeta>
Problem
We commit the in memory maps to blockstore every iteration which results in a lot of rewrites.
Summary of Changes
Explicitly track which entries are dirty and only commit those.
Contributes to #33644