summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-02-07 16:04:59 -0800
committerSamuel Just <sam.just@inktank.com>2013-02-07 16:16:04 -0800
commited2bb387708511b4910758d77c5a9754193eb48a (patch)
treedc5320978de1d6ca63933ba2a29f8a8fe9f9750b
parent55f857962fc584e7e95babbd10a3c53aab63060a (diff)
downloadceph-ed2bb387708511b4910758d77c5a9754193eb48a.tar.gz
OSD: check pg snap collections on start up
Backport: bobtail Signed-off-by: Samuel Just <sam.just@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/osd/OSD.cc2
-rw-r--r--src/osd/PG.cc12
-rw-r--r--src/osd/PG.h2
3 files changed, 16 insertions, 0 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 00e138ea22f..f09055e5bc8 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -1578,6 +1578,8 @@ void OSD::load_pgs()
// 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();