From 0e0d0cd8d1adee998109c2714ed04f43b3212d7e Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Mon, 29 Jan 2018 17:58:28 +0800 Subject: [PATCH] test/librados: be more tolerant with timed lock tests wait for extra 0.1 second, and try again if the lock is not expired yet. this happens if the client and osd are not strictly sync'ed. Fixes: http://tracker.ceph.com/issues/20086 Signed-off-by: Kefu Chai --- src/test/librados/lock.cc | 97 +++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 24 deletions(-) diff --git a/src/test/librados/lock.cc b/src/test/librados/lock.cc index 5ea6d240478..a95bca18688 100644 --- a/src/test/librados/lock.cc +++ b/src/test/librados/lock.cc @@ -5,10 +5,13 @@ #include "cls/lock/cls_lock_client.h" #include +#include +#include #include #include "gtest/gtest.h" #include +using namespace std::chrono_literals; using namespace librados; typedef RadosTest LibRadosLock; @@ -16,6 +19,28 @@ typedef RadosTestPP LibRadosLockPP; typedef RadosTestEC LibRadosLockEC; typedef RadosTestECPP LibRadosLockECPP; + +template> +Return wait_until(const std::chrono::duration& rel_time, + const std::chrono::duration& step, + const Return& expected, + Func&& func, Args&&... args) +{ + std::this_thread::sleep_for(rel_time - step); + for (auto& s : {step, step}) { + if (!s.count()) { + break; + } + auto ret = func(std::forward(args)...); + if (ret == expected) { + return ret; + } + std::this_thread::sleep_for(s); + } + return func(std::forward(args)...); +} + TEST_F(LibRadosLock, LockExclusive) { ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock1", "Cookie", "", NULL, 0)); ASSERT_EQ(-EEXIST, rados_lock_exclusive(ioctx, "foo", "TestLock1", "Cookie", "", NULL, 0)); @@ -40,36 +65,48 @@ TEST_F(LibRadosLock, LockExclusiveDur) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock3", "Cookie", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLock3", "Cookie", "", NULL, 0)); + auto lock_exclusive = [this](timeval* tv) { + return rados_lock_exclusive(ioctx, "foo", "TestLock3", "Cookie", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_exclusive(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_exclusive, nullptr)); } TEST_F(LibRadosLockPP, LockExclusiveDurPP) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLockPP3", "Cookie", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLockPP3", "Cookie", "", NULL, 0)); + auto lock_exclusive = [this](timeval* tv) { + return ioctx.lock_exclusive("foo", "TestLockPP3", "Cookie", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_exclusive(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_exclusive, nullptr)); } TEST_F(LibRadosLock, LockSharedDur) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLock4", "Cookie", "Tag", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLock4", "Cookie", "Tag", "", NULL, 0)); + auto lock_shared = [this](timeval* tv) { + return rados_lock_shared(ioctx, "foo", "TestLock4", "Cookie", "Tag", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_shared(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_shared, nullptr)); } TEST_F(LibRadosLockPP, LockSharedDurPP) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLockPP4", "Cookie", "Tag", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLockPP4", "Cookie", "Tag", "", NULL, 0)); + auto lock_shared = [this](timeval* tv) { + return ioctx.lock_shared("foo", "TestLockPP4", "Cookie", "Tag", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_shared(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_shared, nullptr)); } TEST_F(LibRadosLock, LockRenew) { @@ -219,36 +256,48 @@ TEST_F(LibRadosLockEC, LockExclusiveDur) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLockEC3", "Cookie", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, rados_lock_exclusive(ioctx, "foo", "TestLockEC3", "Cookie", "", NULL, 0)); + auto lock_exclusive = [this](timeval* tv) { + return rados_lock_exclusive(ioctx, "foo", "TestLockEC3", "Cookie", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_exclusive(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_exclusive, nullptr)); } TEST_F(LibRadosLockECPP, LockExclusiveDurPP) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLockECPP3", "Cookie", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, ioctx.lock_exclusive("foo", "TestLockECPP3", "Cookie", "", NULL, 0)); + auto lock_exclusive = [this](timeval* tv) { + return ioctx.lock_exclusive("foo", "TestLockECPP3", "Cookie", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_exclusive(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_exclusive, nullptr)); } TEST_F(LibRadosLockEC, LockSharedDur) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLockEC4", "Cookie", "Tag", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, rados_lock_shared(ioctx, "foo", "TestLockEC4", "Cookie", "Tag", "", NULL, 0)); + auto lock_shared = [this](timeval* tv) { + return rados_lock_shared(ioctx, "foo", "TestLockEC4", "Cookie", "Tag", "", tv, 0); + }; + constexpr int expected = 0; + ASSERT_EQ(expected, lock_shared(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_shared, nullptr)); } TEST_F(LibRadosLockECPP, LockSharedDurPP) { struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLockECPP4", "Cookie", "Tag", "", &tv, 0)); - sleep(1); - ASSERT_EQ(0, ioctx.lock_shared("foo", "TestLockECPP4", "Cookie", "Tag", "", NULL, 0)); + auto lock_shared = [this](timeval* tv) { + return ioctx.lock_shared("foo", "TestLockECPP4", "Cookie", "Tag", "", tv, 0); + }; + const int expected = 0; + ASSERT_EQ(expected, lock_shared(&tv)); + ASSERT_EQ(expected, wait_until(1.0s, 0.1s, expected, lock_shared, nullptr)); } TEST_F(LibRadosLockEC, LockRenew) { -- 2.39.5