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

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

commit 5abf4a057ab896a39d03bbbf9bb90a9e48a30a27
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