From 4181aa86906886423af80e478e45554606fc7cf6 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Wed, 21 Nov 2018 14:25:45 +0800 Subject: [PATCH] mon: auto clean up stale upmap items See https://www.spinics.net/lists/ceph-users/msg49518.html Signed-off-by: xie xingguo --- src/osd/OSDMap.cc | 3 ++- src/osd/OSDMap.h | 2 +- src/test/osd/TestOSDMap.cc | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) 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 { -- 2.47.3