summaryrefslogtreecommitdiffstats
path: root/src/test/librados/aio.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/librados/aio.cc')
-rw-r--r--src/test/librados/aio.cc56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/test/librados/aio.cc b/src/test/librados/aio.cc
index 68587fe87d1..7fb90bdd38e 100644
--- a/src/test/librados/aio.cc
+++ b/src/test/librados/aio.cc
@@ -1722,3 +1722,59 @@ TEST(LibRadosAioEC, MultiWrite) {
rados_aio_release(my_completion2);
rados_aio_release(my_completion3);
}
+
+TEST(LibRadosAio, CancelBeforeSubmit) {
+ AioTestData test_data;
+ ASSERT_EQ("", test_data.init());
+
+ rados_completion_t completion;
+ ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr, &completion));
+
+ ASSERT_EQ(0, rados_aio_cancel(test_data.m_ioctx, completion));
+ rados_aio_release(completion);
+}
+
+TEST(LibRadosAio, CancelBeforeComplete) {
+ AioTestData test_data;
+ ASSERT_EQ("", test_data.init());
+
+ // cancellation tests are racy, so retry if completion beats the cancellation
+ int ret = 0;
+ int tries = 10;
+ do {
+ rados_completion_t completion;
+ ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr, &completion));
+ char buf[128];
+ ASSERT_EQ(0, rados_aio_read(test_data.m_ioctx, "nonexistent",
+ completion, buf, sizeof(buf), 0));
+
+ ASSERT_EQ(0, rados_aio_cancel(test_data.m_ioctx, completion));
+ {
+ TestAlarm alarm;
+ ASSERT_EQ(0, rados_aio_wait_for_complete(completion));
+ }
+ ret = rados_aio_get_return_value(completion);
+ rados_aio_release(completion);
+ } while (ret == -ENOENT && --tries);
+
+ ASSERT_EQ(-ECANCELED, ret);
+}
+
+TEST(LibRadosAio, CancelAfterComplete) {
+ AioTestData test_data;
+ rados_completion_t completion;
+ ASSERT_EQ("", test_data.init());
+
+ ASSERT_EQ(0, rados_aio_create_completion2(nullptr, nullptr, &completion));
+ char buf[128];
+ ASSERT_EQ(0, rados_aio_read(test_data.m_ioctx, "nonexistent",
+ completion, buf, sizeof(buf), 0));
+
+ {
+ TestAlarm alarm;
+ ASSERT_EQ(0, rados_aio_wait_for_complete(completion));
+ }
+ ASSERT_EQ(0, rados_aio_cancel(test_data.m_ioctx, completion));
+ ASSERT_EQ(-ENOENT, rados_aio_get_return_value(completion));
+ rados_aio_release(completion);
+}