From 1b1e040e7f655698897e55106cf2ea79cd08bdc7 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 15 Nov 2010 11:18:17 -0800 Subject: [PATCH] osd: add a map for lingering messages --- src/osdc/Objecter.cc | 20 +++++++++++++++++--- src/osdc/Objecter.h | 1 + 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 7e3c1db762de2..994951cdffb16 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -161,6 +161,10 @@ void Objecter::handle_osd_map(MOSDMap *m) op_submit(p->second); } } + for (hash_map::iterator p = op_osd_linger.begin(); + p != op_osd_linger.end(); p++) { + op_submit(p->second); + } } assert(e == osdmap->get_epoch()); @@ -333,11 +337,14 @@ void Objecter::kick_requests(set& changed_pgs) if (op->onack) { dout(3) << "kick_requests missing ack, resub " << tid << dendl; op_submit(op); - } else { + } else if (!op->linger) { assert(op->oncommit); dout(3) << "kick_requests missing commit, resub " << tid << dendl; op_submit(op); - } + } else { + dout(3) << "kick_requests on lingering op " << tid << dendl; + op_submit(op); + } } else assert(0); @@ -438,6 +445,9 @@ tid_t Objecter::op_submit(Op *op) dout(20) << " note: not requesting commit" << dendl; } op_osd[op->tid] = op; + if (op->linger) { + op_osd_linger[op->tid] = op; + } pg.active_tids.insert(op->tid); pg.last = g_clock.now(); @@ -631,7 +641,8 @@ void Objecter::handle_osd_op_reply(MOSDOpReply *m) op_osd.erase( tid ); if (op->con) op->con->put(); - delete op; + if (!op->linger) + delete op; } dout(5) << num_unacked << " unacked, " << num_uncommitted << " uncommitted" << dendl; @@ -1191,5 +1202,8 @@ void Objecter::dump_active() dout(10) << "dump_active" << dendl; for (hash_map::iterator p = op_osd.begin(); p != op_osd.end(); p++) dout(10) << " " << p->first << "\t" << p->second->oid << "\t" << p->second->ops << dendl; + dout(10) << "lingering" << dendl; + for (hash_map::iterator p = op_osd_linger.begin(); p != op_osd_linger.end(); p++) + dout(10) << " " << p->first << "\t" << p->second->oid << "\t" << p->second->ops << dendl; } diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index bc7c0591baddd..a58b965cac73d 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -405,6 +405,7 @@ public: private: // pending ops hash_map op_osd; + hash_map op_osd_linger; map op_poolstat; map op_statfs; map op_pool; -- 2.39.5