diff --git a/src/osd/osd.h b/src/osd/osd.h index 59948e55..49c32bc8 100644 --- a/src/osd/osd.h +++ b/src/osd/osd.h @@ -368,7 +368,7 @@ class osd_t osd_rmw_stripe_t *si, bool wr, inode_t inode, uint64_t op_version); 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); - int submit_primary_sync_subops(osd_op_t *cur_op); + void submit_primary_sync_subops(osd_op_t *cur_op); void submit_primary_stab_subops(osd_op_t *cur_op); void submit_primary_rollback_subops(osd_op_t *cur_op, const uint64_t* osd_set); diff --git a/src/osd/osd_primary_subops.cpp b/src/osd/osd_primary_subops.cpp index 6a303963..16227c26 100644 --- a/src/osd/osd_primary_subops.cpp +++ b/src/osd/osd_primary_subops.cpp @@ -633,13 +633,17 @@ void osd_t::submit_primary_del_batch(osd_op_t *cur_op, obj_ver_osd_t *chunks_to_ } } -int osd_t::submit_primary_sync_subops(osd_op_t *cur_op) +void osd_t::submit_primary_sync_subops(osd_op_t *cur_op) { osd_primary_op_data_t *op_data = cur_op->op_data; int n_osds = op_data->dirty_osd_count; - osd_op_t *subops = new osd_op_t[n_osds]; op_data->done = op_data->errors = op_data->errcode = 0; op_data->n_subops = n_osds; + if (op_data->n_subops <= 0) + { + return; + } + osd_op_t *subops = new osd_op_t[n_osds]; op_data->subops = subops; robin_hood::unordered_flat_map::iterator peer_it; for (int i = 0; i < n_osds; i++) @@ -677,25 +681,27 @@ int osd_t::submit_primary_sync_subops(osd_op_t *cur_op) } else { - op_data->done++; + op_data->n_subops--; } } - if (op_data->done >= op_data->n_subops) + if (op_data->n_subops <= 0) { delete[] op_data->subops; op_data->subops = NULL; - return 0; } - return 1; } void osd_t::submit_primary_stab_subops(osd_op_t *cur_op) { osd_primary_op_data_t *op_data = cur_op->op_data; int n_osds = op_data->unstable_write_osds->size(); - osd_op_t *subops = new osd_op_t[n_osds]; op_data->done = op_data->errors = op_data->errcode = 0; op_data->n_subops = n_osds; + if (op_data->n_subops <= 0) + { + return; + } + osd_op_t *subops = new osd_op_t[n_osds]; op_data->subops = subops; for (int i = 0; i < n_osds; i++) { diff --git a/src/osd/osd_primary_sync.cpp b/src/osd/osd_primary_sync.cpp index 2c88baba..48d642c4 100644 --- a/src/osd/osd_primary_sync.cpp +++ b/src/osd/osd_primary_sync.cpp @@ -127,13 +127,13 @@ resume_2: if (immediate_commit != IMMEDIATE_ALL) { // SYNC - if (!submit_primary_sync_subops(cur_op)) - { - goto resume_4; - } + submit_primary_sync_subops(cur_op); resume_3: - op_data->st = 3; - return; + if (op_data->n_subops > 0) + { + op_data->st = 3; + return; + } resume_4: if (op_data->errors > 0) { @@ -194,8 +194,11 @@ resume_6: // Actually delete copies which we wanted to delete submit_primary_del_batch(cur_op, op_data->copies_to_delete, op_data->copies_to_delete_count); resume_7: - op_data->st = 7; - return; + if (op_data->n_subops > 0) + { + op_data->st = 7; + return; + } resume_8: if (op_data->errors > 0) {