pending wire, disk format changes
+- add v to PGMap, PGMap::Incremental
bugs
- mds memory leak
- rename: importing inode... also journal imported client map?
mon
+- don't allow lpg_num expansion and osd addition at the same time?
- how to shrink cluster?
- how to tell osd to cleanly shut down
- mds injectargs N should take mds# or id. * should bcast to standy mds's.
set<int> osd_stat_rm;
epoch_t osdmap_epoch;
epoch_t pg_scan; // osdmap epoch
+ set<pg_t> pg_remove;
void encode(bufferlist &bl) const {
::encode(version, bl);
::encode(osd_stat_rm, bl);
::encode(osdmap_epoch, bl);
::encode(pg_scan, bl);
+ ::encode(pg_remove, bl);
}
void decode(bufferlist::iterator &bl) {
::decode(version, bl);
::decode(osd_stat_rm, bl);
::decode(osdmap_epoch, bl);
::decode(pg_scan, bl);
+ if (!bl.end())
+ ::decode(pg_remove, bl);
}
Incremental() : version(0), osdmap_epoch(0), pg_scan(0) {}
nearfull_osds.erase(from);
}
}
+ for (set<pg_t>::iterator p = inc.pg_remove.begin();
+ p != inc.pg_remove.end();
+ p++) {
+ if (pg_set.count(*p)) {
+ pg_set.erase(*p);
+ stat_pg_sub(*p, pg_stat[*p]);
+ pg_stat.erase(*p);
+ }
+ }
for (set<int>::iterator p = inc.osd_stat_rm.begin();
p != inc.osd_stat_rm.end();
stat_osd_sub(osd_stat[*p]);
osd_stat.erase(*p);
}
+
if (inc.osdmap_epoch)
last_osdmap_epoch = inc.osdmap_epoch;
if (inc.pg_scan)
}
}
}
- dout(10) << "register_new_pgs registered " << created << " new pgs" << dendl;
- if (created) {
+
+ int max = MIN(osdmap->get_max_osd(), osdmap->crush.get_max_devices());
+ int removed = 0;
+ for (set<pg_t>::iterator p = pg_map.creating_pgs.begin();
+ p != pg_map.creating_pgs.end();
+ p++)
+ if (p->preferred() >= max) {
+ dout(20) << " removing creating_pg " << *p << " because preferred >= max osd or crush device" << dendl;
+ pending_inc.pg_remove.insert(*p);
+ removed++;
+ }
+
+ dout(10) << "register_new_pgs registered " << created << " new pgs, removed "
+ << removed << " uncreated pgs" << dendl;
+ if (created || removed) {
pending_inc.pg_scan = epoch;
return true;
}
map<int, MOSDPGCreate*> msg;
utime_t now = g_clock.now();
+
+ OSDMap *osdmap = &mon->osdmon()->osdmap;
+ int max = MIN(osdmap->get_max_osd(), osdmap->crush.get_max_devices());
for (set<pg_t>::iterator p = pg_map.creating_pgs.begin();
p != pg_map.creating_pgs.end();
}
int osd = acting[0];
+ // don't send creates for non-existant preferred osds!
+ if (pgid.preferred() >= max)
+ continue;
+
// throttle?
if (last_sent_pg_create.count(osd) &&
now - g_conf.mon_pg_create_interval < last_sent_pg_create[osd])