From 30cdc3dde51a2cd9451c700d63ca73edcd9bb9e0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 30 Jul 2010 13:16:24 -0700 Subject: [PATCH] mon: drop redundant pg_temp mappings --- src/mon/OSDMonitor.cc | 28 ++++++++++++++++++++++++++-- src/mon/OSDMonitor.h | 2 ++ src/mon/PGMonitor.cc | 7 ++++--- src/osd/OSDMap.h | 7 ++++++- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index dd8d80342f4c..1166f4990003 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -123,10 +123,30 @@ bool OSDMonitor::update_from_paxos() send_to_waiting(); check_subs(); - + return true; } +void OSDMonitor::remove_redundant_pg_temp() +{ + dout(10) << "remove_redundant_pg_temp" << dendl; + bool removed = false; + + for (map >::iterator p = osdmap.pg_temp.begin(); + p != osdmap.pg_temp.end(); + p++) { + if (pending_inc.new_pg_temp.count(p->first) == 0) { + vector raw_up; + osdmap.pg_to_raw_up(p->first, raw_up); + if (raw_up == p->second) { + dout(10) << " removing unnecessary pg_temp " << p->first << " -> " << p->second << dendl; + pending_inc.new_pg_temp[p->first].clear(); + removed = true; + } + } + } +} + void OSDMonitor::create_pending() { @@ -134,6 +154,9 @@ void OSDMonitor::create_pending() pending_inc.fsid = mon->monmap->fsid; dout(10) << "create_pending e " << pending_inc.epoch << dendl; + + // drop any redundant pg_temp entries + remove_redundant_pg_temp(); } @@ -920,7 +943,8 @@ void OSDMonitor::tick() #endif // --------------- - if (do_propose) + if (do_propose || + !pending_inc.new_pg_temp.empty()) // also propose if we adjusted pg_temp propose_pending(); } diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 0ac005067226..f649aa331039 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -70,6 +70,8 @@ private: void send_incremental(PaxosServiceMessage *m, epoch_t since); void send_incremental(epoch_t from, entity_inst_t& dest); + void remove_redundant_pg_temp(); + bool preprocess_failure(class MOSDFailure *m); bool prepare_failure(class MOSDFailure *m); diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 8a993c07149c..dbc61059572c 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -676,9 +676,10 @@ bool PGMonitor::preprocess_command(MMonCommand *m) pg_t pgid; r = -EINVAL; if (pgid.parse(m->cmd[2].c_str())) { - vector acting; - mon->osdmon()->osdmap.pg_to_acting_osds(pgid, acting); - ss << "osdmap e" << mon->osdmon()->osdmap.get_epoch() << " pg " << pgid << " -> " << acting; + vector up, acting; + mon->osdmon()->osdmap.pg_to_up_acting_osds(pgid, up, acting); + ss << "osdmap e" << mon->osdmon()->osdmap.get_epoch() << " pg " << pgid + << " -> up " << up << " acting " << acting; r = 0; } else ss << "invalid pgid '" << m->cmd[2] << "'"; diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index ec8415be9e08..8483151d9799 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -855,7 +855,12 @@ private: return acting.size(); } - + void pg_to_raw_up(pg_t pg, vector& up) { + vector raw; + pg_to_osds(pg, raw); + raw_to_up_osds(pg, raw, up); + } + void pg_to_up_acting_osds(pg_t pg, vector& up, vector& acting) { vector raw; pg_to_osds(pg, raw); -- 2.47.3