]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: separately track pgmap, osdmap state machine version
authorSage Weil <sage@newdream.net>
Thu, 13 May 2010 19:12:08 +0000 (12:12 -0700)
committerSage Weil <sage@newdream.net>
Thu, 13 May 2010 19:12:08 +0000 (12:12 -0700)
Mixing these up can make our request hang on the monitor indefinitely.

Conflicts:

src/osdc/Objecter.cc

src/osdc/Objecter.cc
src/osdc/Objecter.h

index 8c7e96ce2dfe6d12a2c6bfd0fc74eeec1a0e5183..8b51e85daebd98ed5619ee4a2a3ce2471d46c09d 100644 (file)
@@ -752,7 +752,7 @@ void Objecter::pool_op_submit(PoolOp *op) {
   dout(10) << "pool_op_submit " << op->tid << dendl;
   monc->send_mon_message(new MPoolOp(monc->get_fsid(), op->tid, op->pool,
                                     op->name, op->pool_op,
-                                    op->auid, last_seen_version));
+                                    op->auid, last_seen_osdmap_version));
   op->last_submit = g_clock.now();
 }
 
@@ -762,9 +762,9 @@ void Objecter::handle_pool_op_reply(MPoolOpReply *m) {
   if (op_pool.count(tid)) {
     PoolOp *op = op_pool[tid];
     dout(10) << "have request " << tid << " at " << op << " Op: " << get_pool_op_name(op->pool_op) << dendl;
-    if (m->version > last_seen_version)
-      last_seen_version = m->version;
-    if (osdmap->get_epoch() < m->epoch) {
+    if (m->version > last_seen_osdmap_version)
+      last_seen_osdmap_version = m->version;
+    if (m->replyCode == 0 && osdmap->get_epoch() < m->epoch) {
       dout(20) << "waiting for client to reach epoch " << m->epoch << " before calling back" << dendl;
       wait_for_new_map(op->onfinish, m->epoch, m->replyCode);
     }
@@ -803,7 +803,7 @@ void Objecter::get_pool_stats(list<string>& pools, map<string,pool_stat_t> *resu
 void Objecter::poolstat_submit(PoolStatOp *op)
 {
   dout(10) << "poolstat_submit " << op->tid << dendl;
-  monc->send_mon_message(new MGetPoolStats(monc->get_fsid(), op->tid, op->pools, last_seen_version));
+  monc->send_mon_message(new MGetPoolStats(monc->get_fsid(), op->tid, op->pools, last_seen_pgmap_version));
   op->last_submit = g_clock.now();
 }
 
@@ -816,8 +816,8 @@ void Objecter::handle_get_pool_stats_reply(MGetPoolStatsReply *m)
     PoolStatOp *op = op_poolstat[tid];
     dout(10) << "have request " << tid << " at " << op << dendl;
     *op->pool_stats = m->pool_stats;
-    if (m->version > last_seen_version)
-      last_seen_version = m->version;
+    if (m->version > last_seen_pgmap_version)
+      last_seen_pgmap_version = m->version;
     op->onfinish->finish(0);
     delete op->onfinish;
     op_poolstat.erase(tid);
@@ -845,7 +845,7 @@ void Objecter::get_fs_stats(ceph_statfs& result, Context *onfinish) {
 void Objecter::fs_stats_submit(StatfsOp *op)
 {
   dout(10) << "fs_stats_submit" << op->tid << dendl;
-  monc->send_mon_message(new MStatfs(monc->get_fsid(), op->tid, last_seen_version));
+  monc->send_mon_message(new MStatfs(monc->get_fsid(), op->tid, last_seen_pgmap_version));
   op->last_submit = g_clock.now();
 }
 
@@ -857,8 +857,8 @@ void Objecter::handle_fs_stats_reply(MStatfsReply *m) {
     StatfsOp *op = op_statfs[tid];
     dout(10) << "have request " << tid << " at " << op << dendl;
     *(op->stats) = m->h.st;
-    if (m->h.version > last_seen_version)
-      last_seen_version = m->h.version;
+    if (m->h.version > last_seen_pgmap_version)
+      last_seen_pgmap_version = m->h.version;
     op->onfinish->finish(0);
     delete op->onfinish;
     op_statfs.erase(tid);
index 03ada7e41a7446253a6314b93d67a7a41bf606c0..a2f751e892b873f7c494db3213b4d940f1ff2f22 100644 (file)
@@ -188,7 +188,9 @@ class Objecter {
 
   void maybe_request_map();
 
-  version_t last_seen_version;
+  version_t last_seen_osdmap_version;
+  version_t last_seen_pgmap_version;
+
   Mutex &client_lock;
   SafeTimer timer;
   
@@ -410,7 +412,8 @@ public:
     messenger(m), monc(mc), osdmap(om),
     last_tid(0), client_inc(-1),
     num_unacked(0), num_uncommitted(0),
-    last_seen_version(0),
+    last_seen_osdmap_version(0),
+    last_seen_pgmap_version(0),
     client_lock(l), timer(l)
   { }
   ~Objecter() { }