diff options
author | Greg Farnum <greg@inktank.com> | 2013-10-10 09:34:02 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-10-17 13:11:45 -0700 |
commit | a8e05491efbea51ef3c52c12cd042143841cd667 (patch) | |
tree | f0d04db89776b8a65a232145a0495863ad2ea091 | |
parent | 73a2cb01fd22db4d15bdf2ff7f86bde45fd3f752 (diff) | |
download | ceph-a8e05491efbea51ef3c52c12cd042143841cd667.tar.gz |
ReplicatedPG: promote: move the promote functionality into finish_promote
This way we can have a couple of functions that handle each type of
case, and let the PromoteCallback choose between them. That's much
better than doing it all inline in the callback.
Signed-off-by: Greg Farnum <greg@inktank.com>
-rw-r--r-- | src/osd/ReplicatedPG.cc | 40 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.h | 39 |
2 files changed, 43 insertions, 36 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 575e48bb580..504d8fc091d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -4552,7 +4552,45 @@ void ReplicatedPG::finish_copyfrom(OpContext *ctx) ctx->delta_stats.num_wr_kb += SHIFT_ROUND_UP(obs.oi.size, 10); } - +void ReplicatedPG::finish_promote(CopyResults *results, ObjectContextRef obc, + hobject_t& temp_obj) +{ + vector<OSDOp> ops; + tid_t rep_tid = osd->get_tid(); + osd_reqid_t reqid(osd->get_cluster_msgr_name(), 0, rep_tid); + OpContext *tctx = new OpContext(OpRequestRef(), reqid, ops, &obc->obs, obc->ssc, this); + tctx->mtime = ceph_clock_now(g_ceph_context); + tctx->op_t.swap(results->final_tx); + if (results->started_temp_obj) { + tctx->discard_temp_oid = temp_obj; + } + + RepGather *repop = new_repop(tctx, obc, rep_tid); + C_KickBlockedObject *blockedcb = new C_KickBlockedObject(obc, this); + repop->ondone = blockedcb; + object_stat_sum_t delta; + ++delta.num_objects; + obc->obs.exists = true; + delta.num_bytes += results->object_size; + obc->obs.oi.category = results->category; + info.stats.stats.add(delta, obc->obs.oi.category); + tctx->at_version.epoch = get_osdmap()->get_epoch(); + tctx->at_version.version = pg_log.get_head().version + 1; + tctx->user_at_version = results->user_version; + + tctx->log.push_back(pg_log_entry_t( + pg_log_entry_t::MODIFY, + obc->obs.oi.soid, + tctx->at_version, + tctx->obs->oi.version, + tctx->user_at_version, + osd_reqid_t(), + repop->ctx->mtime)); + append_log(tctx->log, eversion_t(), tctx->local_t); + issue_repop(repop, repop->ctx->mtime); + eval_repop(repop); + repop->put(); +} void ReplicatedPG::cancel_copy(CopyOpRef cop) { diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 2810cbf641e..0f9ba7ce035 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -217,41 +217,8 @@ public: virtual void finish(CopyCallbackResults results) { CopyResults* results_data = results.get<1>(); - vector<OSDOp> ops; - tid_t rep_tid = pg->osd->get_tid(); - osd_reqid_t reqid(pg->osd->get_cluster_msgr_name(), 0, rep_tid); - OpContext *tctx = new OpContext(OpRequestRef(), reqid, ops, &obc->obs, obc->ssc, pg); - tctx->mtime = ceph_clock_now(g_ceph_context); - tctx->op_t.swap(results_data->final_tx); - if (results_data->started_temp_obj) { - tctx->discard_temp_oid = temp_obj; - } - - RepGather *repop = pg->new_repop(tctx, obc, rep_tid); - C_KickBlockedObject *blockedcb = new C_KickBlockedObject(obc, pg); - repop->ondone = blockedcb; - object_stat_sum_t delta; - ++delta.num_objects; - obc->obs.exists = true; - delta.num_bytes += results_data->object_size; - obc->obs.oi.category = results_data->category; - pg->info.stats.stats.add(delta, obc->obs.oi.category); - tctx->at_version.epoch = pg->get_osdmap()->get_epoch(); - tctx->at_version.version = pg->pg_log.get_head().version + 1; - tctx->user_at_version = results_data->user_version; - - tctx->log.push_back(pg_log_entry_t( - pg_log_entry_t::MODIFY, - obc->obs.oi.soid, - tctx->at_version, - tctx->obs->oi.version, - tctx->user_at_version, - osd_reqid_t(), - repop->ctx->mtime)); - pg->append_log(tctx->log, eversion_t(), tctx->local_t); - pg->issue_repop(repop, repop->ctx->mtime); - pg->eval_repop(repop); - repop->put(); + assert(results.get<0>() == 0); // we don't handle errors right now + pg->finish_promote(results_data, obc, temp_obj); delete results_data; } }; @@ -916,6 +883,8 @@ protected: void _build_finish_copy_transaction(CopyOpRef cop, ObjectStore::Transaction& t); void finish_copyfrom(OpContext *ctx); + void finish_promote(CopyResults *results, ObjectContextRef obc, + hobject_t& temp_obj); void cancel_copy(CopyOpRef cop); void cancel_copy_ops(); |