]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: ignore missing object map during snap remove 10010/head
authorJason Dillaman <dillaman@redhat.com>
Thu, 23 Jun 2016 14:25:54 +0000 (10:25 -0400)
committerLoic Dachary <ldachary@redhat.com>
Wed, 29 Jun 2016 09:04:03 +0000 (11:04 +0200)
Fixes: http://tracker.ceph.com/issues/16350
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 68b296b0f107db39b16fa90c186fdc920d97170d)

src/librbd/object_map/SnapshotRemoveRequest.cc
src/librbd/object_map/SnapshotRemoveRequest.h
src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc

index c718af1da19ae18d1c91a40dfef7de598d89e75a..94c0952504a1499df5bdb9de6999f724dfad49e9 100644 (file)
@@ -72,6 +72,11 @@ bool SnapshotRemoveRequest::should_complete(int r) {
   bool finished = false;
   switch (m_state) {
   case STATE_LOAD_MAP:
+    if (r == -ENOENT) {
+      finished = true;
+      break;
+    }
+
     if (r == 0) {
       bufferlist::iterator it = m_out_bl.begin();
       r = cls_client::object_map_load_finish(&it, &m_snap_object_map);
index 64696784130e9bf0715303e5919af826aba9d7f4..3b196b13c574be9b8a3000373eec1f68dc53b869 100644 (file)
@@ -58,7 +58,8 @@ protected:
   virtual bool should_complete(int r);
 
   virtual int filter_return_code(int r) const {
-    if (m_state == STATE_REMOVE_MAP && r == -ENOENT) {
+    if ((m_state == STATE_LOAD_MAP || m_state == STATE_REMOVE_MAP) &&
+        r == -ENOENT) {
       return 0;
     }
     return r;
index c00a3e69f132f3269f130ee94a2bcb68733edcbe..215c214eb8b10be4110698367e53fae7e01412da 100644 (file)
@@ -101,6 +101,31 @@ TEST_F(TestMockObjectMapSnapshotRemoveRequest, Success) {
   expect_unlock_exclusive_lock(*ictx);
 }
 
+TEST_F(TestMockObjectMapSnapshotRemoveRequest, LoadMapMissing) {
+  REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF);
+
+  librbd::ImageCtx *ictx;
+  ASSERT_EQ(0, open_image(m_image_name, &ictx));
+  ASSERT_EQ(0, snap_create(*ictx, "snap1"));
+  ASSERT_EQ(0, ictx->state->refresh_if_required());
+
+  uint64_t snap_id = ictx->snap_info.rbegin()->first;
+  expect_load_map(ictx, snap_id, -ENOENT);
+
+  ceph::BitVector<2> object_map;
+  C_SaferCond cond_ctx;
+  AsyncRequest<> *request = new SnapshotRemoveRequest(
+    *ictx, &object_map, snap_id, &cond_ctx);
+  {
+    RWLock::RLocker owner_locker(ictx->owner_lock);
+    RWLock::WLocker snap_locker(ictx->snap_lock);
+    request->send();
+  }
+  ASSERT_EQ(0, cond_ctx.wait());
+
+  expect_unlock_exclusive_lock(*ictx);
+}
+
 TEST_F(TestMockObjectMapSnapshotRemoveRequest, LoadMapError) {
   REQUIRE_FEATURE(RBD_FEATURE_FAST_DIFF);