-
Notifications
You must be signed in to change notification settings - Fork 34
feat: add manual bucket release to prevent memory waste #386
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
Conversation
|
|
|
|
|
|
74613ac to
641624a
Compare
641624a to
acb1eb6
Compare
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…ble-structures into maksym/free-buckets-on-clear
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
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.
Pull Request Overview
This PR adds manual bucket release functionality to the MemoryManager to prevent memory waste when stable structures are cleared. The feature enables bucket reuse between different memory IDs after data migration scenarios.
- Implements
release_virtual_memory_buckets()method for manual bucket reclamation - Adds free bucket pool with FIFO reuse strategy for optimal memory locality
- Modifies bucket allocation logic to prioritize reusing free buckets over allocating new ones
Reviewed Changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/memory_manager.rs | Core implementation of bucket release functionality and free bucket pool management |
| src/memory_manager/bucket_release_core_tests.rs | Unit tests for basic bucket release operations and reuse verification |
| src/memory_manager/bucket_release_btreemap_tests.rs | Integration tests demonstrating migration scenarios with BTreeMap |
| benchmarks/io_chunks/canbench_results.yml | Minor benchmark instruction count increases due to additional bucket management logic |
| benchmarks/btreemap/canbench_results.yml | Minor benchmark instruction count increases due to additional bucket management logic |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
This PR reverts adding `reclaim_memory` method. Reverts several recent commits in a single change: - `6e397bd` fix: use conservative bucket reuse that survives reload #394 - `00468e1` docs: update memory reclamation examples in the docs #392 - `b911479` docs: cleanup documentation #391 - `d1fde89` docs: use reclaim_memory() name and update docs accordingly #388 - `a18917b` docs: add safety documentation and tests for manual bucket release #387 - `73e96e8` feat: add manual bucket release to prevent memory waste #386 This PR restores the codebase to the state before these commits. Done with `git revert -n 6e397bd 00468e1 b911479 d1fde89 a18917b 73e96e8` The reason for reverting this approach was that it can reclaim unused memory in theory but provides little benefit in real-world migrations. All due to the requirement to keep buckets in ascending order in each VM. Example 1: Reuse works ``` A allocates: [0, 4, 5] B allocates: [1, 2, 3] A frees: [0, 4, 5] B grows: can reuse bucket 4 (since 4 > max(B) = 3) B after grow: [1, 2, 3, 4] ``` Example 2: Reuse fails ``` A allocates: [0, 1, 2] B allocates: [4, 5, 6] A frees: [0, 1, 2] B grows: cannot reuse any freed bucket (all < max(B) = 6), so allocates new bucket 7 B after grow: [4, 5, 6, 7] ``` In real life when migrating state A to state B, state B created after state A grown, so it's first bucket ID is already higher than any free bucket in state A virtual memory, therefore can not be reused.
This PR adds
release_virtual_memory_buckets()to enable manual bucket reclamation when stable structures (BTreeMap,Vec) are cleared.Problem: Stable structures and MemoryManager operate independently - the memory manager allocates buckets but doesn't know when structures are cleared. When migrating data (A→B), clearing structure A doesn't automatically release its memory buckets, preventing structure B from reusing them and causing memory waste.
Solution: After clearing a stable structure, manually call
release_virtual_memory_buckets(memory_id)to release its buckets for reuse by other structures.Safety: Users must ensure the structure is fully cleared before releasing buckets. The memory manager provides no safety checks - releasing active buckets causes memory corruption.
Includes comprehensive tests demonstrating migration scenarios and verifying correct implementation.