-
Notifications
You must be signed in to change notification settings - Fork 6k
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
quincy: os/bluestore: Make truncate() drop unused allocations #60239
base: quincy
Are you sure you want to change the base?
quincy: os/bluestore: Make truncate() drop unused allocations #60239
Conversation
jenkins test make check |
This pull request can no longer be automatically merged: a rebase is needed and changes have to be manually resolved |
src/os/bluestore/BlueFS.cc
Outdated
uint64_t new_allocated; | ||
if (0 == cut_off) { | ||
// whole pextent to remove | ||
changed_extents = true; |
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.
shouldn't that be:
changed_extents = p != fnode.extents.end();
?
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.
No, because cutting tail for an extent is also a change.
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.
Not sure I'm getting this point.
When p ==fnode.extents.end() (and hence cut_off == 0) there is nothing to cut at the tail IMO. And hence there is no need to update the log etc... I can only imagine one case - when truncate effectively expands the fnode up to allocated boundary. And one needs to update fnode.size then. Do you mean this case?
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 might be missing something.
AAAABBBBCCCCDDDDEEEE
^case 1, remove B-E
AAAABBBBCCCCDDDDEEEE
^case 2, cut B, remove C-E
AAAABBBBCCCCDDDDEEEE
^case 3, whole B remains, remove C-E
So in case 1, cut_off == 0 but p!=fnode.extents.end().
The problem is different, and I think I get the confusion.
In case of p == fnode.extents.end()
the whole extent dropping part should be skipped altogether and no log updated.
@ifed01 ?
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.
Right, that's what I meant
src/os/bluestore/BlueFS.cc
Outdated
changed_extents = true; | ||
++p; | ||
} else { | ||
ceph_assert(cut_off >= p->length); |
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 should never happen given fnode.seek() implementation and
implicit p != fnode.extents.end() check above.
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.
May be replace with assert(false)?
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.
Right. This is else to cut_off < p->length
. At this point I would be checking a compiler.
Removed.
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 branch cannot be eliminated.
There are 3 distinct cases:
- extent we
seek
to is not used at all - we use some, but there is something to cut and release
- we use some and there is nothing to cut and release
I feel like separate codes for each case is the best solution.
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.
So case 3 is when cut_off is equal to p->length not "greater or equal"? I can't imagine why cut_off could be greater than p->length.
If so than the comment is confusing there.
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.
In normal case, we expect only cut_off == p->length.
In corruption case:
cut_off could be greater then p->length when the extent was not aligned to required allocation unit.
But in this case it should be assert.
So, how about ceph_assert(cut_off == p->length)
?
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.
yeah, sounds good to me
Now when truncate() drops unused allocations. Modified Close() in BlueRocksEnv to unconditionally call truncate. Fixes: https://tracker.ceph.com/issues/68487 Signed-off-by: Adam Kupczyk <akupczyk@ibm.com> (cherry picked from commit 9fc65f1) Conflicts: src/os/bluestore/BlueFS.cc, trivial
blob repair test case. Signed-off-by: Igor Fedotov <igor.fedotov@croit.io> (cherry picked from commit 482e5b8) Conflicts: src/test/objectstore/store_test.cc, trivial
5fbb060
to
4842925
Compare
Review fixes. Removed overcatious assert. Improved if .. else style. Skipped processing extent truncation when seek() goes to end. Fixes: https://tracker.ceph.com/issues/68487 Signed-off-by: Adam Kupczyk <akupczyk@ibm.com>
Add unittest for some truncate scenarios. Signed-off-by: Adam Kupczyk <akupczyk@ibm.com>
4842925
to
2c60aa2
Compare
jenkins test make check |
Now when truncate() drops unused allocations.
Modified Close() in BlueRocksEnv to unconditionally call truncate.
Fixes: https://tracker.ceph.com/issues/68487
Contribution Guidelines
To sign and title your commits, please refer to Submitting Patches to Ceph.
If you are submitting a fix for a stable branch (e.g. "quincy"), please refer to Submitting Patches to Ceph - Backports for the proper workflow.
When filling out the below checklist, you may click boxes directly in the GitHub web UI. When entering or editing the entire PR message in the GitHub web UI editor, you may also select a checklist item by adding an
x
between the brackets:[x]
. Spaces and capitalization matter when checking off items this way.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 dashboard cephadm
jenkins test api
jenkins test docs
jenkins render docs
jenkins test ceph-volume all
jenkins test ceph-volume tox
jenkins test windows
jenkins test rook e2e