From da33733fcdf80963012736596b4d283db812a327 Mon Sep 17 00:00:00 2001 From: lixiaoy1 Date: Fri, 11 Sep 2020 10:26:39 -0400 Subject: [PATCH] librbd/internal: update invalidate_cache Except invalidating object cache, invalidate image writeback cache. Signed-off-by: Li, Xiaoyan --- src/librbd/cache/pwl/DiscardRequest.cc | 3 +++ src/librbd/internal.cc | 20 ++++++++++++++++++-- src/test/librbd/test_librbd.cc | 2 ++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/librbd/cache/pwl/DiscardRequest.cc b/src/librbd/cache/pwl/DiscardRequest.cc index 32a0077d4e78..80ccd5abca07 100644 --- a/src/librbd/cache/pwl/DiscardRequest.cc +++ b/src/librbd/cache/pwl/DiscardRequest.cc @@ -62,6 +62,7 @@ void DiscardRequest::send() { #endif } +#if defined(WITH_RBD_RWL) template void DiscardRequest::delete_image_cache_file() { CephContext *cct = m_image_ctx.cct; @@ -147,6 +148,8 @@ void DiscardRequest::handle_remove_feature_bit(int r) { finish(); } +#endif // WITH_RBD_RWL + template void DiscardRequest::finish() { #if defined(WITH_RBD_RWL) diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index d895d1f35e6d..50a3a0f38d31 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -36,6 +36,7 @@ #include "librbd/api/Config.h" #include "librbd/api/Image.h" #include "librbd/api/Io.h" +#include "librbd/cache/Utils.h" #include "librbd/exclusive_lock/AutomaticPolicy.h" #include "librbd/exclusive_lock/StandardPolicy.h" #include "librbd/deep_copy/MetadataCopyRequest.h" @@ -45,6 +46,7 @@ #include "librbd/image/Types.h" #include "librbd/io/AioCompletion.h" #include "librbd/io/ImageRequest.h" +#include "librbd/io/ImageDispatcherInterface.h" #include "librbd/io/ObjectDispatcherInterface.h" #include "librbd/io/ObjectRequest.h" #include "librbd/io/ReadResult.h" @@ -1610,11 +1612,25 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { C_SaferCond ctx; { - std::shared_lock owner_locker{ictx->owner_lock}; - ictx->io_object_dispatcher->invalidate_cache(&ctx); + ictx->io_image_dispatcher->invalidate_cache(&ctx); } r = ctx.wait(); + + if (r < 0) { + ldout(cct, 20) << "failed to invalidate image cache" << dendl; + return r; + } + ictx->perfcounter->inc(l_librbd_invalidate_cache); + + // Delete writeback cache if it is not initialized + if ((!ictx->exclusive_lock || + !ictx->exclusive_lock->is_lock_owner()) && + ictx->test_features(RBD_FEATURE_DIRTY_CACHE)) { + C_SaferCond ctx3; + librbd::cache::util::discard_cache<>(*ictx, &ctx3); + r = ctx3.wait(); + } return r; } diff --git a/src/test/librbd/test_librbd.cc b/src/test/librbd/test_librbd.cc index 93164f616733..fa556fc6a6f3 100644 --- a/src/test/librbd/test_librbd.cc +++ b/src/test/librbd/test_librbd.cc @@ -4538,6 +4538,8 @@ TEST_F(TestLibRBD, TestPendingAio) false, features)); ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL)); + ASSERT_EQ(0, rbd_invalidate_cache(image)); + char test_data[TEST_IO_SIZE]; for (size_t i = 0; i < TEST_IO_SIZE; ++i) { test_data[i] = (char) (rand() % (126 - 33) + 33); -- 2.47.3