uint64_t watch_handle = m_watcher->get_watch_handle();
if (watch_handle == 0) {
- lderr(m_cct) << "watcher not registered - delaying request" << dendl;
- m_state = STATE_WAITING_FOR_REGISTER;
+ if (m_watcher->is_blocklisted()) {
+ lderr(m_cct) << "watcher not registered - client blocklisted" << dendl;
+ complete_active_action(STATE_UNLOCKED, -EBLOCKLISTED);
+ } else {
+ lderr(m_cct) << "watcher not registered - delaying request" << dendl;
+ m_state = STATE_WAITING_FOR_REGISTER;
- // shut down might race w/ release/re-acquire of the lock
- if (is_state_shutdown()) {
- complete_active_action(STATE_UNLOCKED, -ESHUTDOWN);
+ // shut down might race w/ release/re-acquire of the lock
+ if (is_state_shutdown()) {
+ complete_active_action(STATE_UNLOCKED, -ESHUTDOWN);
+ }
}
return;
}
.WillOnce(QueueRequest(&acquire_request, r, work_queue));
}
+ void expect_is_blocklisted(MockImageWatcher &watcher,
+ bool blocklisted) {
+ EXPECT_CALL(watcher, is_blocklisted()).WillOnce(Return(blocklisted));
+ }
+
void expect_release_lock(asio::ContextWQ *work_queue,
MockReleaseRequest &release_request, int r) {
EXPECT_CALL(release_request, send())
ASSERT_EQ(0, when_shut_down(managed_lock));
}
+TEST_F(TestMockManagedLock, AcquireLockBlocklistedWatch) {
+ librbd::ImageCtx *ictx;
+ ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+ MockManagedLockImageCtx mock_image_ctx(*ictx);
+ MockManagedLock managed_lock(ictx->md_ctx, *ictx->asio_engine,
+ ictx->header_oid, mock_image_ctx.image_watcher,
+ librbd::managed_lock::EXCLUSIVE, true, 0);
+
+ InSequence seq;
+
+ expect_get_watch_handle(*mock_image_ctx.image_watcher, 0);
+ expect_is_blocklisted(*mock_image_ctx.image_watcher, true);
+
+ ASSERT_EQ(-EBLOCKLISTED, when_acquire_lock(managed_lock));
+ ASSERT_FALSE(is_lock_owner(managed_lock));
+
+ ASSERT_EQ(0, when_shut_down(managed_lock));
+}
+
TEST_F(TestMockManagedLock, ReleaseLockUnlockedState) {
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
expect_release_lock(ictx->op_work_queue, request_release, 0);
expect_get_watch_handle(*mock_image_ctx.image_watcher, 0);
+ expect_is_blocklisted(*mock_image_ctx.image_watcher, false);
managed_lock.reacquire_lock(nullptr);
InSequence seq;
expect_get_watch_handle(*mock_image_ctx.image_watcher, 0);
+ expect_is_blocklisted(*mock_image_ctx.image_watcher, false);
C_SaferCond acquire_ctx;
managed_lock.acquire_lock(&acquire_ctx);