From 4bf9078286d58c2cd4e85cb8b31411220a377092 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sat, 15 Dec 2012 17:45:25 -0800 Subject: [PATCH] osdc/Objecter: prevent pool dne check from invalidating scan_requests iterator We iterate over ops and, if the pool dne and other conditions are true, we will immediately return ENOENT and cancel an op. Increment the iterator at the top of the loop to avoid invalidating it. We also need to switch to a map<>, because hash_map<> mutations may invalidate any/all iterators. Fixes: #3613 Signed-off-by: Sage Weil --- src/osdc/Objecter.cc | 14 +++++++------- src/osdc/Objecter.h | 3 +-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9d7fe67cf9d2e..e29d879133b42 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -439,10 +439,10 @@ void Objecter::scan_requests(bool skipped_map, } // check for changed request mappings - for (hash_map::iterator p = ops.begin(); - p != ops.end(); - ++p) { + map::iterator p = ops.begin(); + while (p != ops.end()) { Op *op = p->second; + ++p; // check_op_pool_dne() may touch ops; prevent iterator invalidation ldout(cct, 10) << " checking op " << op->tid << dendl; int r = recalc_op_target(op); switch (r) { @@ -568,7 +568,7 @@ void Objecter::handle_osd_map(MOSDMap *m) // unpause requests? if ((was_pauserd && !pauserd) || (was_pausewr && !pausewr)) - for (hash_map::iterator p = ops.begin(); + for (map::iterator p = ops.begin(); p != ops.end(); p++) { Op *op = p->second; @@ -900,7 +900,7 @@ void Objecter::tick() cutoff -= cct->_conf->objecter_timeout; // timeout unsigned laggy_ops = 0; - for (hash_map::iterator p = ops.begin(); + for (map::iterator p = ops.begin(); p != ops.end(); p++) { Op *op = p->second; @@ -2010,7 +2010,7 @@ void Objecter::ms_handle_remote_reset(Connection *con) void Objecter::dump_active() { ldout(cct, 20) << "dump_active .. " << num_homeless_ops << " homeless" << dendl; - for (hash_map::iterator p = ops.begin(); p != ops.end(); p++) { + for (map::iterator p = ops.begin(); p != ops.end(); p++) { Op *op = p->second; ldout(cct, 20) << op->tid << "\t" << op->pgid << "\tosd." << (op->session ? op->session->osd : -1) << "\t" << op->oid << "\t" << op->ops << dendl; @@ -2033,7 +2033,7 @@ void Objecter::dump_requests(Formatter& fmt) const void Objecter::dump_ops(Formatter& fmt) const { fmt.open_array_section("ops"); - for (hash_map::const_iterator p = ops.begin(); + for (map::const_iterator p = ops.begin(); p != ops.end(); ++p) { Op *op = p->second; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index e23f32a8d0f08..bba7e9944c213 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -28,7 +28,6 @@ #include #include #include -#include using namespace std; using namespace __gnu_cxx; @@ -884,7 +883,7 @@ public: private: // pending ops - hash_map ops; + map ops; int num_homeless_ops; map linger_ops; map poolstat_ops; -- 2.39.5