From c54d6cde61ef08fac22bc0967c916e2398da889a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 13 May 2010 10:47:33 -0700 Subject: [PATCH] objecter: separately track pgmap, osdmap state machine version Mixing these up can make our request hang on the monitor indefinitely. --- src/osdc/Objecter.cc | 20 ++++++++++---------- src/osdc/Objecter.h | 7 +++++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index f7af35aaff536..616a874ebf30b 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -803,7 +803,7 @@ void Objecter::pool_op_submit(PoolOp *op) { dout(10) << "pool_op_submit " << op->tid << dendl; MPoolOp *m = 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); if (op->snapid) m->snapid = op->snapid; monc->send_mon_message(m); op->last_submit = g_clock.now(); @@ -827,9 +827,9 @@ void Objecter::handle_pool_op_reply(MPoolOpReply *m) op->blp->claim(*m->response_data); m->response_data = NULL; } - 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); } @@ -868,7 +868,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(); } @@ -881,8 +881,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); @@ -910,7 +910,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(); } @@ -922,8 +922,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 0b68556dd4bb7..0b71176edf87f 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; @@ -412,7 +414,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() { } -- 2.39.5