From 76c57810ee2346c392834206331aacb0faaa5b54 Mon Sep 17 00:00:00 2001 From: Neha Ojha Date: Tue, 9 Oct 2018 15:57:15 -0700 Subject: [PATCH] osd/PrimaryLogPG.cc: reassign size only when object size > truncate_size Before setting size equal to op.extent.truncate_size, we need to check if the size of the object is greater than the truncate_size. We do not need to set size to op.extent.truncate_size, in the case where the size of the object is less than op.extent.truncate_size. Without this change, we were always setting size = op.extent.truncate_size, when (seq < op.extent.truncate_seq) and (op.extent.offset + op.extent.length > op.extent.truncate_size), were both true. This ended up in: 1. overestimating the size of the object 2. not considering the correct size of the object, for the later checks, which calculate op.extent.length for the read ops 3. causing crashes when trying to read more data than what was present Fixes: http://tracker.ceph.com/issues/21931 Fixes: http://tracker.ceph.com/issues/22330 Signed-off-by: Neha Ojha --- src/osd/PrimaryLogPG.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index b016071a4e0..0080223f3b7 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5442,7 +5442,8 @@ int PrimaryLogPG::do_read(OpContext *ctx, OSDOp& osd_op) { // are we beyond truncate_size? if ( (seq < op.extent.truncate_seq) && - (op.extent.offset + op.extent.length > op.extent.truncate_size) ) + (op.extent.offset + op.extent.length > op.extent.truncate_size) && + (size > op.extent.truncate_size) ) size = op.extent.truncate_size; if (op.extent.length == 0) //length is zero mean read the whole object -- 2.39.5