From 8b563dd29496c2cceae3ec99781468496a44b8ca Mon Sep 17 00:00:00 2001 From: Arthur Outhenin-Chalandre Date: Thu, 22 Jul 2021 16:37:47 +0200 Subject: [PATCH] cls/rbd: prevent image_status when mirror image is not created This prevent image_status_set to succeed when there is no mirror image yet. This solves some stale entries that were not removed in rbd-mirror and prevent to add entries that would not be visible from the rbd cli. Signed-off-by: Arthur Outhenin-Chalandre (cherry picked from commit 416e25794af0252ec45b35c897c8cf2e91aca383) --- src/cls/rbd/cls_rbd.cc | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/cls/rbd/cls_rbd.cc b/src/cls/rbd/cls_rbd.cc index 15a13a1b1b423..dfa06907bc199 100644 --- a/src/cls/rbd/cls_rbd.cc +++ b/src/cls/rbd/cls_rbd.cc @@ -5049,7 +5049,22 @@ int image_status_set(cls_method_context_t hctx, const string &global_image_id, ondisk_status.up = false; ondisk_status.last_update = ceph_clock_now(); - int r = cls_get_request_origin(hctx, &ondisk_status.origin); + std::string global_id_key = global_key(global_image_id); + std::string image_id; + int r = read_key(hctx, global_id_key, &image_id); + if (r < 0) { + return 0; + } + cls::rbd::MirrorImage mirror_image; + r = image_get(hctx, image_id, &mirror_image); + if (r < 0) { + return 0; + } + if (mirror_image.state != cls::rbd::MIRROR_IMAGE_STATE_ENABLED) { + return 0; + } + + r = cls_get_request_origin(hctx, &ondisk_status.origin); ceph_assert(r == 0); bufferlist bl; -- 2.39.5