]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
buffer: try to do zero copy in read_fd
authorJosh Durgin <josh.durgin@inktank.com>
Fri, 18 Oct 2013 14:58:10 +0000 (07:58 -0700)
committerJosh Durgin <josh.durgin@inktank.com>
Sat, 23 Nov 2013 00:14:03 +0000 (16:14 -0800)
Leave the explicit read_fd_zero_copy around as well for testing.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
src/common/buffer.cc
src/test/bufferlist.cc

index 650b3fbb331eec5b4be8088185158311a8b30cbd..66a43913cc4b49c320256f2268e70079371f947d 100644 (file)
@@ -1489,6 +1489,12 @@ int buffer::list::read_file(const char *fn, std::string *error)
 
 ssize_t buffer::list::read_fd(int fd, size_t len)
 {
+  // try zero copy first
+  if (read_fd_zero_copy(fd, len) == 0) {
+    // TODO fix callers to not require correct read size, which is not
+    // available for raw_pipe until we actually inspect the data
+    return 0;
+  }
   int s = ROUND_UP_TO(len, CEPH_PAGE_SIZE);
   bufferptr bp = buffer::create_page_aligned(s);
   ssize_t ret = safe_read(fd, (void*)bp.c_str(), len);
@@ -1507,6 +1513,8 @@ int buffer::list::read_fd_zero_copy(int fd, size_t len)
     append(bp);
   } catch (buffer::error_code e) {
     return e.code;
+  } catch (buffer::malformed_input) {
+    return -EIO;
   }
   return 0;
 #else
index 4b3ae616726714f4208aeacfd300f2f284164b01..822b5b4c402a4cc68146a0fa5af81ffb79578ccc 100644 (file)
@@ -1763,9 +1763,14 @@ TEST(BufferList, read_fd) {
   bufferlist bl;
   EXPECT_EQ(-EBADF, bl.read_fd(fd, len));
   fd = ::open("testfile", O_RDONLY);
+#ifdef CEPH_HAVE_SPLICE
+  EXPECT_EQ(0, bl.read_fd(fd, len));
+  EXPECT_EQ(0u, bl.buffers().front().unused_tail_length());
+#else
   EXPECT_EQ(len, (unsigned)bl.read_fd(fd, len));
-  EXPECT_EQ(len, bl.length());
   EXPECT_EQ(CEPH_PAGE_SIZE - len, bl.buffers().front().unused_tail_length());
+#endif
+  EXPECT_EQ(len, bl.length());
   ::close(fd);
   ::unlink("testfile");
 }