From 2b109803b9434d2d495e65d6a045838ee3ebf169 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 6 Nov 2013 16:55:52 -0800 Subject: [PATCH] objecter: clean pause / unpause logic op->paused holds now whether operation should be paused or not, and it's being updated when scanning requests. No need to do a second scan. Signed-off-by: Yehuda Sadeh (cherry picked from commit 5fe3dc647bf936df8e1eb2892b53f44f68f19821) --- src/osdc/Objecter.cc | 42 +++++++++++------------------------------- src/osdc/Objecter.h | 1 + 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 0e04fb9b28b86..c193b680e6c11 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -628,37 +628,11 @@ void Objecter::handle_osd_map(MOSDMap *m) if (was_pauserd || was_pausewr || pauserd || pausewr) maybe_request_map(); - // unpause requests? - if ((was_pauserd && !pauserd) || - (was_pausewr && !pausewr)) { - for (map::iterator p = ops.begin(); - p != ops.end(); - ++p) { - Op *op = p->second; - if (op->paused && - !((op->flags & CEPH_OSD_FLAG_READ) && pauserd) && // not still paused as a read - !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)) // not still paused as a write - need_resend[op->tid] = op; - } - for (map::iterator lp = linger_ops.begin(); - lp != linger_ops.end(); - ++lp) { - LingerOp *op = lp->second; - if (!op->registered && - !pauserd && // not still paused as a read - !((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)) // not still paused as a write - need_resend_linger.push_back(op); - } - } - // resend requests for (map::iterator p = need_resend.begin(); p != need_resend.end(); ++p) { Op *op = p->second; if (op->should_resend) { - bool paused = op->paused && - (((op->flags & CEPH_OSD_FLAG_READ) && pauserd) || - ((op->flags & CEPH_OSD_FLAG_WRITE) && pausewr)); - if (op->session && !paused) { + if (op->session && !op->paused) { logger->inc(l_osdc_op_resend); send_op(op); } @@ -1300,6 +1274,15 @@ bool Objecter::is_pg_changed(vector& o, vector& n, bool any_change) return false; // same primary (tho replicas may have changed) } +bool Objecter::op_should_be_paused(Op *op) +{ + bool pauserd = osdmap->test_flag(CEPH_OSDMAP_PAUSERD); + bool pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || osdmap->test_flag(CEPH_OSDMAP_FULL); + + return (op->flags & CEPH_OSD_FLAG_READ && pauserd) || + (op->flags & CEPH_OSD_FLAG_WRITE && pausewr); +} + int Objecter::recalc_op_target(Op *op) { vector acting; @@ -1315,12 +1298,9 @@ int Objecter::recalc_op_target(Op *op) } osdmap->pg_to_acting_osds(pgid, acting); - bool paused = ((op->flags & CEPH_OSD_FLAG_WRITE && osdmap->test_flag(CEPH_OSDMAP_PAUSEWR)) || - (op->flags & CEPH_OSD_FLAG_READ && osdmap->test_flag(CEPH_OSDMAP_PAUSERD)) || - (op->flags & CEPH_OSD_FLAG_WRITE && osdmap->test_flag(CEPH_OSDMAP_FULL))); - bool need_resend = false; + bool paused = op_should_be_paused(op); if (!paused && paused != op->paused) { op->paused = false; need_resend = true; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 26485bc665fc1..37aa60720e0b0 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1114,6 +1114,7 @@ public: RECALC_OP_TARGET_OSD_DNE, RECALC_OP_TARGET_OSD_DOWN, }; + bool op_should_be_paused(Op *op); int recalc_op_target(Op *op); bool recalc_linger_op_target(LingerOp *op); -- 2.39.5