summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Farnum <greg@inktank.com>2013-10-10 09:34:02 -0700
committerGreg Farnum <greg@inktank.com>2013-10-17 13:11:45 -0700
commita8e05491efbea51ef3c52c12cd042143841cd667 (patch)
treef0d04db89776b8a65a232145a0495863ad2ea091
parent73a2cb01fd22db4d15bdf2ff7f86bde45fd3f752 (diff)
downloadceph-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.cc40
-rw-r--r--src/osd/ReplicatedPG.h39
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();