From: xie xingguo Date: Wed, 21 Nov 2018 06:25:45 +0000 (+0800) Subject: mon: auto clean up stale upmap items X-Git-Tag: v14.1.0~752^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F25196%2Fhead;p=ceph.git mon: auto clean up stale upmap items See https://www.spinics.net/lists/ceph-users/msg49518.html Signed-off-by: xie xingguo --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 87d388ccca8b..a6037b7d95c9 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1859,6 +1859,7 @@ void OSDMap::maybe_remove_pg_upmaps(CephContext *cct, } } } + nextmap.clean_pg_upmaps(cct, pending_inc); } int OSDMap::apply_incremental(const Incremental &inc) @@ -4186,7 +4187,7 @@ int OSDMap::summarize_mapping_stats( int OSDMap::clean_pg_upmaps( CephContext *cct, - Incremental *pending_inc) + Incremental *pending_inc) const { ldout(cct, 10) << __func__ << dendl; int changed = 0; diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index ecd0bd523ea6..f0f9e70a647e 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -1364,7 +1364,7 @@ public: int clean_pg_upmaps( CephContext *cct, - Incremental *pending_inc); + Incremental *pending_inc) const; bool try_pg_upmap( CephContext *cct, diff --git a/src/test/osd/TestOSDMap.cc b/src/test/osd/TestOSDMap.cc index c812daab47cf..e4b70b365f2f 100644 --- a/src/test/osd/TestOSDMap.cc +++ b/src/test/osd/TestOSDMap.cc @@ -601,6 +601,41 @@ TEST_F(OSDMapTest, CleanPGUpmaps) { ASSERT_TRUE(parent_0 != parent_1); } + { + // cancel stale upmaps + osdmap.pg_to_raw_up(pgid, &up, &up_primary); + int from = -1; + for (int i = 0; i < (int)get_num_osds(); i++) { + if (std::find(up.begin(), up.end(), i) == up.end()) { + from = i; + break; + } + } + ASSERT_TRUE(from >= 0); + int to = -1; + for (int i = 0; i < (int)get_num_osds(); i++) { + if (std::find(up.begin(), up.end(), i) == up.end() && i != from) { + to = i; + break; + } + } + ASSERT_TRUE(to >= 0); + vector> new_pg_upmap_items; + new_pg_upmap_items.push_back(make_pair(from, to)); + OSDMap::Incremental pending_inc(osdmap.get_epoch() + 1); + pending_inc.new_pg_upmap_items[pgid] = + mempool::osdmap::vector>( + new_pg_upmap_items.begin(), new_pg_upmap_items.end()); + OSDMap nextmap; + nextmap.deepish_copy_from(osdmap); + nextmap.apply_incremental(pending_inc); + ASSERT_TRUE(nextmap.have_pg_upmaps(pgid)); + OSDMap::Incremental new_pending_inc(nextmap.get_epoch() + 1); + nextmap.clean_pg_upmaps(g_ceph_context, &new_pending_inc); + nextmap.apply_incremental(new_pending_inc); + ASSERT_TRUE(!nextmap.have_pg_upmaps(pgid)); + } + { // TEST pg_upmap {