-
Notifications
You must be signed in to change notification settings - Fork 5.9k
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
os/bluestore: More support for cleaning zones. #41919
Conversation
f2fd129
to
13f1e2b
Compare
@ifed01 please take a look and let me know what you think. I tried to address your comment from #38641 about making zone cleaning and database update atomic. @tchaikov it also contains some code from #41076 for which you wanted to see the use case. This PR makes use of this. Also, this PR builds on top of #41845, which @ifed01 has already approved (so it can be QA'ed and then merged). Thanks! |
61481bf
to
1512ebc
Compare
1512ebc
to
90355e0
Compare
i don't think the failures were related to this change. as i reran the failed tests without this change: |
@ifed01 just letting you know that the crimson reviewer request was added by mistake and they will not review it; please review when you get a chance. Thanks! |
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.
Overall LGTM. Suggest to add recovery code for the sake of completeness though...
Sorry, missed this. Replied to Sage to join for another meeting. |
Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
The protocol for cleaning zones is as follows: 1. The ZonedAllocator wakes up the cleaner thread. 2. The cleaner thread acquires the list of zones to clean 3. Cleaning multiple zones is not atomic; therefore, to support resuming the cleaning if crashed, the cleaner thread first persists the list of zones to clean as a value of a key "cleaning_in_progress_zones", by calling ZonedFreelistManager's mark_zones_to_clean_in_progress. 4. The cleaner thread then iterates over the zones and cleans zones by calling _zoned_clean_zone on each zone. The latter calls an operation _do_move on each live object on the zone that atomically moves an object from the cleaned zone to a new zone. (_do_move is to be implemented.) 5. Once all of the zones are cleaned, the cleaner thread calls reset_zones, which resets the write pointer within the physical zoned block device 6. Finally, it calls ZonedFreelistManager's mark_zones_to_clean_free method which in one atomic operation resets the write pointer of the cleaned zones in the db and deletes the key "cleaning_in_progress_zones", that is, the list of zones to be cleaned recorded in step 3. A crash between or within any of these steps will leave the system in consistent state. Specifically, each zone will either be completely cleaned, or partially cleaned, or not cleaned. A recovery code will need to check for the existence of the "cleaning_in_progress_zones" key and if found, it will resume cleaning zones where it left off. It is possible that if we crash between steps 5 and 6, or within step 5, we end resetting the write pointer within the physical zoned block device multiple times, but that's okay because the latter is an idempotent operation. Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
… pointer. Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
…ne by one. Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
90355e0
to
9802a25
Compare
…f zones recorded as being cleaned in the database. Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
Added the recovery code, although not confident if it is the ideal place for it. Please let me know what you think. Thanks! |
@agayev |
Checklist
Show available Jenkins commands
jenkins retest this please
jenkins test classic perf
jenkins test crimson perf
jenkins test signed
jenkins test make check
jenkins test make check arm64
jenkins test submodules
jenkins test dashboard
jenkins test api
jenkins test docs
jenkins render docs
jenkins test ceph-volume all
jenkins test ceph-volume tox