From: Jason Dillaman Date: Thu, 21 Feb 2019 17:37:38 +0000 (-0500) Subject: rbd-mirror: abort trash watcher initialization if create blacklisted X-Git-Tag: v14.1.1~114^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=8b883d136be4454029af7c4c7e580936ad901156;p=ceph-ci.git rbd-mirror: abort trash watcher initialization if create blacklisted Signed-off-by: Jason Dillaman --- 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 adb47c53d80..034c3e5497d 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 cb4f78d9461..8735dfb7df5 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) { ceph_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