diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-02-07 17:16:49 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-02-07 17:16:49 -0800 |
commit | 8a2de334fed5c56919063bba8c60a3c73bd6534c (patch) | |
tree | d382d3b064415ed600cf659d3bad9ffe5bdbb659 | |
parent | 278dfe50fd174e9bc8782976aabb09f2cf39d582 (diff) | |
parent | ed2bb387708511b4910758d77c5a9754193eb48a (diff) | |
download | ceph-8a2de334fed5c56919063bba8c60a3c73bd6534c.tar.gz |
Merge remote-tracking branch 'origin/master' into wip-2941-3
-rw-r--r-- | src/osd/OSD.cc | 13 | ||||
-rw-r--r-- | src/osd/PG.cc | 12 | ||||
-rw-r--r-- | src/osd/PG.h | 2 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6247c40a4c5..f09055e5bc8 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1513,6 +1513,7 @@ void OSD::load_pgs() derr << "failed to list pgs: " << cpp_strerror(-r) << dendl; } + map<pg_t, interval_set<snapid_t> > pgs; for (vector<coll_t>::iterator it = ls.begin(); it != ls.end(); it++) { @@ -1546,8 +1547,16 @@ void OSD::load_pgs() if (snap != CEPH_NOSNAP) { dout(10) << "load_pgs skipping snapped dir " << *it << " (pg " << pgid << " snap " << snap << ")" << dendl; + pgs[pgid].insert(snap); continue; } + pgs[pgid]; + } + + for (map<pg_t, interval_set<snapid_t> >::iterator i = pgs.begin(); + i != pgs.end(); + ++i) { + pg_t pgid(i->first); if (!osdmap->have_pg_pool(pgid.pool())) { dout(10) << __func__ << ": skipping PG " << pgid << " because we don't have pool " @@ -1562,13 +1571,15 @@ void OSD::load_pgs() } bufferlist bl; - epoch_t map_epoch = PG::peek_map_epoch(store, *it, &bl); + epoch_t map_epoch = PG::peek_map_epoch(store, coll_t(pgid), &bl); PG *pg = _open_lock_pg(map_epoch == 0 ? osdmap : service.get_map(map_epoch), pgid); // read pg state, log pg->read_state(store, bl); + pg->check_ondisk_snap_colls(i->second); + set<pg_t> split_pgs; if (osdmap->have_pg_pool(pg->info.pgid.pool()) && pg->info.pgid.is_split(pg->get_osdmap()->get_pg_num(pg->info.pgid.pool()), diff --git a/src/osd/PG.cc b/src/osd/PG.cc index fc3f8c24b1f..595cd3fdf7b 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3134,6 +3134,18 @@ void PG::sub_op_scrub_stop(OpRequestRef op) osd->send_message_osd_cluster(reply, m->get_connection()); } + +void PG::check_ondisk_snap_colls( + const interval_set<snapid_t> &ondisk_snapcolls) +{ + if (!(ondisk_snapcolls == snap_collections)) { + derr << "ondisk_snapcolls: " << ondisk_snapcolls + << " does not match snap_collections " << snap_collections + << " repairing." << dendl; + snap_collections = ondisk_snapcolls; + } +} + void PG::clear_scrub_reserved() { osd->scrub_wq.dequeue(this); diff --git a/src/osd/PG.h b/src/osd/PG.h index ba80f8186e6..68e886802b5 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1002,6 +1002,8 @@ public: ino_t hino, const hobject_t &hoid, const map<string, bufferptr> &attrs, set<snapid_t> *snapcolls) {}; + void check_ondisk_snap_colls( + const interval_set<snapid_t> &ondisk_snapcolls); void clear_scrub_reserved(); void scrub_reserve_replicas(); void scrub_unreserve_replicas(); |