From: Samuel Just Date: Fri, 3 Jun 2016 21:41:13 +0000 (-0700) Subject: ReplicatedPG: call op_applied for submit_log_entries based repops X-Git-Tag: ses5-milestone5~474^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8bde0ae122f384817f4e522604379d1e9b21d8d9;p=ceph.git ReplicatedPG: call op_applied for submit_log_entries based repops Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 834c0c5180ab..34d10ccf8bcf 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -8723,6 +8723,8 @@ void ReplicatedPG::submit_log_entries( }); } } + t.register_on_applied( + new C_OSD_OnApplied{this, get_osdmap()->get_epoch(), info.last_update}); int r = osd->store->queue_transaction(osr.get(), std::move(t), NULL); assert(r == 0); } @@ -9708,7 +9710,7 @@ void ReplicatedPG::do_update_log_missing(OpRequestRef &op) append_log_entries_update_missing(m->entries, t); // TODO FIX - Context *c = new FunctionContext( + Context *complete = new FunctionContext( [=](int) { MOSDPGUpdateLogMissing *msg = static_cast( @@ -9726,10 +9728,12 @@ void ReplicatedPG::do_update_log_missing(OpRequestRef &op) /* Hack to work around the fact that ReplicatedBackend sends * ack+commit if commit happens first */ if (pool.info.ec_pool()) { - t.register_on_complete(c); + t.register_on_complete(complete); } else { - t.register_on_commit(c); + t.register_on_commit(complete); } + t.register_on_applied( + new C_OSD_OnApplied{this, get_osdmap()->get_epoch(), info.last_update}); int tr = osd->store->queue_transaction( osr.get(), std::move(t), diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index d076720be731..bd357b800ddc 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -390,6 +390,22 @@ public: append_log(logv, trim_to, trim_rollback_to, t, transaction_applied); } + struct C_OSD_OnApplied : Context { + ReplicatedPGRef pg; + epoch_t epoch; + eversion_t v; + C_OSD_OnApplied( + ReplicatedPGRef pg, + epoch_t epoch, + eversion_t v) + : pg(pg), epoch(epoch), v(v) {} + void finish(int) override { + pg->lock(); + if (!pg->pg_has_reset_since(epoch)) + pg->op_applied(v); + pg->unlock(); + } + }; void op_applied( const eversion_t &applied_version);