summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <samuel.just@dreamhost.com>2012-04-30 09:49:57 -0700
committerSamuel Just <samuel.just@dreamhost.com>2012-04-30 09:49:57 -0700
commit3adaea723e0396c5480c97b03792beddb0dd6bbf (patch)
tree72aa2a0bca94b546e4ba20cde149c305c0703656
parent0aea1cb1df5c3e5ab783ca6f2ed7649823b613c5 (diff)
downloadceph-3adaea723e0396c5480c97b03792beddb0dd6bbf.tar.gz
OSD: work around inconsistent pool/self-managed snapshot state
Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
-rw-r--r--src/osd/OSD.cc5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc
index 787d4f7391c..a5398e94cbf 100644
--- a/src/osd/OSD.cc
+++ b/src/osd/OSD.cc
@@ -3472,7 +3472,10 @@ void OSD::advance_map(ObjectStore::Transaction& t, C_Contexts *tfin)
if (pi->get_snap_epoch() == osdmap->get_epoch()) {
pi->build_removed_snaps(pool->newly_removed_snaps);
- pool->newly_removed_snaps.subtract(pool->cached_removed_snaps);
+ interval_set<snapid_t> intersection;
+ intersection.intersection_of(pool->cached_removed_snaps,
+ pool->newly_removed_snaps);
+ pool->newly_removed_snaps.subtract(intersection);
pool->cached_removed_snaps.union_of(pool->newly_removed_snaps);
dout(10) << " pool " << p->first << " removed_snaps " << pool->cached_removed_snaps
<< ", newly so are " << pool->newly_removed_snaps << ")"