WIP submit subops

blocking-uring-test
Vitaliy Filippov 2020-01-31 14:07:16 +03:00
parent 74d0196ba5
commit 206c4eb655
1 changed files with 45 additions and 4 deletions

View File

@ -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; 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) if (pgs[pg_num].pg_cursize == 3)
{ {
// Fast happy-path // 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 pos[pgs[pg_num].pg_size];
uint64_t buf_size = 0; uint64_t buf_size = 0;
int n_subops = 0;
for (int role = 0; role < pgs[pg_num].pg_size; role++) for (int role = 0; role < pgs[pg_num].pg_size; role++)
{ {
pos[role] = buf_size; if (real_reads[role*2+1] != 0)
buf_size += real_reads[role*2+1]; {
n_subops++;
pos[role] = buf_size;
buf_size += real_reads[role*2+1];
}
} }
void *buf = memalign(MEM_ALIGNMENT, buf_size); void *buf = memalign(MEM_ALIGNMENT, buf_size);
// ...<SUBMIT READS AND GET REPLIES>... // 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 // Reconstruct missing stripes
for (int role = 0; role < pgs[pg_num].pg_minsize; role++) for (int role = 0; role < pgs[pg_num].pg_minsize; role++)
{ {