From: Josh Durgin Date: Tue, 23 Oct 2018 20:06:02 +0000 (-0400) Subject: test/librados/aio: wait for all completions properly X-Git-Tag: 3.2-0~90^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=75a776c0eb1abd3093cafd095326682175495a6b;p=ceph-ci.git test/librados/aio: wait for all completions properly Using global semaphores was error-prone and unnecessary. Unbalanced usage resulted in a race like: aio_write object foo -> dropped on full OSD aio_read object foo -> -ENOENT The intent of the test was to wait for the write to complete, so do that explicitly for each aio test and remove the semaphores. Fixes: http://tracker.ceph.com/issues/24587 Signed-off-by: Josh Durgin --- diff --git a/src/test/librados/aio.cc b/src/test/librados/aio.cc index 287b5679e99..dd9a17190af 100644 --- a/src/test/librados/aio.cc +++ b/src/test/librados/aio.cc @@ -9,7 +9,6 @@ #include "gtest/gtest.h" #include #include -#include #include #include #include @@ -36,30 +35,21 @@ public: if (m_init) { rados_ioctx_destroy(m_ioctx); destroy_one_pool(m_pool_name, &m_cluster); - sem_close(m_sem); } } std::string init() { int ret; - if (SEM_FAILED == (m_sem = sem_open("/test_aio_sem", O_CREAT, 0644, 0))) { - int err = errno; - ostringstream oss; - oss << "sem_open failed: " << cpp_strerror(err); - return oss.str(); - } m_pool_name = get_temp_pool_name(); std::string err = create_one_pool(m_pool_name, &m_cluster); if (!err.empty()) { - sem_close(m_sem); ostringstream oss; oss << "create_one_pool(" << m_pool_name << ") failed: error " << err; return oss.str(); } ret = rados_ioctx_create(m_cluster, m_pool_name.c_str(), &m_ioctx); if (ret) { - sem_close(m_sem); destroy_one_pool(m_pool_name, &m_cluster); ostringstream oss; oss << "rados_ioctx_create failed: error " << ret; @@ -69,7 +59,6 @@ public: return ""; } - sem_t *m_sem = nullptr; rados_t m_cluster; rados_ioctx_t m_ioctx; std::string m_pool_name; @@ -93,7 +82,6 @@ public: if (m_init) { m_ioctx.close(); destroy_one_pool_pp(m_pool_name, m_cluster); - sem_close(m_sem); } } @@ -106,23 +94,15 @@ public: { int ret; - if (SEM_FAILED == (m_sem = sem_open("/test_aio_sem", O_CREAT, 0644, 0))) { - int err = errno; - ostringstream oss; - oss << "sem_open failed: " << cpp_strerror(err); - return oss.str(); - } m_pool_name = get_temp_pool_name(); std::string err = create_one_pool_pp(m_pool_name, m_cluster, config); if (!err.empty()) { - sem_close(m_sem); ostringstream oss; oss << "create_one_pool(" << m_pool_name << ") failed: error " << err; return oss.str(); } ret = m_cluster.ioctx_create(m_pool_name.c_str(), m_ioctx); if (ret) { - sem_close(m_sem); destroy_one_pool_pp(m_pool_name, m_cluster); ostringstream oss; oss << "rados_ioctx_create failed: error " << ret; @@ -132,7 +112,6 @@ public: return ""; } - sem_t *m_sem = nullptr; Rados m_cluster; IoCtx m_ioctx; std::string m_pool_name; @@ -145,28 +124,24 @@ void set_completion_complete(rados_completion_t cb, void *arg) { AioTestData *test = static_cast(arg); test->m_complete = true; - sem_post(test->m_sem); } void set_completion_safe(rados_completion_t cb, void *arg) { AioTestData *test = static_cast(arg); test->m_safe = true; - sem_post(test->m_sem); } void set_completion_completePP(rados_completion_t cb, void *arg) { AioTestDataPP *test = static_cast(arg); test->m_complete = true; - sem_post(test->m_sem); } void set_completion_safePP(rados_completion_t cb, void *arg) { AioTestDataPP *test = static_cast(arg); test->m_safe = true; - sem_post(test->m_sem); } TEST(LibRadosAio, TooBig) { @@ -268,8 +243,7 @@ TEST(LibRadosAio, SimpleWrite) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); @@ -282,8 +256,7 @@ TEST(LibRadosAio, SimpleWrite) { my_completion2, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion2)); } @@ -304,8 +277,7 @@ TEST(LibRadosAio, SimpleWritePP) { my_completion, bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); delete my_completion; @@ -321,8 +293,7 @@ TEST(LibRadosAio, SimpleWritePP) { my_completion, bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); delete my_completion; @@ -376,8 +347,7 @@ TEST(LibRadosAio, RoundTrip) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); char buf2[256]; @@ -409,8 +379,7 @@ TEST(LibRadosAio, RoundTrip2) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); char buf2[128]; @@ -448,8 +417,7 @@ TEST(LibRadosAio, RoundTrip3) { { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); @@ -505,8 +473,7 @@ TEST(LibRadosAio, RoundTripPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); bufferlist bl2; @@ -541,8 +508,7 @@ TEST(LibRadosAio, RoundTripPP2) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); bufferlist bl2; @@ -633,8 +599,7 @@ TEST(LibRadosAio, RoundTripSparseReadPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); std::map extents; @@ -1161,8 +1126,7 @@ TEST(LibRadosAio, IsComplete) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); char buf2[128]; @@ -1204,8 +1168,7 @@ TEST(LibRadosAio, IsCompletePP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); bufferlist bl2; @@ -1791,8 +1754,7 @@ TEST(LibRadosAio, SimpleStat) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); uint64_t psize; @@ -1827,8 +1789,7 @@ TEST(LibRadosAio, SimpleStatPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); uint64_t psize; @@ -1860,8 +1821,7 @@ TEST(LibRadosAio, SimpleStatNS) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); rados_ioctx_set_namespace(test_data.m_ioctx, "nspace"); @@ -1873,8 +1833,7 @@ TEST(LibRadosAio, SimpleStatNS) { my_completion, buf2, sizeof(buf2), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); uint64_t psize; @@ -1925,8 +1884,7 @@ TEST(LibRadosAio, SimpleStatPPNS) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); uint64_t psize; @@ -1958,8 +1916,7 @@ TEST(LibRadosAio, StatRemove) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); uint64_t psize; @@ -2017,8 +1974,7 @@ TEST(LibRadosAio, StatRemovePP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); uint64_t psize; @@ -2074,10 +2030,8 @@ TEST(LibRadosAio, ExecuteClass) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); } - ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); rados_completion_t my_completion2; ASSERT_EQ(0, rados_aio_create_completion((void*)&test_data, set_completion_complete, set_completion_safe, &my_completion2)); @@ -2109,8 +2063,7 @@ TEST(LibRadosAio, ExecuteClassPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); AioCompletion *my_completion2 = test_data.m_cluster.aio_create_completion( @@ -2484,30 +2437,21 @@ public: if (m_init) { rados_ioctx_destroy(m_ioctx); destroy_one_ec_pool(m_pool_name, &m_cluster); - sem_close(m_sem); } } std::string init() { int ret; - if (SEM_FAILED == (m_sem = sem_open("/test_aio_sem", O_CREAT, 0644, 0))) { - int err = errno; - ostringstream oss; - oss << "sem_open failed: " << cpp_strerror(err); - return oss.str(); - } m_pool_name = get_temp_pool_name(); std::string err = create_one_ec_pool(m_pool_name, &m_cluster); if (!err.empty()) { - sem_close(m_sem); ostringstream oss; oss << "create_one_ec_pool(" << m_pool_name << ") failed: error " << err; return oss.str(); } ret = rados_ioctx_create(m_cluster, m_pool_name.c_str(), &m_ioctx); if (ret) { - sem_close(m_sem); destroy_one_ec_pool(m_pool_name, &m_cluster); ostringstream oss; oss << "rados_ioctx_create failed: error " << ret; @@ -2517,7 +2461,6 @@ public: return ""; } - sem_t *m_sem; rados_t m_cluster; rados_ioctx_t m_ioctx; std::string m_pool_name; @@ -2541,30 +2484,21 @@ public: if (m_init) { m_ioctx.close(); destroy_one_ec_pool_pp(m_pool_name, m_cluster); - sem_close(m_sem); } } std::string init() { int ret; - if (SEM_FAILED == (m_sem = sem_open("/test_aio_sem", O_CREAT, 0644, 0))) { - int err = errno; - ostringstream oss; - oss << "sem_open failed: " << cpp_strerror(err); - return oss.str(); - } m_pool_name = get_temp_pool_name(); std::string err = create_one_ec_pool_pp(m_pool_name, m_cluster); if (!err.empty()) { - sem_close(m_sem); ostringstream oss; oss << "create_one_ec_pool(" << m_pool_name << ") failed: error " << err; return oss.str(); } ret = m_cluster.ioctx_create(m_pool_name.c_str(), m_ioctx); if (ret) { - sem_close(m_sem); destroy_one_ec_pool_pp(m_pool_name, m_cluster); ostringstream oss; oss << "rados_ioctx_create failed: error " << ret; @@ -2574,7 +2508,6 @@ public: return ""; } - sem_t *m_sem = nullptr; Rados m_cluster; IoCtx m_ioctx; std::string m_pool_name; @@ -2587,28 +2520,24 @@ void set_completion_completeEC(rados_completion_t cb, void *arg) { AioTestDataEC *test = static_cast(arg); test->m_complete = true; - sem_post(test->m_sem); } void set_completion_safeEC(rados_completion_t cb, void *arg) { AioTestDataEC *test = static_cast(arg); test->m_safe = true; - sem_post(test->m_sem); } void set_completion_completeECPP(rados_completion_t cb, void *arg) { AioTestDataECPP *test = static_cast(arg); test->m_complete = true; - sem_post(test->m_sem); } void set_completion_safeECPP(rados_completion_t cb, void *arg) { AioTestDataECPP *test = static_cast(arg); test->m_safe = true; - sem_post(test->m_sem); } TEST(LibRadosAioEC, SimpleWrite) { @@ -2624,8 +2553,7 @@ TEST(LibRadosAioEC, SimpleWrite) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); @@ -2638,8 +2566,7 @@ TEST(LibRadosAioEC, SimpleWrite) { my_completion2, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion2)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion2)); } @@ -2660,8 +2587,7 @@ TEST(LibRadosAioEC, SimpleWritePP) { my_completion, bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); delete my_completion; @@ -2677,8 +2603,7 @@ TEST(LibRadosAioEC, SimpleWritePP) { my_completion, bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); delete my_completion; @@ -2732,8 +2657,7 @@ TEST(LibRadosAioEC, RoundTrip) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); char buf2[256]; @@ -2765,8 +2689,7 @@ TEST(LibRadosAioEC, RoundTrip2) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); char buf2[128]; @@ -2801,8 +2724,7 @@ TEST(LibRadosAioEC, RoundTripPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); bufferlist bl2; @@ -2837,8 +2759,7 @@ TEST(LibRadosAioEC, RoundTripPP2) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); bufferlist bl2; @@ -2916,8 +2837,7 @@ TEST(LibRadosAioEC, RoundTripSparseReadPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); @@ -3095,8 +3015,7 @@ TEST(LibRadosAioEC, IsComplete) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); char buf2[128]; @@ -3138,8 +3057,7 @@ TEST(LibRadosAioEC, IsCompletePP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); bufferlist bl2; @@ -3575,8 +3493,7 @@ TEST(LibRadosAioEC, SimpleStat) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); uint64_t psize; @@ -3611,8 +3528,7 @@ TEST(LibRadosAioEC, SimpleStatPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); uint64_t psize; @@ -3644,8 +3560,7 @@ TEST(LibRadosAioEC, SimpleStatNS) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); rados_ioctx_set_namespace(test_data.m_ioctx, "nspace"); @@ -3657,8 +3572,7 @@ TEST(LibRadosAioEC, SimpleStatNS) { my_completion, buf2, sizeof(buf2), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); uint64_t psize; @@ -3709,8 +3623,7 @@ TEST(LibRadosAioEC, SimpleStatPPNS) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); uint64_t psize; @@ -3742,8 +3655,7 @@ TEST(LibRadosAioEC, StatRemove) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); uint64_t psize; @@ -3801,8 +3713,7 @@ TEST(LibRadosAioEC, StatRemovePP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); uint64_t psize; @@ -3858,8 +3769,7 @@ TEST(LibRadosAioEC, ExecuteClass) { my_completion, buf, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, rados_aio_wait_for_complete(my_completion)); } ASSERT_EQ(0, rados_aio_get_return_value(my_completion)); rados_completion_t my_completion2; @@ -3893,8 +3803,7 @@ TEST(LibRadosAioEC, ExecuteClassPP) { bl1, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); + ASSERT_EQ(0, my_completion->wait_for_complete()); } ASSERT_EQ(0, my_completion->get_return_value()); AioCompletion *my_completion2 = test_data.m_cluster.aio_create_completion( @@ -4061,8 +3970,6 @@ TEST(LibRadosAio, RacingRemovePP) { bl, sizeof(buf), 0)); { TestAlarm alarm; - sem_wait(test_data.m_sem); - sem_wait(test_data.m_sem); my_completion2->wait_for_complete(); my_completion->wait_for_complete(); }