From: John Spray Date: Tue, 15 Sep 2015 13:05:13 +0000 (+0100) Subject: osdc: fix honor_osdmap_full X-Git-Tag: v9.1.0~100^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4d5d15c20a10c0e44f7067ee7f1ae94988c0c443;p=ceph.git osdc: fix honor_osdmap_full This was being ignored in new code that tested the per-pool full flags. Refactor it so that all the tests of full flags go through _osdmap_pool_full and thereby experience the honor_osdmap_full policy. Fixes: #12971 Signed-off-by: John Spray --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index eeb11f6b90c55..7c96739bfe0e9 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1020,7 +1020,7 @@ void Objecter::handle_osd_map(MOSDMap *m) map pool_full_map; for (map::const_iterator it = osdmap->get_pools().begin(); it != osdmap->get_pools().end(); it++) - pool_full_map[it->first] = it->second.has_flag(pg_pool_t::FLAG_FULL); + pool_full_map[it->first] = _osdmap_pool_full(it->second); list need_resend_linger; @@ -2379,7 +2379,9 @@ bool Objecter::target_should_be_paused(op_target_t *t) { const pg_pool_t *pi = osdmap->get_pg_pool(t->base_oloc.pool); bool pauserd = osdmap->test_flag(CEPH_OSDMAP_PAUSERD); - bool pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || _osdmap_full_flag() || pi->has_flag(pg_pool_t::FLAG_FULL); + bool pausewr = osdmap->test_flag(CEPH_OSDMAP_PAUSEWR) || + _osdmap_full_flag() || + _osdmap_pool_full(*pi); return (t->flags & CEPH_OSD_FLAG_READ && pauserd) || (t->flags & CEPH_OSD_FLAG_WRITE && pausewr) || @@ -2415,19 +2417,24 @@ bool Objecter::_osdmap_pool_full(const int64_t pool_id) const return false; } - return pool->has_flag(pg_pool_t::FLAG_FULL); + return _osdmap_pool_full(*pool); } bool Objecter::_osdmap_has_pool_full() const { for (map::const_iterator it = osdmap->get_pools().begin(); it != osdmap->get_pools().end(); it++) { - if (it->second.has_flag(pg_pool_t::FLAG_FULL)) + if (_osdmap_pool_full(it->second)) return true; } return false; } +bool Objecter::_osdmap_pool_full(const pg_pool_t &p) const +{ + return p.has_flag(pg_pool_t::FLAG_FULL) && honor_osdmap_full; +} + /** * Wrapper around osdmap->test_flag for special handling of the FULL flag. */ @@ -2442,9 +2449,9 @@ void Objecter::update_pool_full_map(map& pool_full_map) for (map::const_iterator it = osdmap->get_pools().begin(); it != osdmap->get_pools().end(); it++) { if (pool_full_map.find(it->first) == pool_full_map.end()) { - pool_full_map[it->first] = it->second.has_flag(pg_pool_t::FLAG_FULL); + pool_full_map[it->first] = _osdmap_pool_full(it->second); } else { - pool_full_map[it->first] = it->second.has_flag(pg_pool_t::FLAG_FULL) || pool_full_map[it->first]; + pool_full_map[it->first] = _osdmap_pool_full(it->second) || pool_full_map[it->first]; } } } diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 06c68b27d2bac..a8c2bc3ea108b 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1734,6 +1734,7 @@ public: */ bool osdmap_pool_full(const int64_t pool_id) const; bool _osdmap_pool_full(const int64_t pool_id) const; + bool _osdmap_pool_full(const pg_pool_t &p) const; void update_pool_full_map(map& pool_full_map); private: