diff --git a/src/osd/osd.h b/src/osd/osd.h index 49c32bc8..18ac0936 100644 --- a/src/osd/osd.h +++ b/src/osd/osd.h @@ -366,6 +366,7 @@ class osd_t osd_rmw_stripe_t *stripes, const uint64_t* osd_set, osd_op_t *cur_op, int subop_idx, int zero_read); void submit_primary_subop(osd_op_t *cur_op, osd_op_t *subop, osd_rmw_stripe_t *si, bool wr, inode_t inode, uint64_t op_version); + bool submit_to_osd(osd_op_t *subop, osd_num_t osd_num); void submit_primary_del_subops(osd_op_t *cur_op, uint64_t *cur_set, uint64_t set_size, pg_osd_set_t & loc_set); void submit_primary_del_batch(osd_op_t *cur_op, obj_ver_osd_t *chunks_to_delete, int chunks_to_delete_count); void submit_primary_sync_subops(osd_op_t *cur_op); diff --git a/src/osd/osd_flush.cpp b/src/osd/osd_flush.cpp index e2aad325..d537318d 100644 --- a/src/osd/osd_flush.cpp +++ b/src/osd/osd_flush.cpp @@ -214,17 +214,8 @@ bool osd_t::submit_flush_op(pool_id_t pool_id, pg_num_t pg_num, pg_flush_batch_t handle_flush_op(op->req.hdr.opcode == OSD_OP_SEC_ROLLBACK, pool_id, pg_num, fb, peer_osd, op->reply.hdr.retval); delete op; }; - auto peer_it = msgr.osd_peers.find(peer_osd); - if (peer_it != msgr.osd_peers.end()) + if (!submit_to_osd(op, peer_osd)) { - op->client_id = peer_it->second->client_id; - msgr.outbox_push(op); - } - else - { - // Fail it immediately - op->reply.hdr.retval = -EPIPE; - op->callback(op); return false; } } diff --git a/src/osd/osd_primary_chain.cpp b/src/osd/osd_primary_chain.cpp index 3ad0db0f..6badd47b 100644 --- a/src/osd/osd_primary_chain.cpp +++ b/src/osd/osd_primary_chain.cpp @@ -318,19 +318,7 @@ int osd_t::submit_bitmap_subops(osd_op_t *cur_op, pg_t & pg) } handle_primary_subop(subop, cur_op); }; - auto peer_it = msgr.osd_peers.find(subop_osd_num); - if (peer_it != msgr.osd_peers.end()) - { - subop->client_id = peer_it->second->client_id; - msgr.outbox_push(subop); - } - else - { - // Fail it immediately - subop->client_id = 0; - subop->reply.hdr.retval = -EPIPE; - ringloop->set_immediate([subop]() { std::function(subop->callback)(subop); }); - } + submit_to_osd(subop, subop_osd_num); subop_idx++; } prev = i+1; diff --git a/src/osd/osd_primary_subops.cpp b/src/osd/osd_primary_subops.cpp index 16227c26..e401c965 100644 --- a/src/osd/osd_primary_subops.cpp +++ b/src/osd/osd_primary_subops.cpp @@ -270,22 +270,29 @@ void osd_t::submit_primary_subop(osd_op_t *cur_op, osd_op_t *subop, { handle_primary_subop(subop, cur_op); }; - auto peer_it = msgr.osd_peers.find(si->osd_num); - if (peer_it != msgr.osd_peers.end()) - { - subop->client_id = peer_it->second->client_id; - msgr.outbox_push(subop); - } - else - { - // Fail it immediately - subop->client_id = 0; - subop->reply.hdr.retval = -EPIPE; - ringloop->set_immediate([subop]() { std::function(subop->callback)(subop); }); - } + submit_to_osd(subop, si->osd_num); } } +bool osd_t::submit_to_osd(osd_op_t *subop, osd_num_t osd_num) +{ + auto peer_it = msgr.osd_peers.find(osd_num); + if (peer_it != msgr.osd_peers.end()) + { + subop->client_id = peer_it->second->client_id; + msgr.outbox_push(subop); + } + else + { + // Fail it immediately + subop->client_id = 0; + subop->reply.hdr.retval = -EPIPE; + ringloop->set_immediate([subop]() { std::function(subop->callback)(subop); }); + return false; + } + return true; +} + static uint64_t bs_op_to_osd_op[] = { 0, OSD_OP_SEC_READ, // BS_OP_READ = 1 @@ -616,19 +623,7 @@ void osd_t::submit_primary_del_batch(osd_op_t *cur_op, obj_ver_osd_t *chunks_to_ { handle_primary_subop(subop, cur_op); }; - auto peer_it = msgr.osd_peers.find(chunk.osd_num); - if (peer_it != msgr.osd_peers.end()) - { - subops[i].client_id = peer_it->second->client_id; - msgr.outbox_push(&subops[i]); - } - else - { - // Fail it immediately - subops[i].client_id = 0; - subops[i].reply.hdr.retval = -EPIPE; - ringloop->set_immediate([subop = &subops[i]]() { std::function(subop->callback)(subop); }); - } + submit_to_osd(&subops[i], chunk.osd_num); } } } @@ -739,19 +734,7 @@ void osd_t::submit_primary_stab_subops(osd_op_t *cur_op) { handle_primary_subop(subop, cur_op); }; - auto peer_it = msgr.osd_peers.find(stab_osd.osd_num); - if (peer_it != msgr.osd_peers.end()) - { - subops[i].client_id = peer_it->second->client_id; - msgr.outbox_push(&subops[i]); - } - else - { - // Fail it immediately - subops[i].client_id = 0; - subops[i].reply.hdr.retval = -EPIPE; - ringloop->set_immediate([subop = &subops[i]]() { std::function(subop->callback)(subop); }); - } + submit_to_osd(&subops[i], stab_osd.osd_num); } } } @@ -837,8 +820,7 @@ void osd_t::submit_primary_rollback_subops(osd_op_t *cur_op, const uint64_t* osd op_data->oid.inode, op_data->oid.stripe | role, op_data->target_ver-1 ); #endif - subop->client_id = msgr.osd_peers.at(osd_set[role])->client_id; - msgr.outbox_push(subop); + submit_to_osd(subop, osd_set[role]); } i++; }