This is an automated email from the ASF dual-hosted git repository. gilbert pushed a commit to branch 1.4.x in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 63979911e9d7c92813883004d6107f3e7467db17 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());
