summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-02-07 17:16:49 -0800
committerYehuda Sadeh <yehuda@inktank.com>2013-02-07 17:16:49 -0800
commit8a2de334fed5c56919063bba8c60a3c73bd6534c (patch)
treed382d3b064415ed600cf659d3bad9ffe5bdbb659
parent278dfe50fd174e9bc8782976aabb09f2cf39d582 (diff)
parented2bb387708511b4910758d77c5a9754193eb48a (diff)
downloadceph-8a2de334fed5c56919063bba8c60a3c73bd6534c.tar.gz
Merge remote-tracking branch 'origin/master' into wip-2941-3
-rw-r--r--src/osd/OSD.cc13
-rw-r--r--src/osd/PG.cc12
-rw-r--r--src/osd/PG.h2
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();