summaryrefslogtreecommitdiff
path: root/src/test/rados-api
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2012-05-04 15:26:33 -0700
committerSage Weil <sage@newdream.net>2012-05-04 15:26:33 -0700
commit3e260aec72cfa0de0635887479689e0aa2933137 (patch)
tree0762a590a1666aca73be90e8693a9ece479f4428 /src/test/rados-api
parentedd73e2e41df0ebdc77e1fa4dfe71c995c1ed9af (diff)
downloadceph-3e260aec72cfa0de0635887479689e0aa2933137.tar.gz
librados: call safe callback on read operation
This avoids confusion for the user who isn't sure if they should wait for complete or safe on a read aio. It also means that you can always wait for safe for both reads or writes, which can simplify some code. Dup the roundtrip functional tests to verify this works. Signed-off-by: Sage Weil <sage@newdream.net> Reviewed-by: Yehuda Sadeh <yehuda.sadeh@inktank.com>
Diffstat (limited to 'src/test/rados-api')
-rw-r--r--src/test/rados-api/aio.cc64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/test/rados-api/aio.cc b/src/test/rados-api/aio.cc
index 36f43827dfe..784de6269bb 100644
--- a/src/test/rados-api/aio.cc
+++ b/src/test/rados-api/aio.cc
@@ -241,6 +241,37 @@ TEST(LibRadosAio, RoundTrip) {
rados_aio_release(my_completion2);
}
+TEST(LibRadosAio, RoundTrip2) {
+ AioTestData test_data;
+ rados_completion_t my_completion;
+ ASSERT_EQ("", test_data.init());
+ ASSERT_EQ(0, rados_aio_create_completion((void*)&test_data,
+ set_completion_complete, set_completion_safe, &my_completion));
+ char buf[128];
+ memset(buf, 0xcc, sizeof(buf));
+ ASSERT_EQ(0, rados_aio_write(test_data.m_ioctx, "foo",
+ my_completion, buf, sizeof(buf), 0));
+ {
+ TestAlarm alarm;
+ sem_wait(&test_data.m_sem);
+ sem_wait(&test_data.m_sem);
+ }
+ char buf2[128];
+ memset(buf2, 0, sizeof(buf2));
+ rados_completion_t my_completion2;
+ ASSERT_EQ(0, rados_aio_create_completion((void*)&test_data,
+ set_completion_complete, set_completion_safe, &my_completion2));
+ ASSERT_EQ(0, rados_aio_read(test_data.m_ioctx, "foo",
+ my_completion2, buf2, sizeof(buf2), 0));
+ {
+ TestAlarm alarm;
+ ASSERT_EQ(0, rados_aio_wait_for_safe(my_completion2));
+ }
+ ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
+ rados_aio_release(my_completion);
+ rados_aio_release(my_completion2);
+}
+
TEST(LibRadosAio, RoundTripPP) {
AioTestDataPP test_data;
ASSERT_EQ("", test_data.init());
@@ -274,6 +305,39 @@ TEST(LibRadosAio, RoundTripPP) {
delete my_completion2;
}
+TEST(LibRadosAio, RoundTripPP2) {
+ AioTestDataPP test_data;
+ ASSERT_EQ("", test_data.init());
+ AioCompletion *my_completion = test_data.m_cluster.aio_create_completion(
+ (void*)&test_data, set_completion_complete, set_completion_safe);
+ AioCompletion *my_completion_null = NULL;
+ ASSERT_NE(my_completion, my_completion_null);
+ char buf[128];
+ memset(buf, 0xcc, sizeof(buf));
+ bufferlist bl1;
+ bl1.append(buf, sizeof(buf));
+ ASSERT_EQ(0, test_data.m_ioctx.aio_write("foo", my_completion,
+ bl1, sizeof(buf), 0));
+ {
+ TestAlarm alarm;
+ sem_wait(&test_data.m_sem);
+ sem_wait(&test_data.m_sem);
+ }
+ bufferlist bl2;
+ AioCompletion *my_completion2 = test_data.m_cluster.aio_create_completion(
+ (void*)&test_data, set_completion_complete, set_completion_safe);
+ ASSERT_NE(my_completion2, my_completion_null);
+ ASSERT_EQ(0, test_data.m_ioctx.aio_read("foo",
+ my_completion2, &bl2, sizeof(buf), 0));
+ {
+ TestAlarm alarm;
+ ASSERT_EQ(0, my_completion2->wait_for_safe());
+ }
+ ASSERT_EQ(0, memcmp(buf, bl2.c_str(), sizeof(buf)));
+ delete my_completion;
+ delete my_completion2;
+}
+
TEST(LibRadosAio, RoundTripAppend) {
AioTestData test_data;
rados_completion_t my_completion, my_completion2, my_completion3;