You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2015/05/22 04:31:53 UTC

mesos git commit: Added a function that reports file size.

Repository: mesos
Updated Branches:
  refs/heads/master e530b4e43 -> d4f6fde17


Added a function that reports file size.

Whether or not the symlink should be followed can be specified as a
parameter to the function.

Review: https://reviews.apache.org/r/30609


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/d4f6fde1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/d4f6fde1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/d4f6fde1

Branch: refs/heads/master
Commit: d4f6fde172a08330a92e70e4d0053a08ec98d0e6
Parents: e530b4e
Author: Bernd Mathiske <be...@mesosphere.io>
Authored: Thu May 21 19:05:22 2015 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Thu May 21 19:28:59 2015 -0700

----------------------------------------------------------------------
 .../3rdparty/stout/include/stout/os/stat.hpp    | 43 ++++++++++++++++++++
 .../3rdparty/stout/tests/os_tests.cpp           | 33 +++++++++++++++
 2 files changed, 76 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/d4f6fde1/3rdparty/libprocess/3rdparty/stout/include/stout/os/stat.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/include/stout/os/stat.hpp b/3rdparty/libprocess/3rdparty/stout/include/stout/os/stat.hpp
index 270c4c8..c8203d6 100644
--- a/3rdparty/libprocess/3rdparty/stout/include/stout/os/stat.hpp
+++ b/3rdparty/libprocess/3rdparty/stout/include/stout/os/stat.hpp
@@ -19,7 +19,9 @@
 
 #include <string>
 
+#include <stout/bytes.hpp>
 #include <stout/try.hpp>
+#include <stout/unreachable.hpp>
 
 namespace os {
 namespace stat {
@@ -58,6 +60,47 @@ inline bool islink(const std::string& path)
 }
 
 
+// Describes the different semantics supported for the implementation
+// of `size` defined below.
+enum FollowSymlink
+{
+  DO_NOT_FOLLOW_SYMLINK,
+  FOLLOW_SYMLINK
+};
+
+
+// Returns the size in Bytes of a given file system entry. When
+// applied to a symbolic link with `follow` set to
+// `DO_NOT_FOLLOW_SYMLINK`, this will return the length of the entry
+// name (strlen).
+inline Try<Bytes> size(
+    const std::string& path,
+    const FollowSymlink follow = FOLLOW_SYMLINK)
+{
+  struct stat s;
+
+  switch (follow) {
+    case DO_NOT_FOLLOW_SYMLINK: {
+      if (::lstat(path.c_str(), &s) < 0) {
+        return ErrnoError("Error invoking lstat for '" + path + "'");
+      }
+      break;
+    }
+    case FOLLOW_SYMLINK: {
+      if (::stat(path.c_str(), &s) < 0) {
+        return ErrnoError("Error invoking stat for '" + path + "'");
+      }
+      break;
+    }
+    default: {
+      UNREACHABLE();
+    }
+  }
+
+  return Bytes(s.st_size);
+}
+
+
 inline Try<long> mtime(const std::string& path)
 {
   struct stat s;

http://git-wip-us.apache.org/repos/asf/mesos/blob/d4f6fde1/3rdparty/libprocess/3rdparty/stout/tests/os_tests.cpp
----------------------------------------------------------------------
diff --git a/3rdparty/libprocess/3rdparty/stout/tests/os_tests.cpp b/3rdparty/libprocess/3rdparty/stout/tests/os_tests.cpp
index 343f95b..12b2e1b 100644
--- a/3rdparty/libprocess/3rdparty/stout/tests/os_tests.cpp
+++ b/3rdparty/libprocess/3rdparty/stout/tests/os_tests.cpp
@@ -16,6 +16,7 @@
 
 #include <stout/duration.hpp>
 #include <stout/foreach.hpp>
+#include <stout/fs.hpp>
 #include <stout/gtest.hpp>
 #include <stout/hashmap.hpp>
 #include <stout/hashset.hpp>
@@ -205,6 +206,38 @@ TEST_F(OsTest, readWriteString)
 }
 
 
+// Tests whether a file's size is reported by os::stat::size as expected.
+// Tests all four combinations of following a link or not and of a file
+// or a link as argument. Also tests that an error is returned for a
+// non-existing file.
+TEST_F(OsTest, size)
+{
+  const string& file = path::join(os::getcwd(), UUID::random().toString());
+
+  const Bytes size = 1053;
+
+  ASSERT_SOME(os::write(file, string(size.bytes(), 'X')));
+
+  // The reported file size should be the same whether following links
+  // or not, given that the input parameter is not a link.
+  EXPECT_SOME_EQ(size, os::stat::size(file, os::stat::FOLLOW_SYMLINK));
+  EXPECT_SOME_EQ(size, os::stat::size(file, os::stat::DO_NOT_FOLLOW_SYMLINK));
+
+  EXPECT_ERROR(os::stat::size("aFileThatDoesNotExist"));
+
+  const string& link = path::join(os::getcwd(), UUID::random().toString());
+
+  ASSERT_SOME(fs::symlink(file, link));
+
+  // Following links we expect the file's size, not the link's.
+  EXPECT_SOME_EQ(size, os::stat::size(link, os::stat::FOLLOW_SYMLINK));
+
+  // Not following links, we expect the string length of the linked path.
+  EXPECT_SOME_EQ(Bytes(file.size()),
+                 os::stat::size(link, os::stat::DO_NOT_FOLLOW_SYMLINK));
+}
+
+
 TEST_F(OsTest, find)
 {
   const string& testdir = path::join(os::getcwd(), UUID::random().toString());