From aa53f74ad261f453e971bf3cef0b96bba4932b7b Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 16 Aug 2016 13:11:19 -0400 Subject: [PATCH] librbd: store exclusive lock cookie instead of recalculating Signed-off-by: Jason Dillaman --- src/librbd/ExclusiveLock.cc | 11 +++++--- src/librbd/ExclusiveLock.h | 1 + .../test_mock_ReacquireRequest.cc | 25 ++++++------------- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/librbd/ExclusiveLock.cc b/src/librbd/ExclusiveLock.cc index 1d0248ca43fea..99d7b1d25a08f 100644 --- a/src/librbd/ExclusiveLock.cc +++ b/src/librbd/ExclusiveLock.cc @@ -224,7 +224,7 @@ template void ExclusiveLock::assert_header_locked(librados::ObjectWriteOperation *op) { Mutex::Locker locker(m_lock); rados::cls::lock::assert_locked(op, RBD_LOCK_NAME, LOCK_EXCLUSIVE, - encode_lock_cookie(), WATCHER_LOCK_TAG); + m_cookie, WATCHER_LOCK_TAG); } template @@ -384,9 +384,11 @@ void ExclusiveLock::send_acquire_lock() { return; } + m_cookie = encode_lock_cookie(); + using el = ExclusiveLock; AcquireRequest* req = AcquireRequest::create( - m_image_ctx, encode_lock_cookie(), + m_image_ctx, m_cookie, util::create_context_callback(this), util::create_context_callback(this)); @@ -468,7 +470,7 @@ void ExclusiveLock::send_release_lock() { using el = ExclusiveLock; ReleaseRequest* req = ReleaseRequest::create( - m_image_ctx, encode_lock_cookie(), + m_image_ctx, m_cookie, util::create_context_callback(this), util::create_context_callback(this)); @@ -504,6 +506,7 @@ void ExclusiveLock::handle_release_lock(int r) { lock_request_needed = m_image_ctx.aio_work_queue->is_lock_request_needed(); m_lock.Lock(); + m_cookie = ""; m_watch_handle = 0; } complete_active_action(r < 0 ? STATE_LOCKED : STATE_UNLOCKED, r); @@ -540,7 +543,7 @@ void ExclusiveLock::send_shutdown_release() { std::string cookie; { Mutex::Locker locker(m_lock); - cookie = encode_lock_cookie(); + cookie = m_cookie; } using el = ExclusiveLock; diff --git a/src/librbd/ExclusiveLock.h b/src/librbd/ExclusiveLock.h index 7e66037e87305..61fa019b64c81 100644 --- a/src/librbd/ExclusiveLock.h +++ b/src/librbd/ExclusiveLock.h @@ -130,6 +130,7 @@ private: mutable Mutex m_lock; State m_state; + std::string m_cookie; uint64_t m_watch_handle; ActionsContexts m_actions_contexts; diff --git a/src/test/librbd/exclusive_lock/test_mock_ReacquireRequest.cc b/src/test/librbd/exclusive_lock/test_mock_ReacquireRequest.cc index cd0da24ab609c..1ca9f780bf78b 100644 --- a/src/test/librbd/exclusive_lock/test_mock_ReacquireRequest.cc +++ b/src/test/librbd/exclusive_lock/test_mock_ReacquireRequest.cc @@ -15,20 +15,9 @@ #include #include -namespace librbd { -namespace { - -struct MockTestImageCtx : public librbd::MockImageCtx { - MockTestImageCtx(librbd::ImageCtx &image_ctx) - : librbd::MockImageCtx(image_ctx) { - } -}; - -} // anonymous namespace -} // namespace librbd - // template definitions #include "librbd/exclusive_lock/ReacquireRequest.cc" +template class librbd::exclusive_lock::ReacquireRequest; namespace librbd { namespace exclusive_lock { @@ -40,10 +29,10 @@ using ::testing::StrEq; class TestMockExclusiveLockReacquireRequest : public TestMockFixture { public: - typedef ReacquireRequest MockReacquireRequest; - typedef ExclusiveLock MockExclusiveLock; + typedef ReacquireRequest MockReacquireRequest; + typedef ExclusiveLock MockExclusiveLock; - void expect_set_cookie(MockTestImageCtx &mock_image_ctx, int r) { + void expect_set_cookie(MockImageCtx &mock_image_ctx, int r) { EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(mock_image_ctx.header_oid, _, StrEq("lock"), StrEq("set_cookie"), _, _, _)) @@ -57,7 +46,7 @@ TEST_F(TestMockExclusiveLockReacquireRequest, Success) { librbd::ImageCtx *ictx; ASSERT_EQ(0, open_image(m_image_name, &ictx)); - MockTestImageCtx mock_image_ctx(*ictx); + MockImageCtx mock_image_ctx(*ictx); InSequence seq; expect_set_cookie(mock_image_ctx, 0); @@ -76,7 +65,7 @@ TEST_F(TestMockExclusiveLockReacquireRequest, NotSupported) { librbd::ImageCtx *ictx; ASSERT_EQ(0, open_image(m_image_name, &ictx)); - MockTestImageCtx mock_image_ctx(*ictx); + MockImageCtx mock_image_ctx(*ictx); InSequence seq; expect_set_cookie(mock_image_ctx, -EOPNOTSUPP); @@ -95,7 +84,7 @@ TEST_F(TestMockExclusiveLockReacquireRequest, Error) { librbd::ImageCtx *ictx; ASSERT_EQ(0, open_image(m_image_name, &ictx)); - MockTestImageCtx mock_image_ctx(*ictx); + MockImageCtx mock_image_ctx(*ictx); InSequence seq; expect_set_cookie(mock_image_ctx, -EBUSY); -- 2.39.5