From 195980e63942b5feb29dd7fe0421e50fac2f01d6 Mon Sep 17 00:00:00 2001 From: Yin Congmin Date: Mon, 27 Dec 2021 15:06:49 +0800 Subject: [PATCH] rbd: add persistent-cache flush command Add a flush command so that users can manually flush cache. [ idryomov: error messages, incorporate doc and help.t hunks, drop do_persistent_cache_flush() ] Signed-off-by: Yin Congmin Signed-off-by: Ilya Dryomov (cherry picked from commit 644fbc9fcc8f12eb93d5cc20054cd8598ab001b7) --- doc/rbd/rbd-persistent-write-back-cache.rst | 15 ++++++ src/test/cli/rbd/help.t | 18 +++++++ src/tools/rbd/action/PersistentCache.cc | 53 +++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/doc/rbd/rbd-persistent-write-back-cache.rst b/doc/rbd/rbd-persistent-write-back-cache.rst index 5ac70714e709e..8066014e997b0 100644 --- a/doc/rbd/rbd-persistent-write-back-cache.rst +++ b/doc/rbd/rbd-persistent-write-back-cache.rst @@ -98,6 +98,21 @@ For example:: hit_bytes: 192 MiB / 66% miss_bytes: 97 MiB +Flush Cache +----------- + +To flush a cache file with ``rbd``, specify the ``persistent-cache flush`` +command, the pool name and the image name. :: + + rbd persistent-cache flush {pool-name}/{image-name} + +If the application dies unexpectedly, this command can also be used to flush +the cache back to OSDs. + +For example:: + + $ rbd persistent-cache flush rbd/foo + Invalidate Cache ---------------- diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 563c5571a4aa0..1eee504602cad 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -123,6 +123,7 @@ object-map rebuild Rebuild an invalid object map. perf image iostat Display image IO statistics. perf image iotop Display a top-like IO monitor. + persistent-cache flush Flush persistent cache. persistent-cache invalidate Invalidate (discard) existing / dirty persistent cache. pool init Initialize pool for use by RBD. @@ -2107,6 +2108,23 @@ -p [ --pool ] arg pool name --namespace arg namespace name + rbd help persistent-cache flush + usage: rbd persistent-cache flush [--pool ] [--namespace ] + [--image ] [--image-id ] + + + Flush persistent cache. + + Positional arguments + image specification + (example: [/[/]]) + + Optional arguments + -p [ --pool ] arg pool name + --namespace arg namespace name + --image arg image name + --image-id arg image id + rbd help persistent-cache invalidate usage: rbd persistent-cache invalidate [--pool ] diff --git a/src/tools/rbd/action/PersistentCache.cc b/src/tools/rbd/action/PersistentCache.cc index 75ee8ed7d8976..949006b828fc4 100644 --- a/src/tools/rbd/action/PersistentCache.cc +++ b/src/tools/rbd/action/PersistentCache.cc @@ -59,10 +59,63 @@ int execute_invalidate(const po::variables_map &vm, return 0; } +void get_arguments_flush(po::options_description *positional, + po::options_description *options) { + at::add_image_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE); + at::add_image_id_option(options); +} + +int execute_flush(const po::variables_map &vm, + const std::vector &ceph_global_init_args) { + size_t arg_index = 0; + std::string pool_name; + std::string namespace_name; + std::string image_name; + std::string snap_name; + int r = utils::get_pool_image_snapshot_names( + vm, at::ARGUMENT_MODIFIER_NONE, &arg_index, &pool_name, &namespace_name, + &image_name, &snap_name, true, utils::SNAPSHOT_PRESENCE_NONE, + utils::SPEC_VALIDATION_NONE); + if (r < 0) { + return r; + } + + librados::Rados rados; + librados::IoCtx io_ctx; + librbd::Image image; + r = utils::init_and_open_image(pool_name, namespace_name, image_name, "", "", + false, &rados, &io_ctx, &image); + if (r < 0) { + return r; + } + + uint64_t features; + r = image.features(&features); + if (r < 0) { + return r; + } + + if (features & RBD_FEATURE_DIRTY_CACHE) { + r = image.flush(); + if (r < 0) { + std::cerr << "rbd: flushing persistent cache failed: " + << cpp_strerror(r) << std::endl; + return r; + } + } else { + std::cout << "rbd: persistent cache is clean or disabled" << std::endl; + } + + return 0; +} + Shell::Action action_invalidate( {"persistent-cache", "invalidate"}, {}, "Invalidate (discard) existing / dirty persistent cache.", "", &get_arguments_invalidate, &execute_invalidate); +Shell::Action action_flush( + {"persistent-cache", "flush"}, {}, "Flush persistent cache.", "", + &get_arguments_flush, &execute_flush); } // namespace persistent_cache } // namespace action -- 2.39.5