]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
src/test: test sync call providing nullptr as ctx to async api
authorDhairya Parmar <dparmar@redhat.com>
Wed, 6 Dec 2023 10:38:05 +0000 (16:08 +0530)
committerDhairya Parmar <dparmar@redhat.com>
Thu, 7 Dec 2023 13:09:17 +0000 (18:39 +0530)
Fixes: https://tracker.ceph.com/issues/63633
Signed-off-by: Dhairya Parmar <dparmar@redhat.com>
src/test/client/nonblocking.cc

index d5d5e7a5626ee88c06740ed1a355ea4eaa3dea98..787e022d49225ffaadb60cd10b74594a3bb65553 100644 (file)
@@ -149,3 +149,62 @@ TEST_F(TestClient, LlreadvLlwritev) {
   ASSERT_EQ(0, client->ll_unlink(root, filename, myperm));
 }
 
+TEST_F(TestClient, LlreadvLlwritevNullContext) {
+  /* Test that if Client::ll_preadv_pwritev is called with nullptr context
+  then it performs a sync call. */
+
+  int mypid = getpid();
+  char filename[256];
+
+  client->unmount();
+  TearDown();
+  SetUp();
+
+  sprintf(filename, "test_llreadvllwritevnullcontextfile%u", mypid);
+
+  Inode *root, *file;
+  root = client->get_root();
+  ASSERT_NE(root, (Inode *)NULL);
+
+  Fh *fh;
+  struct ceph_statx stx;
+
+  ASSERT_EQ(0, client->ll_createx(root, filename, 0666,
+                                 O_RDWR | O_CREAT | O_TRUNC,
+                                 &file, &fh, &stx, 0, 0, myperm));
+
+  char out0[] = "hello ";
+  char out1[] = "world\n";  
+  struct iovec iov_out[2] = {
+         {out0, sizeof(out0)},
+         {out1, sizeof(out1)}
+  };
+
+  char in0[sizeof(out0)];
+  char in1[sizeof(out1)];
+  struct iovec iov_in[2] = {
+         {in0, sizeof(in0)},
+         {in1, sizeof(in1)}
+  };
+
+  ssize_t bytes_to_write = iov_out[0].iov_len + iov_out[1].iov_len;
+
+  int64_t rc;
+  bufferlist bl;
+  rc = client->ll_preadv_pwritev(fh, iov_out, 2, 0, true, nullptr, nullptr);
+  ASSERT_EQ(rc, bytes_to_write);
+
+  rc = client->ll_preadv_pwritev(fh, iov_in, 2, 0, false, nullptr, &bl);
+  ASSERT_EQ(rc, bytes_to_write);
+
+  copy_bufferlist_to_iovec(iov_in, 2, &bl, rc);
+  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));
+
+  client->ll_release(fh);
+  ASSERT_EQ(0, client->ll_unlink(root, filename, myperm));
+}