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);
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);
}
m_async_op_tracker.finish_op();
+ if (on_init_finish != nullptr) {
+ on_init_finish->complete(r);
+ }
}
template <typename I>