forked from vitalif/vitastor
WIP submit subops
parent
74d0196ba5
commit
206c4eb655
|
@ -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++)
|
||||
{
|
||||
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 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
|
||||
for (int role = 0; role < pgs[pg_num].pg_minsize; role++)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue