From 62a4b96831c1726043699db86a664dc6a0af8637 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 23 Jan 2013 11:50:13 -0800 Subject: [PATCH] ReplicatedPG: don't finish_recovery_op until the transaction completes Signed-off-by: Samuel Just --- src/osd/ReplicatedPG.cc | 19 ++++++++++++------- src/osd/ReplicatedPG.h | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 573161e530500..6b354f9584a08 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -5383,6 +5383,7 @@ void ReplicatedPG::handle_pull_response(OpRequestRef op) ObjectStore::Transaction *t = new ObjectStore::Transaction; Context *onreadable = 0; Context *onreadable_sync = 0; + Context *oncomplete = 0; submit_push_data(pi.recovery_info, first, data_included, data, m->omap_header, @@ -5411,21 +5412,25 @@ void ReplicatedPG::handle_pull_response(OpRequestRef op) onreadable = new C_OSD_AppliedRecoveredObject(this, t, obc); onreadable_sync = new C_OSD_OndiskWriteUnlock(obc); + oncomplete = new C_OSD_CompletedPull(this, hoid, get_osdmap()->get_epoch()); } else { onreadable = new ObjectStore::C_DeleteTransaction(t); } int r = osd->store-> - queue_transaction(osr.get(), t, - onreadable, - new C_OSD_CommittedPushedObject(this, op, - info.history.same_interval_since, - info.last_complete), - onreadable_sync); + queue_transaction( + osr.get(), t, + onreadable, + new C_OSD_CommittedPushedObject(this, op, + info.history.same_interval_since, + info.last_complete), + onreadable_sync, + oncomplete, + TrackedOpRef() + ); assert(r == 0); if (complete) { - finish_recovery_op(hoid); pulling.erase(hoid); pull_from_peer[m->get_source().num()].erase(hoid); update_stats(); diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index 03f04458f2a83..2b5019f33744d 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -907,6 +907,23 @@ protected: osd->send_message_osd_cluster(reply, conn.get()); } }; + struct C_OSD_CompletedPull : public Context { + boost::intrusive_ptr pg; + hobject_t hoid; + epoch_t epoch; + C_OSD_CompletedPull( + ReplicatedPG *pg, + const hobject_t &hoid, + epoch_t epoch) : pg(pg), hoid(hoid), epoch(epoch) {} + void finish(int) { + pg->lock(); + if (epoch >= pg->last_peering_reset) { + pg->finish_recovery_op(hoid); + } + pg->unlock(); + } + }; + friend class C_OSD_CompletedPull; struct C_OSD_AppliedRecoveredObjectReplica : public Context { boost::intrusive_ptr pg; ObjectStore::Transaction *t; -- 2.39.5