]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: invalidate cache before trimming image
authorJason Dillaman <dillaman@redhat.com>
Thu, 8 Sep 2016 13:59:37 +0000 (09:59 -0400)
committerJason Dillaman <dillaman@redhat.com>
Fri, 9 Sep 2016 12:22:47 +0000 (08:22 -0400)
Any potential writeback outside the extents of a shrunk image
would result in orphaned objects.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/operation/ResizeRequest.cc
src/librbd/operation/ResizeRequest.h
src/test/librbd/operation/test_mock_ResizeRequest.cc

index 6fb50ae6f15a7a1013dd094cb8f6d6f5659d31f9..86cb8a85d3bf03003b5e3398481c65af7aaf228a 100644 (file)
@@ -175,7 +175,7 @@ Context *ResizeRequest<I>::handle_trim_image(int *result) {
     return this->create_context_finisher(*result);
   }
 
-  send_invalidate_cache();
+  send_post_block_writes();
   return nullptr;
 }
 
@@ -205,7 +205,7 @@ Context *ResizeRequest<I>::handle_invalidate_cache(int *result) {
     return this->create_context_finisher(*result);
   }
 
-  send_post_block_writes();
+  send_trim_image();
   return nullptr;
 }
 
@@ -222,7 +222,7 @@ Context *ResizeRequest<I>::send_grow_object_map() {
   if (m_original_size == m_new_size) {
     return this->create_context_finisher(0);
   } else if (m_new_size < m_original_size) {
-    send_trim_image();
+    send_invalidate_cache();
     return nullptr;
   }
 
index 069718e0889e6a8aba58e1446440cd1fb8f8717a..394a89e3ed87a2216c3828177a27317767b9cde7 100644 (file)
@@ -80,10 +80,10 @@ private:
    *    |           STATE_UPDATE_HEADER ----------------------------\
    *    |                                                           |
    *    | (shrink)                                                  |
-   *    |\--------> STATE_TRIM_IMAGE                                |
+   *    |\--------> STATE_INVALIDATE_CACHE                          |
    *    |                 |                                         |
    *    |                 v                                         |
-   *    |           STATE_INVALIDATE_CACHE                          |
+   *    |           STATE_TRIM_IMAGE                                |
    *    |                 |                                         |
    *    |                 v                                         |
    *    |           STATE_POST_BLOCK_WRITES                         |
index b7cf365eae019d30c31ce774898e30c0f6dbf5a7..4f3777bce85d094097736f0992cf5106a05b5557 100644 (file)
@@ -203,8 +203,8 @@ TEST_F(TestMockOperationResizeRequest, ShrinkSuccess) {
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
-  expect_trim(mock_image_ctx, mock_trim_request, 0);
   expect_invalidate_cache(mock_image_ctx, 0);
+  expect_trim(mock_image_ctx, mock_trim_request, 0);
   expect_block_writes(mock_image_ctx, 0);
   expect_update_header(mock_image_ctx, 0);
   expect_shrink_object_map(mock_image_ctx);
@@ -264,6 +264,7 @@ TEST_F(TestMockOperationResizeRequest, TrimError) {
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
+  expect_invalidate_cache(mock_image_ctx, 0);
   expect_trim(mock_image_ctx, mock_trim_request, -EINVAL);
   expect_commit_op_event(mock_image_ctx, -EINVAL);
   ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, true, 0, false));
@@ -286,7 +287,6 @@ TEST_F(TestMockOperationResizeRequest, InvalidateCacheError) {
   expect_unblock_writes(mock_image_ctx);
 
   MockTrimRequest mock_trim_request;
-  expect_trim(mock_image_ctx, mock_trim_request, 0);
   expect_invalidate_cache(mock_image_ctx, -EINVAL);
   expect_commit_op_event(mock_image_ctx, -EINVAL);
   ASSERT_EQ(-EINVAL, when_resize(mock_image_ctx, ictx->size / 2, true, 0, false));