]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: update PGPool to detect map gaps and reset cached_removed_snaps 11676/head
authorSamuel Just <sjust@redhat.com>
Thu, 19 May 2016 23:00:35 +0000 (16:00 -0700)
committerAlexey Sheplyakov <asheplyakov@mirantis.com>
Mon, 14 Nov 2016 09:34:45 +0000 (12:34 +0300)
Fixes: http://tracker.ceph.com/issues/15943
Signed-off-by: Samuel Just <sjust@redhat.com>
(cherry picked from commit 5798fb3bf6d726d14a9c5cb99dc5902eba5b878a)

Conflicts:
src/osd/OSD.cc: trivial, fuzz is too big so git prefers to be safe

src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h

index fc9674d099fd90a1c09d7a6071f6e57a64551d4c..707ef1c46620e874666e1506717d9ec8bcfa3ae0 100644 (file)
@@ -2538,14 +2538,8 @@ PGPool OSD::_get_pool(int id, OSDMapRef createmap)
     assert(0);
   }
 
-  PGPool p = PGPool(id, createmap->get_pool_name(id),
-                   createmap->get_pg_pool(id)->auid);
-    
-  const pg_pool_t *pi = createmap->get_pg_pool(id);
-  p.info = *pi;
-  p.snapc = pi->get_snap_context();
+  PGPool p = PGPool(createmap, id);
 
-  pi->build_removed_snaps(p.cached_removed_snaps);
   dout(10) << "_get_pool " << p.id << dendl;
   return p;
 }
index b8e7f274a8b2d2f898617f6a2de8ab2b880585e9..331b270e7e4a26251207e5f57031ce61714c2e9c 100644 (file)
@@ -156,7 +156,10 @@ void PGPool::update(OSDMapRef map)
   info = *pi;
   auid = pi->auid;
   name = map->get_pool_name(id);
-  if (pi->get_snap_epoch() == map->get_epoch()) {
+  bool updated = false;
+  if ((map->get_epoch() == cached_epoch + 1) &&
+      (pi->get_snap_epoch() == map->get_epoch())) {
+    updated = true;
     pi->build_removed_snaps(newly_removed_snaps);
     interval_set<snapid_t> intersection;
     intersection.intersection_of(newly_removed_snaps, cached_removed_snaps);
@@ -174,14 +177,14 @@ void PGPool::update(OSDMapRef map)
   } else {
     newly_removed_snaps.clear();
   }
+  cached_epoch = map->get_epoch();
   lgeneric_subdout(g_ceph_context, osd, 20)
     << "PGPool::update cached_removed_snaps "
     << cached_removed_snaps
     << " newly_removed_snaps "
     << newly_removed_snaps
     << " snapc " << snapc
-    << (pi->get_snap_epoch() == map->get_epoch() ?
-       " (updated)":" (no change)")
+    << (updated ? " (updated)":" (no change)")
     << dendl;
 }
 
index 935e7444514f1491f1a340863796fb4f0d975289..286c5ff3cc6afa74cc11c67ee0c455d9b3912a31 100644 (file)
@@ -161,6 +161,7 @@ struct PGRecoveryStats {
 };
 
 struct PGPool {
+  epoch_t cached_epoch;
   int64_t id;
   string name;
   uint64_t auid;
@@ -171,8 +172,17 @@ struct PGPool {
   interval_set<snapid_t> cached_removed_snaps;      // current removed_snaps set
   interval_set<snapid_t> newly_removed_snaps;  // newly removed in the last epoch
 
-  PGPool(int64_t i, const string& _name, uint64_t au)
-    : id(i), name(_name), auid(au) { }
+  PGPool(OSDMapRef map, int64_t i)
+    : cached_epoch(map->get_epoch()),
+      id(i),
+      name(map->get_pool_name(id)),
+      auid(map->get_pg_pool(id)->auid) {
+    const pg_pool_t *pi = map->get_pg_pool(id);
+    assert(pi);
+    info = *pi;
+    snapc = pi->get_snap_context();
+    pi->build_removed_snaps(cached_removed_snaps);
+  }
 
   void update(OSDMapRef map);
 };