From 3e6819052a6f0d83c9bf828488afa9726892630c Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Tue, 16 Jun 2009 15:22:16 -0700 Subject: [PATCH] mon/Objecter: Snapshot creation/removal now waits for proper epoch to return. --- src/messages/MPoolSnapReply.h | 2 +- src/mon/OSDMonitor.cc | 2 +- src/mon/OSDMonitor.h | 2 +- src/osdc/Objecter.cc | 15 ++++++++++++--- src/osdc/Objecter.h | 6 +++--- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/messages/MPoolSnapReply.h b/src/messages/MPoolSnapReply.h index 63885173f86c8..bba43a2b50a10 100644 --- a/src/messages/MPoolSnapReply.h +++ b/src/messages/MPoolSnapReply.h @@ -21,7 +21,7 @@ public: ceph_fsid_t fsid; tid_t tid; int replyCode; - int epoch; + epoch_t epoch; MPoolSnapReply() : Message(MSG_POOLSNAPREPLY) {} diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 7bf2557847d38..b86518d5e30b2 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1317,7 +1317,7 @@ bool OSDMonitor::prepare_pool_snap ( MPoolSnap *m) return true; } -void OSDMonitor::_pool_snap(MPoolSnap *m, int replyCode, int epoch) +void OSDMonitor::_pool_snap(MPoolSnap *m, int replyCode, epoch_t epoch) { MPoolSnapReply *reply = new MPoolSnapReply(m->fsid, m->tid, replyCode, epoch); mon->messenger->send_message(reply, m->get_orig_source_inst()); diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 10c91cb85652d..d67127350536d 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -86,7 +86,7 @@ private: bool preprocess_pool_snap ( class MPoolSnap *m); bool prepare_pool_snap (MPoolSnap *m); - void _pool_snap(MPoolSnap *m, int replyCode, int epoch); + void _pool_snap(MPoolSnap *m, int replyCode, epoch_t epoch); struct C_Booted : public Context { OSDMonitor *cmon; diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 1c7562b9cf2d3..09179dc8f41cb 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -184,7 +184,12 @@ void Objecter::handle_osd_map(MOSDMap *m) kick_requests(changed_pgs); } - finish_contexts(waiting_for_map); + map >::iterator p = waiting_for_map.begin(); + while (p != waiting_for_map.end() && + p->first <= osdmap->get_epoch()) { + finish_contexts(p->second); + waiting_for_map.erase(p++); + } delete m; } @@ -576,8 +581,12 @@ void Objecter::handle_pool_snap_reply(MPoolSnapReply *m) { SnapOp *op = op_snap[tid]; dout(10) << "have request " << tid << " at " << op << " Create: " << op->create << dendl; *(op->replyCode) = m->replyCode; - op->onfinish->finish(0); - delete op->onfinish; + if (osdmap->get_epoch() < m->epoch) + wait_for_new_map(op->onfinish, m->epoch); + else { + op->onfinish->finish(0); + delete op->onfinish; + } op_snap.erase(tid); delete op; } else { diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 7e68aa69c3346..2d279d0e8244c 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -277,7 +277,7 @@ class Objecter { map op_statfs; map op_snap; - list waiting_for_map; + map > waiting_for_map; /** * track pending ops by pg @@ -350,8 +350,8 @@ private: int get_client_incarnation() const { return client_inc; } void set_client_incarnation(int inc) { client_inc = inc; } - void wait_for_new_map(Context *c) { - waiting_for_map.push_back(c); + void wait_for_new_map(Context *c, epoch_t epoch) { + waiting_for_map[epoch].push_back(c); } // mid-level helpers -- 2.39.5