Skip to content

Commit aeafd2e

Browse files
jiawdNitzanMordhai
authored andcommitted
osd: full-object read crc is mismatch, because truncate modify oi.size and forget to clear data_digest
when write before truncate, need trim length, if truncate is to 0, write is [0~128k], write change to [0~0], do nothing, oi.size is 0, x1 = set_data_digest(crc32(-1)). write is [128k~128k], write change to [128k~0], truncate oi.size to offset 128k, x2 = set_data_digest(crc32(x1)). write is [256k~128k], write change to [256k~0], truncate oi.size to offset 256k, x3 = set_data_digest(crc32(x2)). ... write is [4063232~128k], write change to [4063232~0], truncate oi.size to offset 4063232, xn = set_data_digest(crs32(xn-1)) Now, we can see oi.size is 4063232, and data_digest is 0xffffffff, because thelength of in_data of crc is 0 every time. when read verify crc will reply EIO. (EC pool). so, when truncate in write, need clear data_digest and DIGEST flag, when write before truncate, need to trim length, when offset over than oi.size, don't truncate oi.size to offset. Fixes: https://tracker.ceph.com/issues/53240 Signed-off-by: jiawd <[email protected]>
1 parent 4a592ad commit aeafd2e

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/osd/PrimaryLogPG.cc

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6746,6 +6746,8 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
67466746
truncate_update_size_and_usage(ctx->delta_stats,
67476747
oi,
67486748
op.extent.truncate_size);
6749+
//truncate modify oi.size, need clear old data_digest and DIGEST flag
6750+
oi.clear_data_digest();
67496751
}
67506752
} else {
67516753
dout(10) << " truncate_seq " << op.extent.truncate_seq << " > current " << seq
@@ -6764,10 +6766,16 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
67646766

67656767
if (op.extent.length == 0) {
67666768
if (op.extent.offset > oi.size) {
6767-
t->truncate(
6768-
soid, op.extent.offset);
6769-
truncate_update_size_and_usage(ctx->delta_stats, oi,
6770-
op.extent.offset);
6769+
if (seq && (seq > op.extent.truncate_seq)) {
6770+
//do nothing
6771+
//write arrived after truncate, we should not truncate to offset
6772+
} else {
6773+
t->truncate(
6774+
soid, op.extent.offset);
6775+
truncate_update_size_and_usage(ctx->delta_stats, oi,
6776+
op.extent.offset);
6777+
oi.clear_data_digest();
6778+
}
67716779
} else {
67726780
t->nop(soid);
67736781
}

0 commit comments

Comments
 (0)