From: Frank S. Filz Date: Wed, 11 May 2022 21:37:15 +0000 (-0700) Subject: test: Add nonblocking I/O client test X-Git-Tag: v19.0.0~814^2~6 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6b50da636d3b1a418cdd480ebeac91760538012b;p=ceph.git test: Add nonblocking I/O client test Signed-off-by: Frank S. Filz --- diff --git a/src/test/client/CMakeLists.txt b/src/test/client/CMakeLists.txt index 1937bdd0b5542..63a461d71bfbe 100644 --- a/src/test/client/CMakeLists.txt +++ b/src/test/client/CMakeLists.txt @@ -3,11 +3,13 @@ if(${WITH_CEPHFS}) main.cc alternate_name.cc ops.cc + nonblocking.cc ) target_link_libraries(ceph_test_client client global ceph-common + cephfs ${UNITTEST_LIBS} ${EXTRALIBS} ${CMAKE_DL_LIBS} diff --git a/src/test/client/nonblocking.cc b/src/test/client/nonblocking.cc new file mode 100644 index 0000000000000..dafff45d50a44 --- /dev/null +++ b/src/test/client/nonblocking.cc @@ -0,0 +1,86 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2022 Red Hat + * + * This is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software + * Foundation. See file COPYING. + * + */ + +#include + +#include +#include + +#include + +#include "test/client/TestClient.h" + +TEST_F(TestClient, LlreadvLlwritev) { + int mypid = getpid(); + char filename[256]; + + client->unmount(); + TearDown(); + SetUp(); + + sprintf(filename, "test_llreadvllwritevfile%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)); + + /* Reopen read-only */ + 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 nwritten = iov_out[0].iov_len + iov_out[1].iov_len; + + std::unique_ptr writefinish = nullptr; + std::unique_ptr readfinish = nullptr; + + writefinish.reset(new C_SaferCond("test-nonblocking")); + readfinish.reset(new C_SaferCond("test-nonblocking")); + + 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(); + ASSERT_EQ(nwritten, rc); + + rc = client->ll_preadv_pwritev(fh, iov_in, 2, 0, false, readfinish.get(), &bl); + ASSERT_EQ(0, rc); + rc = readfinish.get()->wait(); + ASSERT_EQ(nwritten, rc); + 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)); +} +