From 6c734e33db709f0fd710b0112a90cd53c18caab9 Mon Sep 17 00:00:00 2001 From: Dhairya Parmar Date: Wed, 6 Dec 2023 15:21:59 +0530 Subject: [PATCH] src/test: test async I/O if the client is not mounted Fixes: https://tracker.ceph.com/issues/63629 Signed-off-by: Dhairya Parmar --- src/test/client/nonblocking.cc | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/test/client/nonblocking.cc b/src/test/client/nonblocking.cc index 4b689dd8687..edb5c547396 100644 --- a/src/test/client/nonblocking.cc +++ b/src/test/client/nonblocking.cc @@ -335,3 +335,63 @@ TEST_F(TestClient, LlreadvLlwritevReadOnlyFile) { client->ll_release(fh); ASSERT_EQ(0, client->ll_unlink(root, filename, myperm)); } + +TEST_F(TestClient, LlreadvLlwritevIOClientNotMounted) { + /* Test that performing async I/O if the client is not mounted returns + ENOTCONN; callback is finished and thus the caller is not stalled .*/ + + int mypid = getpid(); + char filename[256]; + + client->unmount(); + TearDown(); + SetUp(); + + sprintf(filename, "test_llreadvllwritevioclientnotmountedfile%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)}, + }; + + std::unique_ptr writefinish = nullptr; + std::unique_ptr readfinish = nullptr; + + writefinish.reset(new C_SaferCond("test-nonblocking-writefinish-io-client-not-mounted")); + readfinish.reset(new C_SaferCond("test-nonblocking-readfinish-io-client-not-mounted")); + + int64_t rc; + bufferlist bl; + + ASSERT_EQ(client->ll_release(fh), 0); + client->unmount(); + rc = client->ll_preadv_pwritev(fh, iov_out, 2, 0, true, writefinish.get(), nullptr); + ASSERT_EQ(rc, 0); + rc = writefinish->wait(); + ASSERT_EQ(rc, -CEPHFS_ENOTCONN); + + rc = client->ll_preadv_pwritev(fh, iov_in, 2, 0, false, readfinish.get(), &bl); + ASSERT_EQ(rc, 0); + rc = readfinish->wait(); + ASSERT_EQ(rc, -CEPHFS_ENOTCONN); +} -- 2.47.3