-
Notifications
You must be signed in to change notification settings - Fork 35
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
feat: iavl async pruning #593
Conversation
WalkthroughThe updates introduce enhanced control over committing operations across various store components in a blockchain context. A significant addition is the asynchronous pruning option for IAVL trees, aimed at improving performance. Methods for marking the store's committing status have been uniformly added across different store types, ensuring a consistent approach to handling the committing phase. This includes preparatory and concluding actions surrounding the commit operations, with test adjustments to accommodate the changes. Changes
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
time.Sleep(150 * time.Millisecond) | ||
ms.Commit() |
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.
Avoid using time.Sleep
in tests as it can introduce flakiness and increase test execution time.
- time.Sleep(150 * time.Millisecond)
+ // Suggestion: Find a more reliable method to simulate delays than using time.Sleep.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
time.Sleep(150 * time.Millisecond) | |
ms.Commit() | |
// Suggestion: Find a more reliable method to simulate delays than using time.Sleep. | |
ms.Commit() |
rs.SetCommitting() | ||
rs.lastCommitInfo = commitStores(version, rs.stores, rs.removalMap) | ||
rs.UnsetCommitting() |
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.
Consider adding error handling for SetCommitting
and UnsetCommitting
methods within the Commit
method to ensure robustness in case these operations fail.
- rs.SetCommitting()
+ if err := rs.SetCommitting(); err != nil {
+ return types.CommitID{}, err
+ }
- rs.UnsetCommitting()
+ if err := rs.UnsetCommitting(); err != nil {
+ return types.CommitID{}, err
+ }
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
rs.SetCommitting() | |
rs.lastCommitInfo = commitStores(version, rs.stores, rs.removalMap) | |
rs.UnsetCommitting() | |
if err := rs.SetCommitting(); err != nil { | |
return types.CommitID{}, err | |
} | |
rs.lastCommitInfo = commitStores(version, rs.stores, rs.removalMap) | |
if err := rs.UnsetCommitting(); err != nil { | |
return types.CommitID{}, err | |
} |
func (rs *Store) SetCommitting() { | ||
for _, store := range rs.stores { | ||
store.SetCommitting() | ||
} | ||
} | ||
|
||
// UnsetCommitting implements Committer/CommitStore. | ||
func (rs *Store) UnsetCommitting() { | ||
for _, store := range rs.stores { | ||
store.UnsetCommitting() | ||
} |
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.
Implement error handling within the SetCommitting
and UnsetCommitting
methods to ensure that all stores successfully transition their committing status. Accumulate errors and return them if any occur.
func (rs *Store) SetCommitting() error {
+ var errAccum error
for _, store := range rs.stores {
- store.SetCommitting()
+ if err := store.SetCommitting(); err != nil {
+ errAccum = multierror.Append(errAccum, err)
+ }
}
+ return errAccum
}
func (rs *Store) UnsetCommitting() error {
+ var errAccum error
for _, store := range rs.stores {
- store.UnsetCommitting()
+ if err := store.UnsetCommitting(); err != nil {
+ errAccum = multierror.Append(errAccum, err)
+ }
}
+ return errAccum
}
Note: This change assumes the existence of a multierror package to accumulate errors. If not available, consider implementing a similar mechanism or handling errors appropriately.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
func (rs *Store) SetCommitting() { | |
for _, store := range rs.stores { | |
store.SetCommitting() | |
} | |
} | |
// UnsetCommitting implements Committer/CommitStore. | |
func (rs *Store) UnsetCommitting() { | |
for _, store := range rs.stores { | |
store.UnsetCommitting() | |
} | |
func (rs *Store) SetCommitting() error { | |
var errAccum error | |
for _, store := range rs.stores { | |
if err := store.SetCommitting(); err != nil { | |
errAccum = multierror.Append(errAccum, err) | |
} | |
} | |
return errAccum | |
} | |
// UnsetCommitting implements Committer/CommitStore. | |
func (rs *Store) UnsetCommitting() error { | |
var errAccum error | |
for _, store := range rs.stores { | |
if err := store.UnsetCommitting(); err != nil { | |
errAccum = multierror.Append(errAccum, err) | |
} | |
} | |
return errAccum | |
} |
for _, store := range rs.stores { | ||
store.SetCommitting() | ||
} |
Check warning
Code scanning / CodeQL
Iteration over map Warning
for _, store := range rs.stores { | ||
store.UnsetCommitting() | ||
} |
Check warning
Code scanning / CodeQL
Iteration over map Warning
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 feat is going to be merged upstream. We tested against Osmosis v23 mainnet and it seems to have fixed the issue of nodes halting for pruning
* iavl async pruning * go mod tidy --------- Co-authored-by: Adam Tucker <[email protected]> (cherry picked from commit 0a12f99) # Conflicts: # go.mod # go.sum # simapp/go.mod # simapp/go.sum # store/iavl/store.go # tests/go.mod # tests/go.sum
* iavl async pruning * go mod tidy --------- Co-authored-by: Adam Tucker <[email protected]> (cherry picked from commit 0a12f99)
* iavl async pruning * go mod tidy --------- Co-authored-by: Adam Tucker <[email protected]> (cherry picked from commit 0a12f99)
* iavl async pruning * go mod tidy --------- Co-authored-by: Adam Tucker <[email protected]> (cherry picked from commit 0a12f99) Co-authored-by: cool-developer <[email protected]>
* iavl async pruning * go mod tidy --------- Co-authored-by: Adam Tucker <[email protected]> (cherry picked from commit 0a12f99) Co-authored-by: cool-developer <[email protected]>
* iavl async pruning * go mod tidy --------- Co-authored-by: Adam Tucker <[email protected]> go mod iavl v1.1.3
Description
SetCommitting
andUnsetCommitting
to block the pruning on the iavl sideAuthor Checklist
All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.
I have...
!
to the type prefix if API or client breaking changeCHANGELOG.md
Reviewers Checklist
All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.
I have...
!
in the type prefix if API or client breaking changeSummary by CodeRabbit
New Features
Tests