From 39531ef1a617723467b1c30f9548ab2f7b5ae9a2 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Thu, 7 Apr 2022 01:58:44 +0300 Subject: [PATCH] Fix incorrect chained reads during rebalance (the bug detected by test_rebalance_verify.sh) --- src/osd_primary_chain.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/osd_primary_chain.cpp b/src/osd_primary_chain.cpp index 22ae5f78..b10cf7d1 100644 --- a/src/osd_primary_chain.cpp +++ b/src/osd_primary_chain.cpp @@ -400,18 +400,21 @@ int osd_t::submit_chained_read_requests(pg_t & pg, osd_op_t *cur_op) stripes[role].read_end = stripes[role].req_end; } uint64_t *cur_set = pg.cur_set.data(); - if (pg.state != PG_ACTIVE && op_data->scheme != POOL_SCHEME_REPLICATED) + if (pg.state != PG_ACTIVE) { pg_osd_set_state_t *object_state; cur_set = get_object_osd_set(pg, cur_oid, pg.cur_set.data(), &object_state); - if (extend_missing_stripes(stripes, cur_set, pg.pg_data_size, pg.pg_size) < 0) + if (op_data->scheme != POOL_SCHEME_REPLICATED) { - free(op_data->chain_reads); - op_data->chain_reads = NULL; - finish_op(cur_op, -EIO); - return -1; + if (extend_missing_stripes(stripes, cur_set, pg.pg_data_size, pg.pg_size) < 0) + { + free(op_data->chain_reads); + op_data->chain_reads = NULL; + finish_op(cur_op, -EIO); + return -1; + } + op_data->degraded = 1; } - op_data->degraded = 1; } if (op_data->scheme == POOL_SCHEME_REPLICATED) { @@ -465,7 +468,7 @@ int osd_t::submit_chained_read_requests(pg_t & pg, osd_op_t *cur_op) auto vo_it = pg.ver_override.find(cur_oid); uint64_t target_ver = vo_it != pg.ver_override.end() ? vo_it->second : UINT64_MAX; uint64_t *cur_set = pg.cur_set.data(); - if (pg.state != PG_ACTIVE && op_data->scheme != POOL_SCHEME_REPLICATED) + if (pg.state != PG_ACTIVE) { pg_osd_set_state_t *object_state; cur_set = get_object_osd_set(pg, cur_oid, pg.cur_set.data(), &object_state);