From: Kefu Chai Date: Sun, 29 Oct 2017 11:07:54 +0000 (+0800) Subject: osd: remember is_primary when adding pending creating pgs X-Git-Tag: v12.2.3~10^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=69e8a0ab28c53303030423ac795577564827dbaa;p=ceph.git osd: remember is_primary when adding pending creating pgs so mgr can avoid calculating the same PG from different OSDs. Signed-off-by: Kefu Chai (cherry picked from commit 486515ae884b91571a9066296680fff78f93f66d) --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 2a26bb8fe2e..8628d0c5472 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4435,7 +4435,8 @@ bool OSD::maybe_wait_for_max_pg(spg_t pgid, bool is_mon_create) if (is_mon_create) { pending_creates_from_mon++; } else { - pending_creates_from_osd.emplace(pgid.pgid); + bool is_primary = osdmap->get_pg_acting_rank(pgid.pgid, whoami) == 0; + pending_creates_from_osd.emplace(pgid.pgid, is_primary); } dout(5) << __func__ << " withhold creation of pg " << pgid << ": " << pg_map.size() << " >= "<< max_pgs_per_osd << dendl; @@ -4485,8 +4486,8 @@ void OSD::resume_creating_pg() pgtemp = new MOSDPGTemp{osdmap->get_epoch()}; } vector acting; - osdmap->pg_to_up_acting_osds(*pg, nullptr, nullptr, &acting, nullptr); - pgtemp->pg_temp[*pg] = twiddle(acting); + osdmap->pg_to_up_acting_osds(pg->first, nullptr, nullptr, &acting, nullptr); + pgtemp->pg_temp[pg->first] = twiddle(acting); pg = pending_creates_from_osd.erase(pg); spare_pgs--; } @@ -8326,7 +8327,7 @@ void OSD::consume_map() lock_guard pending_creates_locker{pending_creates_lock}; for (auto pg = pending_creates_from_osd.cbegin(); pg != pending_creates_from_osd.cend();) { - if (osdmap->get_pg_acting_rank(*pg, whoami) < 0) { + if (osdmap->get_pg_acting_rank(pg->first, whoami) < 0) { pg = pending_creates_from_osd.erase(pg); } else { ++pg; diff --git a/src/osd/OSD.h b/src/osd/OSD.h index e34bd518e7b..235dfaa8163 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1947,7 +1947,8 @@ protected: ceph::unordered_map pg_map; // protected by pg_map lock std::mutex pending_creates_lock; - std::set pending_creates_from_osd; + using create_from_osd_t = std::pair; + std::set pending_creates_from_osd; unsigned pending_creates_from_mon = 0; map > peering_wait_for_split;