The following test fails when run with objectcacher
disabled.
TestClient.LlreadvLlwritevZeroBytes Failure - nonblocking.cc
ceph/src/osdc/Striper.cc: 186: FAILED ceph_assert(len > 0)
Traceback:
ceph version Development (no_version) squid (dev)
1: (ceph::__ceph_assert_fail(char const*, char const*, int, char const*)+0x125) [0x7fc0a340aafe]
2: (ceph::register_assert_context(ceph::common::CephContext*)+0) [0x7fc0a340ad20]
3: (Striper::file_to_extents(ceph::common::CephContext*, file_layout_t const*, ...)+0x184) [0x562727e13ab4]
4: (Striper::file_to_extents(ceph::common::CephContext*, char const*, ...)+0x97) [0x562727e145d1]
5: (Striper::file_to_extents(ceph::common::CephContext*, inodeno_t, ...)+0x75) [0x562727d29520]
6: (Filer::read_trunc(inodeno_t, file_layout_t const*, snapid_t, ...)+0x61) [0x562727d66ea5]
7: (Client::C_Read_Sync_NonBlocking::retry()+0x10c) [0x562727cd8a8e]
8: (Client::_read(Fh*, long, unsigned long, ceph::buffer::v15_2_0::list*, Context*)+0x578) [0x562727d10cb6]
9: (Client::_preadv_pwritev_locked(Fh*, iovec const*, int, long, bool, ...)+0x3a7) [0x562727d18159]
10: (Client::ll_preadv_pwritev(Fh*, iovec const*, int, long, bool, ...)+0x179) [0x562727d18b99]
11: (TestClient_LlreadvLlwritevZeroBytes_Test::TestBody()+0x592) [0x562727ca5352]
12: (void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, ...)+0x1b) [0x562727d9dea3]
13: (void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, ...)+0x80) [0x562727da2b26]
14: (testing::Test::Run()+0xb4) [0x562727d927ae]
15: (testing::TestInfo::Run()+0x104) [0x562727d92988]
16: (testing::TestSuite::Run()+0xb2) [0x562727d92b34]
17: (testing::internal::UnitTestImpl::RunAllTests()+0x36b) [0x562727d95303]
18: (bool testing::internal::HandleSehExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, ...)(), char const*)+0x1b) [0x562727d9e15f]
19: (bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, ...)+0x80) [0x562727da3083]
20: (testing::UnitTest::Run()+0x63) [0x562727d92813]
21: (RUN_ALL_TESTS()+0x11) [0x562727c828d9]
22: main()
The patch fixes the same.
Fixes: https://tracker.ceph.com/issues/68309
Signed-off-by: Kotresh HR <khiremat@redhat.com>
// branch below but in a non-blocking fashion. The code in _read_sync
// is duplicated and modified and exists in
// C_Read_Sync_NonBlocking::finish().
+
+ // trim read based on file size?
+ if ((offset >= in->size) || (size == 0)) {
+ // read is requested at the EOF or the read len is zero, therefore just
+ // release managed pointers and complete the C_Read_Finisher immediately with 0 bytes
+
+ Context *iof = iofinish.release();
+ crf.release();
+ iof->complete(0);
+
+ // Signal async completion
+ return 0;
+ }
+
C_Read_Sync_NonBlocking *crsa =
new C_Read_Sync_NonBlocking(this, iofinish.release(), f, in, f->pos,
offset, size, bl, filer.get(), have);