-
Notifications
You must be signed in to change notification settings - Fork 273
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: lazy pruning #898
feat: lazy pruning #898
Conversation
WalkthroughThe recent changes focus on enhancing synchronization and performance within a tree data structure, particularly through the introduction of lazy pruning, renaming methods for clarity on synchronous operations, and adjusting control flow in test scenarios. Major updates include the implementation of lazy pruning to improve commit flow efficiency, synchronization enhancements by renaming deletion methods, and modifications in node handling to support these improvements. These changes aim to address performance bottlenecks and improve the overall robustness of the system. Changes
Assessment against linked issues
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 (
|
// startPruning starts the pruning process. | ||
func (ndb *nodeDB) startPruning() { | ||
for { | ||
ndb.mtx.Lock() | ||
toVersion := ndb.pruneVersion | ||
ndb.mtx.Unlock() | ||
|
||
if toVersion == 0 { | ||
time.Sleep(100 * time.Millisecond) | ||
continue | ||
} | ||
|
||
if err := ndb.DeleteVersionsToSync(toVersion); err != nil { | ||
ndb.logger.Error("Error while pruning", "err", err) | ||
time.Sleep(1 * time.Second) | ||
continue | ||
} | ||
|
||
ndb.mtx.Lock() | ||
if ndb.pruneVersion <= toVersion { | ||
ndb.pruneVersion = 0 | ||
} | ||
ndb.mtx.Unlock() | ||
} | ||
} |
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.
The startPruning
method initiates the pruning process in a separate goroutine, continuously checking for versions to prune and calling DeleteVersionsToSync
accordingly. This implementation effectively decouples pruning from the commit process, allowing it to run asynchronously. However, it's crucial to monitor the performance and resource usage of this goroutine, especially in scenarios with frequent version updates or large datasets. Consider adding mechanisms to control the frequency of pruning checks or to pause/resume the pruning process based on system load or other criteria.
Consider adding mechanisms to control the pruning process more dynamically, such as adjusting the sleep duration based on system load or providing a way to pause/resume pruning based on external triggers.
The lazy pruning feature is not working properly since multi trees share the same db backend in store close in favor of #909 |
Implement the deferred pruning
Closes: #885
Fix
When the root refers to the legacy root, it will reformat the legacy node as a new node key format. This node is removed while pruning but it is still being referred by the forward version.
Another issue with the reference node, it can refer to the internal node, not only the root. For example, if there are no adds, just removes, then the leaf or inner node can be the root.
nodeKey
instead of only the version as a reference node valuenodeKey
to distinguish with the root. It will also be applied for the case of when pruning the version, reformat the given root nodeKey to (version, 0).