diff --git a/osd_primary.cpp b/osd_primary.cpp index e96699ffd..5a7150395 100644 --- a/osd_primary.cpp +++ b/osd_primary.cpp @@ -39,6 +39,8 @@ void osd_t::exec_primary_read(osd_op_t *cur_op) reads[role*2+1] = end > (role+1)*bs_block_size ? bs_block_size : end-role*bs_block_size; } } + auto vo_it = pgs[pg_num].ver_override.find(oid); + uint64_t target_ver = vo_it != pgs[pg_num].ver_override.end() ? vo_it.second : UINT64_MAX; if (pgs[pg_num].pg_cursize == 3) { // Fast happy-path @@ -82,14 +84,53 @@ void osd_t::exec_primary_read(osd_op_t *cur_op) } uint64_t pos[pgs[pg_num].pg_size]; uint64_t buf_size = 0; + int n_subops = 0; for (int role = 0; role < pgs[pg_num].pg_size; role++) { - pos[role] = buf_size; - buf_size += real_reads[role*2+1]; + if (real_reads[role*2+1] != 0) + { + n_subops++; + pos[role] = buf_size; + buf_size += real_reads[role*2+1]; + } } void *buf = memalign(MEM_ALIGNMENT, buf_size); - // ...... - + // Submit reads + osd_op_t read_ops[n_subops]; + int subop = 0; + for (int role = 0; role < pgs[pg_num].pg_size; role++) + { + // FIXME Take remapped objects into account + uint64_t role_osd_num = pgs[pg_num].target_set[role]; + if (role_osd_num != UINT64_MAX) + { + if (role_osd_num == this->osd_num) + { + } + else + { + read_ops[subop].op_type = OSD_OP_OUT; + read_ops[subop].peer_fd = osd_peer_fds.get(role_osd_num); + read_ops[subop].op.sec_rw = { + .header = { + .magic = SECONDARY_OSD_OP_MAGIC, + .id = next_op_id++, + .opcode = OSD_OP_SECONDARY_READ, + }, + .oid = { + .inode = oid.inode, + .stripe = oid.stripe | role, + }, + .version = target_ver, + .offset = real_reads[role*2], + .len = real_reads[role*2+1] - real_reads[role*2], + }; + read_ops[subop].buf = buf + pos[role]; + read_ops[subop].callback = NULL; + } + subop++; + } + } // Reconstruct missing stripes for (int role = 0; role < pgs[pg_num].pg_minsize; role++) {