You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2014/10/17 00:07:22 UTC
[2/3] git commit: Added a protobuf::append function.
Added a protobuf::append function.
Review: https://reviews.apache.org/r/26799
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/589fdaa6
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/589fdaa6
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/589fdaa6
Branch: refs/heads/master
Commit: 589fdaa6f608086e464c1b3fc319a9b2c10f2fc4
Parents: 6bff6ea
Author: Jie Yu <yu...@gmail.com>
Authored: Wed Oct 15 21:48:03 2014 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Oct 16 14:59:20 2014 -0700
----------------------------------------------------------------------
.../3rdparty/stout/include/stout/protobuf.hpp | 62 ++++++++++++++------
1 file changed, 45 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/589fdaa6/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
index 3b30ab7..ff494c3 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/protobuf.hpp
@@ -44,7 +44,8 @@
namespace protobuf {
// Write out the given protobuf to the specified file descriptor by
-// first writing out the length of the protobuf followed by the contents.
+// first writing out the length of the protobuf followed by the
+// contents.
// NOTE: On error, this may have written partial data to the file.
inline Try<Nothing> write(int fd, const google::protobuf::Message& message)
{
@@ -70,14 +71,15 @@ inline Try<Nothing> write(int fd, const google::protobuf::Message& message)
}
-// A wrapper function that wraps the above write with open and closing the file.
+// A wrapper function that wraps the above write with open and closing
+// the file.
inline Try<Nothing> write(
const std::string& path,
const google::protobuf::Message& message)
{
Try<int> fd = os::open(
path,
- O_WRONLY | O_CREAT | O_TRUNC,
+ O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IRWXO);
if (fd.isError()) {
@@ -86,17 +88,41 @@ inline Try<Nothing> write(
Try<Nothing> result = write(fd.get(), message);
- // NOTE: We ignore the return value of close(). This is because users calling
- // this function are interested in the return value of write(). Also an
- // unsuccessful close() doesn't affect the write.
+ // NOTE: We ignore the return value of close(). This is because
+ // users calling this function are interested in the return value of
+ // write(). Also an unsuccessful close() doesn't affect the write.
os::close(fd.get());
return result;
}
-// Read the next protobuf of type T from the file by first reading
-// the "size" followed by the contents (as written by 'write' above).
+inline Try<Nothing> append(
+ const std::string& path,
+ const google::protobuf::Message& message)
+{
+ Try<int> fd = os::open(
+ path,
+ O_WRONLY | O_CREAT | O_APPEND | O_CLOEXEC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IRWXO);
+
+ if (fd.isError()) {
+ return Error("Failed to open file '" + path + "': " + fd.error());
+ }
+
+ Try<Nothing> result = write(fd.get(), message);
+
+ // NOTE: We ignore the return value of close(). This is because
+ // users calling this function are interested in the return value of
+ // write(). Also an unsuccessful close() doesn't affect the write.
+ os::close(fd.get());
+
+ return result;
+}
+
+
+// Read the next protobuf of type T from the file by first reading the
+// "size" followed by the contents (as written by 'write' above).
// If 'ignorePartial' is true, None() is returned when we unexpectedly
// hit EOF while reading the protobuf (e.g., partial write).
// If 'undoFailed' is true, failed read attempts will restore the file
@@ -143,9 +169,9 @@ inline Result<T> read(
// Parse the size from the bytes.
memcpy((void*) &size, (void*) result.get().data(), sizeof(size));
- // NOTE: Instead of specifically checking for corruption in 'size', we simply
- // try to read 'size' bytes. If we hit EOF early, it is an indication of
- // corruption.
+ // NOTE: Instead of specifically checking for corruption in 'size',
+ // we simply try to read 'size' bytes. If we hit EOF early, it is an
+ // indication of corruption.
result = os::read(fd, size);
if (result.isError()) {
@@ -187,13 +213,15 @@ inline Result<T> read(
}
-// A wrapper function that wraps the above read() with
-// open and closing the file.
+// A wrapper function that wraps the above read() with open and
+// closing the file.
template <typename T>
inline Result<T> read(const std::string& path)
{
Try<int> fd = os::open(
- path, O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IRWXO);
+ path,
+ O_RDONLY | O_CLOEXEC,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IRWXO);
if (fd.isError()) {
return Error("Failed to open file '" + path + "': " + fd.error());
@@ -201,9 +229,9 @@ inline Result<T> read(const std::string& path)
Result<T> result = read<T>(fd.get());
- // NOTE: We ignore the return value of close(). This is because users calling
- // this function are interested in the return value of read(). Also an
- // unsuccessful close() doesn't affect the read.
+ // NOTE: We ignore the return value of close(). This is because
+ // users calling this function are interested in the return value of
+ // read(). Also an unsuccessful close() doesn't affect the read.
os::close(fd.get());
return result;