This is an automated email from the ASF dual-hosted git repository.

gilbert pushed a commit to branch 1.6.x
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit aaf5b791935a6fe5c13f10bde34640f38d8d3a5c
Author: Jie Yu <[email protected]>
AuthorDate: Mon Feb 11 12:51:20 2019 -0800

    Made the code more robust related to sendfile.
    
    It's possible that sendfile returns less bytes written than requested.
    Previously, we simply return an error in that case. This patch makes it
    more robust by retrying sendfile if less bytes were written than
    requested.
    
    Review: https://reviews.apache.org/r/69944/
    (cherry picked from commit 4bd0914443888e1434a2c685d2be3c6713b22ec6)
---
 src/linux/memfd.cpp | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/linux/memfd.cpp b/src/linux/memfd.cpp
index 706dc0c..348d0ce 100644
--- a/src/linux/memfd.cpp
+++ b/src/linux/memfd.cpp
@@ -101,18 +101,21 @@ Try<int_fd> cloneSealedFile(const std::string& filePath)
     return Error("Failed to open memfd file: " + memFd.error());
   }
 
-  ssize_t written = sendfile(memFd.get(), fileFd.get(), nullptr, 
size->bytes());
-  if (written == -1) {
-    ErrnoError error("Failed to copy file");
-    os::close(fileFd.get());
-    os::close(memFd.get());
-    return error;
-  } else if (static_cast<uint64_t>(written) != size->bytes()) {
-    os::close(fileFd.get());
-    os::close(memFd.get());
-    return Error(
-        "Expect to write " + stringify(size->bytes()) + " bytes, "
-        "but only " + stringify(written) + " is written");
+  size_t remaining = size->bytes();
+  while (remaining > 0) {
+    ssize_t written = sendfile(memFd.get(), fileFd.get(), nullptr, remaining);
+    if (written == -1) {
+      ErrnoError error("Failed to copy file");
+      os::close(fileFd.get());
+      os::close(memFd.get());
+      return error;
+    } else if (static_cast<size_t>(written) > remaining) {
+      os::close(fileFd.get());
+      os::close(memFd.get());
+      return Error("More bytes written than requested");
+    } else {
+      remaining -= written;
+    }
   }
 
   os::close(fileFd.get());

Reply via email to