From 1a9ca1869cbe37816e86f8baa50008859b185acf 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 (cherry picked from commit 76c57810ee2346c392834206331aacb0faaa5b54) --- 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 0b65340874799..1a6dc4001e807 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -5405,7 +5405,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