From: Sage Weil Date: Mon, 24 Sep 2018 18:03:05 +0000 (-0500) Subject: mgr/DaemonServer: prevent merge if either pg is remapped|upmap X-Git-Tag: v14.1.0~1136^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=550dcd53bb6db4f6b9d3b941f101332ac17a0168;p=ceph.git mgr/DaemonServer: prevent merge if either pg is remapped|upmap Remapping means they could be on different OSDs. Fixes: http://tracker.ceph.com/issues/36166 Signed-off-by: Sage Weil --- diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index c643cd8aaf29..374fd4e1e63b 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -2282,6 +2282,23 @@ void DaemonServer::adjust_pgs() pg_t merge_source(p.get_pg_num() - 1, i.first); pg_t merge_target = merge_source.get_parent(); bool ok = true; + + if (osdmap.have_pg_upmaps(merge_target)) { + dout(10) << "pool " << i.first + << " pg_num_target " << p.get_pg_num_target() + << " pg_num " << p.get_pg_num() + << " - merge target " << merge_target + << " has upmap" << dendl; + ok = false; + } else if (osdmap.have_pg_upmaps(merge_source)) { + dout(10) << "pool " << i.first + << " pg_num_target " << p.get_pg_num_target() + << " pg_num " << p.get_pg_num() + << " - merge source " << merge_source + << " has upmap" << dendl; + ok = false; + } + auto q = pg_map.pg_stat.find(merge_source); if (p.get_pg_num() != p.get_pg_num_pending()) { dout(10) << "pool " << i.first @@ -2315,7 +2332,15 @@ void DaemonServer::adjust_pgs() << " not clean (" << pg_state_string(q->second.state) << ")" << dendl; ok = false; + } else if (q->second.state & PG_STATE_REMAPPED) { + dout(10) << "pool " << i.first + << " pg_num_target " << p.get_pg_num_target() + << " pg_num " << p.get_pg_num() + << " - merge source " << merge_source + << " remapped" << dendl; + ok = false; } + q = pg_map.pg_stat.find(merge_target); if (q == pg_map.pg_stat.end()) { dout(10) << "pool " << i.first @@ -2334,6 +2359,13 @@ void DaemonServer::adjust_pgs() << " not clean (" << pg_state_string(q->second.state) << ")" << dendl; ok = false; + } else if (q->second.state & PG_STATE_REMAPPED) { + dout(10) << "pool " << i.first + << " pg_num_target " << p.get_pg_num_target() + << " pg_num " << p.get_pg_num() + << " - merge target " << merge_target + << " remapped" << dendl; + ok = false; } if (ok) { unsigned target = p.get_pg_num() - 1; diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index abaaddb5afad..52f7fd4f8832 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -1381,6 +1381,11 @@ public: int get_osds_by_bucket_name(const string &name, set *osds) const; + bool have_pg_upmaps(pg_t pg) const { + return pg_upmap.count(pg) || + pg_upmap_items.count(pg); + } + /* * handy helpers to build simple maps... */