]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ceph_test_rados_[a]io_pp: add test verifying read-into-bufferlist behavior 26748/head
authorSage Weil <sage@redhat.com>
Mon, 4 Mar 2019 18:52:42 +0000 (12:52 -0600)
committerSage Weil <sage@redhat.com>
Mon, 4 Mar 2019 20:24:05 +0000 (14:24 -0600)
libradosstriper relies on this, and other callers may too.

Signed-off-by: Sage Weil <sage@redhat.com>
src/test/librados/aio_cxx.cc
src/test/librados/io_cxx.cc

index b812930766b28bfcb0ce29afed2830f4977b3938..cf3750ea7798ea5e99befe8a745ed1cc3a8fa620 100644 (file)
@@ -356,6 +356,48 @@ TEST(LibRadosAio, RoundTripSparseReadPP) {
   delete my_completion2;
 }
 
+TEST(LibRadosAioPP, ReadIntoBufferlist) {
+
+  // here we test reading into a non-empty bufferlist referencing existing
+  // buffers
+
+  AioTestDataPP test_data;
+  ASSERT_EQ("", test_data.init());
+  AioCompletion *my_completion = test_data.m_cluster.aio_create_completion(
+         nullptr, nullptr, nullptr);
+  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;
+    ASSERT_EQ(0, my_completion->wait_for_complete());
+   }
+  ASSERT_EQ(0, my_completion->get_return_value());
+
+  bufferlist bl2;
+  char buf2[sizeof(buf)];
+  memset(buf2, 0xbb, sizeof(buf2));
+  bl2.append(buffer::create_static(sizeof(buf2), buf2));
+  AioCompletion *my_completion2 = test_data.m_cluster.aio_create_completion(
+    nullptr, nullptr, nullptr);
+  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_complete());
+  }
+  ASSERT_EQ((int)sizeof(buf), my_completion2->get_return_value());
+  ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
+  delete my_completion;
+  delete my_completion2;
+}
+
 TEST(LibRadosAioPP, XattrsRoundTripPP) {
   char buf[128];
   char attr1[] = "attr1";
index c5a01215fc16d5331cf6bab31a1f6b588bf88271..64d03380b765d29406b6a6d74b892cc80bc5cc68 100644 (file)
@@ -252,6 +252,26 @@ TEST_F(LibRadosIoPP, Checksum) {
   ASSERT_EQ(bl.crc32c(-1), csum);
 }
 
+TEST_F(LibRadosIoPP, ReadIntoBufferlist) {
+
+  // here we test reading into a non-empty bufferlist referencing existing
+  // buffers
+
+  char buf[128];
+  Rados cluster;
+  memset(buf, 0xcc, sizeof(buf));
+  bufferlist bl;
+  bl.append(buf, sizeof(buf));
+  ASSERT_EQ(0, ioctx.write("foo", bl, sizeof(buf), 0));
+  bufferlist bl2;
+  char buf2[sizeof(buf)];
+  memset(buf2, 0xbb, sizeof(buf2));
+  bl2.append(buffer::create_static(sizeof(buf2), buf2));
+  ASSERT_EQ((int)sizeof(buf), ioctx.read("foo", bl2, sizeof(buf), 0));
+  ASSERT_EQ(0, memcmp(buf, buf2, sizeof(buf)));
+  ASSERT_EQ(0, memcmp(buf, bl2.c_str(), sizeof(buf)));
+}
+
 TEST_F(LibRadosIoPP, OverlappingWriteRoundTripPP) {
   char buf[128];
   char buf2[64];