Skip to content

Commit 85fac18

Browse files
committed
os/bluestore: Make truncate() drop unused allocations
Review fixes. Removed overcatious assert. Improved if .. else style. Skipped processing extent truncation when seek() goes to end. Fixes: https://tracker.ceph.com/issues/68385 (addendum) Signed-off-by: Adam Kupczyk <[email protected]>
1 parent c0451e1 commit 85fac18

File tree

1 file changed

+29
-31
lines changed

1 file changed

+29
-31
lines changed

src/os/bluestore/BlueFS.cc

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3786,7 +3786,7 @@ int BlueFS::truncate(FileWriter *h, uint64_t offset)/*_WF_L*/
37863786
if (offset > fnode.size) {
37873787
ceph_abort_msg("truncate up not supported");
37883788
}
3789-
ceph_assert(offset <= fnode.size);
3789+
37903790
_flush_bdev(h);
37913791
{
37923792
std::lock_guard ll(log.lock);
@@ -3795,43 +3795,41 @@ int BlueFS::truncate(FileWriter *h, uint64_t offset)/*_WF_L*/
37953795
vselector->sub_usage(h->file->vselector_hint, fnode);
37963796
uint64_t x_off = 0;
37973797
auto p = fnode.seek(offset, &x_off);
3798-
uint64_t cut_off =
3799-
(p == fnode.extents.end()) ? 0 : p2roundup(x_off, alloc_size[p->bdev]);
3800-
uint64_t new_allocated;
3801-
if (0 == cut_off) {
3802-
// whole pextent to remove
3803-
changed_extents = true;
3804-
new_allocated = offset;
3805-
} else if (cut_off < p->length) {
3806-
dirty.pending_release[p->bdev].insert(p->offset + cut_off, p->length - cut_off);
3807-
new_allocated = (offset - x_off) + cut_off;
3808-
p->length = cut_off;
3809-
changed_extents = true;
3810-
++p;
3811-
} else {
3812-
ceph_assert(cut_off >= p->length);
3813-
new_allocated = (offset - x_off) + p->length;
3814-
// just leave it here
3815-
++p;
3816-
}
3817-
while (p != fnode.extents.end()) {
3818-
dirty.pending_release[p->bdev].insert(p->offset, p->length);
3819-
p = fnode.extents.erase(p);
3820-
changed_extents = true;
3798+
if (p != fnode.extents.end()) {
3799+
uint64_t cut_off = p2roundup(x_off, alloc_size[p->bdev]);
3800+
if (0 == cut_off) {
3801+
// whole pextent to remove
3802+
fnode.allocated = offset;
3803+
changed_extents = true;
3804+
} else if (cut_off < p->length) {
3805+
dirty.pending_release[p->bdev].insert(p->offset + cut_off,
3806+
p->length - cut_off);
3807+
fnode.allocated = (offset - x_off) + cut_off;
3808+
p->length = cut_off;
3809+
changed_extents = true;
3810+
++p;
3811+
} else {
3812+
// cut_off > p->length means that we misaligned the extent
3813+
ceph_assert(cut_off == p->length);
3814+
fnode.allocated = (offset - x_off) + p->length;
3815+
++p; // leave extent untouched
3816+
}
3817+
while (p != fnode.extents.end()) {
3818+
dirty.pending_release[p->bdev].insert(p->offset, p->length);
3819+
p = fnode.extents.erase(p);
3820+
changed_extents = true;
3821+
}
38213822
}
38223823
if (changed_extents) {
38233824
fnode.size = offset;
3824-
fnode.allocated = new_allocated;
38253825
fnode.reset_delta();
38263826
log.t.op_file_update(fnode);
38273827
// sad, but is_dirty must be set to signal flushing of the log
38283828
h->file->is_dirty = true;
3829-
} else {
3830-
if (offset != fnode.size) {
3831-
fnode.size = offset;
3832-
//skipping log.t.op_file_update_inc, it will be done by flush()
3833-
h->file->is_dirty = true;
3834-
}
3829+
} else if (offset != fnode.size) {
3830+
fnode.size = offset;
3831+
// skipping log.t.op_file_update_inc, it will be done by flush()
3832+
h->file->is_dirty = true;
38353833
}
38363834
vselector->add_usage(h->file->vselector_hint, fnode);
38373835
}

0 commit comments

Comments
 (0)