]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd:reads larger than cache size hang. 6354/head
authorLu Shi <shi.lu@h3c.com>
Thu, 24 Sep 2015 08:02:41 +0000 (16:02 +0800)
committerAbhishek Lekshmanan <abhishek.lekshmanan@ril.com>
Thu, 22 Oct 2015 14:45:32 +0000 (20:15 +0530)
Fixes:#13164

Signed-off-by: Lu Shi <shi.lu@h3c.com>
(cherry picked from commit 9c8200bb5d1ac9359803a182df03298b565b8479)

src/osdc/ObjectCacher.cc
src/test/librbd/test_librbd.cc

index d21292e08fc0676c69dc166dea852e2a6c19d852..b2c257237628126acf218df179c0c3f079413a56 100644 (file)
@@ -1158,7 +1158,7 @@ int ObjectCacher::_readx(OSDRead *rd, ObjectSet *oset, Context *onfinish,
        uint64_t rx_bytes = static_cast<uint64_t>(
          stat_rx + bh_it->second->length());
         bytes_not_in_cache += bh_it->second->length();
-       if (!waitfor_read.empty() || rx_bytes > max_size) {
+       if (!waitfor_read.empty() || (stat_rx > 0 && rx_bytes > max_size)) {
          // cache is full with concurrent reads -- wait for rx's to complete
          // to constrain memory growth (especially during copy-ups)
          if (success) {
index 14f89ead9824eb86871c0d33ad418088e23a0211..1c76e48cffc940486f794d13d7cf59d24f787e0c 100644 (file)
@@ -2360,7 +2360,7 @@ TEST_F(TestLibRBD, LargeCacheRead)
   rados_ioctx_t ioctx;
   rados_ioctx_create(_cluster, m_pool_name.c_str(), &ioctx);
 
-  uint32_t new_cache_size = 16777216;
+  uint32_t new_cache_size = 1 << 20;
   std::string orig_cache_size;
   ASSERT_EQ(0, _rados.conf_get("rbd_cache_size", orig_cache_size));
   ASSERT_EQ(0, _rados.conf_set("rbd_cache_size",
@@ -2372,24 +2372,22 @@ TEST_F(TestLibRBD, LargeCacheRead)
   } BOOST_SCOPE_EXIT_END;
 
   rbd_image_t image;
-  int order = 0;
-  const char *name = "testimg";
-  uint64_t size = new_cache_size + 1;
+  int order = 21;
+  std::string name = get_temp_image_name();
+  uint64_t size = 1 << order;
 
-  ASSERT_EQ(0, create_image(ioctx, name, size, &order));
-  ASSERT_EQ(0, rbd_open(ioctx, name, &image, NULL));
+  ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
+  ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
 
   std::string buffer(1 << order, '1');
-  for (size_t offs = 0; offs < size; offs += buffer.size()) {
-    size_t len = std::min<uint64_t>(buffer.size(), size - offs);
-    ASSERT_EQ(static_cast<ssize_t>(len),
-             rbd_write(image, offs, len, buffer.c_str()));
-  }
+  ASSERT_EQ(static_cast<ssize_t>(buffer.size()),
+           rbd_write(image, 0, buffer.size(), buffer.c_str()));
 
   ASSERT_EQ(0, rbd_invalidate_cache(image));
 
-  buffer.resize(size);
-  ASSERT_EQ(static_cast<ssize_t>(size-1024), rbd_read(image, 1024, size, &buffer[0]));
+  ASSERT_EQ(static_cast<ssize_t>(buffer.size()), 
+           rbd_read(image, 0, buffer.size(), &buffer[0]));
 
   ASSERT_EQ(0, rbd_close(image));