From: Sage Weil Date: Thu, 13 May 2010 19:12:08 +0000 (-0700) Subject: objecter: separately track pgmap, osdmap state machine version X-Git-Tag: v0.20.1~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=87d5082b92c686b4e9a06b73d693eed275c01e0f;p=ceph.git objecter: separately track pgmap, osdmap state machine version Mixing these up can make our request hang on the monitor indefinitely. Conflicts: src/osdc/Objecter.cc --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 8c7e96ce2dfe..8b51e85daebd 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -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& pools, map *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); diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 03ada7e41a74..a2f751e892b8 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -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() { }