From 543fd813aa65728bf5b872a5fb1b1817df13724a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 21 Feb 2019 12:37:38 -0500 Subject: [PATCH] rbd-mirror: abort trash watcher initialization if create blacklisted Signed-off-by: Jason Dillaman (cherry picked from commit 8b883d136be4454029af7c4c7e580936ad901156) --- .../image_deleter/test_mock_TrashWatcher.cc | 38 +++++++++++++++++++ .../rbd_mirror/image_deleter/TrashWatcher.cc | 16 +++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc b/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc index d135ede7097e8..592e2bf4e1497 100644 --- a/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc +++ b/src/test/rbd_mirror/image_deleter/test_mock_TrashWatcher.cc @@ -291,6 +291,44 @@ TEST_F(TestMockImageDeleterTrashWatcher, Notify) { ASSERT_EQ(0, when_shut_down(mock_trash_watcher)); } +TEST_F(TestMockImageDeleterTrashWatcher, CreateBlacklist) { + MockThreads mock_threads(m_threads); + expect_work_queue(mock_threads); + + InSequence seq; + expect_create_trash(m_local_io_ctx, -EBLACKLISTED); + + MockListener mock_listener; + MockTrashWatcher mock_trash_watcher(m_local_io_ctx, &mock_threads, + mock_listener); + C_SaferCond ctx; + mock_trash_watcher.init(&ctx); + ASSERT_EQ(-EBLACKLISTED, ctx.wait()); + + MockLibrbdTrashWatcher mock_librbd_trash_watcher; + expect_trash_watcher_unregister(mock_librbd_trash_watcher, 0); + ASSERT_EQ(0, when_shut_down(mock_trash_watcher)); +} + +TEST_F(TestMockImageDeleterTrashWatcher, CreateDNE) { + MockThreads mock_threads(m_threads); + expect_work_queue(mock_threads); + + InSequence seq; + expect_create_trash(m_local_io_ctx, -ENOENT); + + MockListener mock_listener; + MockTrashWatcher mock_trash_watcher(m_local_io_ctx, &mock_threads, + mock_listener); + C_SaferCond ctx; + mock_trash_watcher.init(&ctx); + ASSERT_EQ(-ENOENT, ctx.wait()); + + MockLibrbdTrashWatcher mock_librbd_trash_watcher; + expect_trash_watcher_unregister(mock_librbd_trash_watcher, 0); + ASSERT_EQ(0, when_shut_down(mock_trash_watcher)); +} + TEST_F(TestMockImageDeleterTrashWatcher, CreateError) { MockThreads mock_threads(m_threads); expect_work_queue(mock_threads); diff --git a/src/tools/rbd_mirror/image_deleter/TrashWatcher.cc b/src/tools/rbd_mirror/image_deleter/TrashWatcher.cc index 05b90ad59fe6f..eeb6d067290d2 100644 --- a/src/tools/rbd_mirror/image_deleter/TrashWatcher.cc +++ b/src/tools/rbd_mirror/image_deleter/TrashWatcher.cc @@ -134,7 +134,18 @@ void TrashWatcher::handle_create_trash(int r) { assert(m_trash_list_in_progress); } - if (r < 0 && r != -EEXIST) { + Context* on_init_finish = nullptr; + if (r == -EBLACKLISTED || r == -ENOENT) { + if (r == -EBLACKLISTED) { + dout(0) << "detected client is blacklisted" << dendl; + } else { + dout(0) << "detected pool no longer exists" << dendl; + } + + Mutex::Locker locker(m_lock); + std::swap(on_init_finish, m_on_init_finish); + m_trash_list_in_progress = false; + } else if (r < 0 && r != -EEXIST) { derr << "failed to create trash object: " << cpp_strerror(r) << dendl; { Mutex::Locker locker(m_lock); @@ -147,6 +158,9 @@ void TrashWatcher::handle_create_trash(int r) { } m_async_op_tracker.finish_op(); + if (on_init_finish != nullptr) { + on_init_finish->complete(r); + } } template -- 2.39.5