Skip to content
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

Open
wants to merge 4 commits into
base: quincy
Choose a base branch
from

Conversation

aclamk
Copy link
Contributor

@aclamk aclamk commented Oct 10, 2024

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

  • Tracker (select at least one)
    • References tracker ticket
    • Very recent bug; references commit where it was introduced
    • New feature (ticket optional)
    • Doc update (no ticket needed)
    • Code cleanup (no ticket needed)
  • Component impact
    • Affects Dashboard, opened tracker ticket
    • Affects Orchestrator, opened tracker ticket
    • No impact that needs to be tracked
  • Documentation (select at least one)
    • Updates relevant documentation
    • No doc update is appropriate
  • Tests (select at least one)
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

@aclamk aclamk requested a review from a team as a code owner October 10, 2024 10:21
@github-actions github-actions bot added this to the quincy milestone Oct 10, 2024
@aclamk
Copy link
Contributor Author

aclamk commented Oct 10, 2024

jenkins test make check

Copy link

This pull request can no longer be automatically merged: a rebase is needed and changes have to be manually resolved

uint64_t new_allocated;
if (0 == cut_off) {
// whole pextent to remove
changed_extents = true;
Copy link
Contributor

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();
?

Copy link
Contributor Author

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.

Copy link
Contributor

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?

Copy link
Contributor Author

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 ?

Copy link
Contributor

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 Show resolved Hide resolved
changed_extents = true;
++p;
} else {
ceph_assert(cut_off >= p->length);
Copy link
Contributor

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.

Copy link
Contributor

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)?

Copy link
Contributor Author

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.

Copy link
Contributor Author

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:

  1. extent we seek to is not used at all
  2. we use some, but there is something to cut and release
  3. we use some and there is nothing to cut and release
    I feel like separate codes for each case is the best solution.

Copy link
Contributor

@ifed01 ifed01 Oct 23, 2024

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.

Copy link
Contributor Author

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) ?

Copy link
Contributor

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

src/os/bluestore/BlueFS.cc Outdated Show resolved Hide resolved
src/os/bluestore/BlueFS.cc Outdated Show resolved Hide resolved
src/os/bluestore/BlueFS.cc Show resolved Hide resolved
@aclamk aclamk requested a review from ifed01 October 23, 2024 11:59
aclamk and others added 2 commits October 23, 2024 12:06
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
@aclamk aclamk force-pushed the wip-aclamk-bluefs-truncate-allocations-quincy branch from 5fbb060 to 4842925 Compare October 23, 2024 12:21
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>
@aclamk aclamk force-pushed the wip-aclamk-bluefs-truncate-allocations-quincy branch from 4842925 to 2c60aa2 Compare October 29, 2024 09:21
@aclamk
Copy link
Contributor Author

aclamk commented Oct 29, 2024

jenkins test make check

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants