]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client test: Add fsync to ll_preadv_pwritev test nonblocking-io 48038/head
authorFrank S. Filz <ffilzlnx@mindspring.com>
Mon, 8 Aug 2022 23:48:37 +0000 (16:48 -0700)
committerFrank S. Filz <ffilzlnx@mindspring.com>
Mon, 24 Jul 2023 18:49:05 +0000 (11:49 -0700)
Signed-off-by: Frank S. Filz <ffilzlnx@mindspring.com>
src/test/client/nonblocking.cc

index dafff45d50a44cef8b356065e20a6e973b9c615f..d5d5e7a5626ee88c06740ed1a355ea4eaa3dea98 100644 (file)
@@ -56,16 +56,43 @@ TEST_F(TestClient, LlreadvLlwritev) {
        {in1, sizeof(in1)},
   };
 
+  char out_a_0[] = "hello ";
+  char out_a_1[] = "world a is longer\n";
+  struct iovec iov_out_a[2] = {
+       {out_a_0, sizeof(out_a_0)},
+       {out_a_1, sizeof(out_a_1)},
+  };
+  char in_a_0[sizeof(out_a_0)];
+  char in_a_1[sizeof(out_a_1)];
+  struct iovec iov_in_a[2] = {
+       {in_a_0, sizeof(in_a_0)},
+       {in_a_1, sizeof(in_a_1)},
+  };
+
+  char out_b_0[] = "hello ";
+  char out_b_1[] = "world b is much longer\n";
+  struct iovec iov_out_b[2] = {
+       {out_b_0, sizeof(out_b_0)},
+       {out_b_1, sizeof(out_b_1)},
+  };
+  char in_b_0[sizeof(out_b_0)];
+  char in_b_1[sizeof(out_b_1)];
+  struct iovec iov_in_b[2] = {
+       {in_b_0, sizeof(in_b_0)},
+       {in_b_1, sizeof(in_b_1)},
+  };
+
   ssize_t nwritten = iov_out[0].iov_len + iov_out[1].iov_len;
 
   std::unique_ptr<C_SaferCond> writefinish = nullptr;
   std::unique_ptr<C_SaferCond> readfinish = nullptr;
 
-  writefinish.reset(new C_SaferCond("test-nonblocking"));
-  readfinish.reset(new C_SaferCond("test-nonblocking"));
+  writefinish.reset(new C_SaferCond("test-nonblocking-writefinish"));
+  readfinish.reset(new C_SaferCond("test-nonblocking-readfinish"));
 
   int64_t rc;
   bufferlist bl;
+
   rc = client->ll_preadv_pwritev(fh, iov_out, 2, 0, true, writefinish.get(), nullptr);
   ASSERT_EQ(0, rc);
   rc = writefinish->wait();
@@ -80,6 +107,44 @@ TEST_F(TestClient, LlreadvLlwritev) {
   ASSERT_EQ(0, strncmp((const char*)iov_in[0].iov_base, (const char*)iov_out[0].iov_base, iov_out[0].iov_len));
   ASSERT_EQ(0, strncmp((const char*)iov_in[1].iov_base, (const char*)iov_out[1].iov_base, iov_out[1].iov_len));
 
+  // need new condition variables...
+  writefinish.reset(new C_SaferCond("test-nonblocking-writefinish"));
+  readfinish.reset(new C_SaferCond("test-nonblocking-readfinish"));
+  ssize_t nwritten_a = iov_out_a[0].iov_len + iov_out_a[1].iov_len;
+
+  rc = client->ll_preadv_pwritev(fh, iov_out_a, 2, 100, true, writefinish.get(), nullptr);
+  ASSERT_EQ(0, rc);
+  rc = writefinish->wait();
+  ASSERT_EQ(nwritten_a, rc);
+
+  rc = client->ll_preadv_pwritev(fh, iov_in_a, 2, 100, false, readfinish.get(), &bl);
+  ASSERT_EQ(0, rc);
+  rc = readfinish.get()->wait();
+  ASSERT_EQ(nwritten_a, rc);
+  copy_bufferlist_to_iovec(iov_in_a, 2, &bl, rc);
+
+  ASSERT_EQ(0, strncmp((const char*)iov_in_a[0].iov_base, (const char*)iov_out_a[0].iov_base, iov_out_a[0].iov_len));
+  ASSERT_EQ(0, strncmp((const char*)iov_in_a[1].iov_base, (const char*)iov_out_a[1].iov_base, iov_out_a[1].iov_len));
+
+  // need new condition variables...
+  writefinish.reset(new C_SaferCond("test-nonblocking-writefinish"));
+  readfinish.reset(new C_SaferCond("test-nonblocking-readfinish"));
+  ssize_t nwritten_b = iov_out_b[0].iov_len + iov_out_b[1].iov_len;
+
+  rc = client->ll_preadv_pwritev(fh, iov_out_b, 2, 1000, true, writefinish.get(), nullptr, true, false);
+  ASSERT_EQ(0, rc);
+  rc = writefinish->wait();
+  ASSERT_EQ(nwritten_b, rc);
+
+  rc = client->ll_preadv_pwritev(fh, iov_in_b, 2, 1000, false, readfinish.get(), &bl);
+  ASSERT_EQ(0, rc);
+  rc = readfinish.get()->wait();
+  ASSERT_EQ(nwritten_b, rc);
+  copy_bufferlist_to_iovec(iov_in_b, 2, &bl, rc);
+
+  ASSERT_EQ(0, strncmp((const char*)iov_in_b[0].iov_base, (const char*)iov_out_b[0].iov_base, iov_out_b[0].iov_len));
+  ASSERT_EQ(0, strncmp((const char*)iov_in_b[1].iov_base, (const char*)iov_out_b[1].iov_base, iov_out_b[1].iov_len));
+
   client->ll_release(fh);
   ASSERT_EQ(0, client->ll_unlink(root, filename, myperm));
 }