From 966fb763ca5093589a33eb54569d3528a5b4edbc Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 13 Apr 2021 01:11:58 +0300 Subject: [PATCH] Oooops, fix chained reads --- src/osd_primary_chain.cpp | 19 ++++++++++++------- tests/common.sh | 6 ++++-- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/osd_primary_chain.cpp b/src/osd_primary_chain.cpp index 6340fff1..7d0e6912 100644 --- a/src/osd_primary_chain.cpp +++ b/src/osd_primary_chain.cpp @@ -349,9 +349,12 @@ int osd_t::submit_chained_read_requests(pg_t & pg, osd_op_t *cur_op) int stripe_count = (pg.scheme == POOL_SCHEME_REPLICATED ? 1 : pg.pg_size); op_data->chain_read_count = chain_reads.size(); op_data->chain_reads = (osd_chain_read_t*)calloc_or_die( - 1, (sizeof(osd_chain_read_t) + sizeof(osd_rmw_stripe_t)*stripe_count) * chain_reads.size() + 1, sizeof(osd_chain_read_t) * chain_reads.size() + + sizeof(osd_rmw_stripe_t) * stripe_count * op_data->chain_size + ); + osd_rmw_stripe_t *chain_stripes = (osd_rmw_stripe_t*)( + ((void*)op_data->chain_reads) + sizeof(osd_chain_read_t) * op_data->chain_read_count ); - osd_rmw_stripe_t *chain_stripes = (osd_rmw_stripe_t*)(((void*)op_data->chain_reads) + sizeof(osd_chain_read_t) * op_data->chain_read_count); // Now process each subrequest as a separate read, including reconstruction if needed // Prepare reads int n_subops = 0; @@ -361,7 +364,7 @@ int osd_t::submit_chained_read_requests(pg_t & pg, osd_op_t *cur_op) op_data->chain_reads[cri] = chain_reads[cri]; object_id cur_oid = { .inode = chain_reads[cri].inode, .stripe = op_data->oid.stripe }; // FIXME: maybe introduce split_read_stripes to shorten these lines and to remove read_start=req_start - osd_rmw_stripe_t *stripes = chain_stripes + cri*stripe_count; + osd_rmw_stripe_t *stripes = chain_stripes + chain_reads[cri].chain_pos*stripe_count; split_stripes(pg.pg_data_size, bs_block_size, chain_reads[cri].offset, chain_reads[cri].len, stripes); if (op_data->scheme == POOL_SCHEME_REPLICATED && !stripes[0].req_end) { @@ -406,7 +409,7 @@ int osd_t::submit_chained_read_requests(pg_t & pg, osd_op_t *cur_op) void *cur_buf = cur_op->buf; for (int cri = 0; cri < chain_reads.size(); cri++) { - osd_rmw_stripe_t *stripes = chain_stripes + cri*stripe_count; + osd_rmw_stripe_t *stripes = chain_stripes + chain_reads[cri].chain_pos*stripe_count; for (int role = 0; role < stripe_count; role++) { if (stripes[role].read_end > 0) @@ -429,7 +432,7 @@ int osd_t::submit_chained_read_requests(pg_t & pg, osd_op_t *cur_op) int cur_subops = 0; for (int cri = 0; cri < chain_reads.size(); cri++) { - osd_rmw_stripe_t *stripes = chain_stripes + cri*stripe_count; + osd_rmw_stripe_t *stripes = chain_stripes + chain_reads[cri].chain_pos*stripe_count; if (op_data->scheme == POOL_SCHEME_REPLICATED && !stripes[0].req_end) { continue; @@ -460,7 +463,9 @@ void osd_t::send_chained_read_results(pg_t & pg, osd_op_t *cur_op) { osd_primary_op_data_t *op_data = cur_op->op_data; int stripe_count = (pg.scheme == POOL_SCHEME_REPLICATED ? 1 : pg.pg_size); - osd_rmw_stripe_t *chain_stripes = (osd_rmw_stripe_t*)(((void*)op_data->chain_reads) + sizeof(osd_chain_read_t) * op_data->chain_read_count); + osd_rmw_stripe_t *chain_stripes = (osd_rmw_stripe_t*)( + ((void*)op_data->chain_reads) + sizeof(osd_chain_read_t) * op_data->chain_read_count + ); // Reconstruct parts if needed if (op_data->degraded) { @@ -468,7 +473,7 @@ void osd_t::send_chained_read_results(pg_t & pg, osd_op_t *cur_op) for (int cri = 0; cri < op_data->chain_read_count; cri++) { // Reconstruct missing stripes - osd_rmw_stripe_t *stripes = chain_stripes + cri*stripe_count; + osd_rmw_stripe_t *stripes = chain_stripes + op_data->chain_reads[cri].chain_pos*stripe_count; if (op_data->scheme == POOL_SCHEME_XOR) { reconstruct_stripes_xor(stripes, pg.pg_size, clean_entry_bitmap_size); diff --git a/tests/common.sh b/tests/common.sh index 86cfff50..7fe83704 100644 --- a/tests/common.sh +++ b/tests/common.sh @@ -23,8 +23,10 @@ trap 'kill -9 $(jobs -p)' EXIT ETCD=${ETCD:-etcd} ETCD_PORT=${ETCD_PORT:-12379} -rm -rf ./testdata -mkdir -p ./testdata +if [ "$KEEP_DATA" = "" ]; then + rm -rf ./testdata + mkdir -p ./testdata +fi $ETCD -name etcd_test --data-dir ./testdata/etcd \ --advertise-client-urls http://127.0.0.1:$ETCD_PORT --listen-client-urls http://127.0.0.1:$ETCD_PORT \