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 2017/11/30 00:04:18 UTC

[07/13] mesos git commit: Added filesystem layout for local resource providers.

Added filesystem layout for local resource providers.

A local resource provide can store checkpoints, whose lifecycles should
be tied to the agent, under
`<work_dir>/meta/slaves/<slave_id>/resource_providers/<type>/<name>/
<id>`.

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


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

Branch: refs/heads/master
Commit: 236fa59c37709db6235a237f7b665ccecbf765eb
Parents: c0a4988
Author: Chun-Hung Hsiao <ch...@mesosphere.io>
Authored: Wed Nov 29 15:30:58 2017 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Wed Nov 29 15:30:58 2017 -0800

----------------------------------------------------------------------
 src/resource_provider/daemon.cpp           |   3 +-
 src/resource_provider/local.cpp            |   4 +-
 src/resource_provider/local.hpp            |   6 +-
 src/resource_provider/storage/provider.cpp |  21 +++--
 src/resource_provider/storage/provider.hpp |   4 +
 src/slave/paths.cpp                        | 106 ++++++++++++++++++++++++
 src/slave/paths.hpp                        |  53 +++++++++++-
 7 files changed, 187 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/resource_provider/daemon.cpp
----------------------------------------------------------------------
diff --git a/src/resource_provider/daemon.cpp b/src/resource_provider/daemon.cpp
index 339216b..354054e 100644
--- a/src/resource_provider/daemon.cpp
+++ b/src/resource_provider/daemon.cpp
@@ -220,7 +220,8 @@ Future<Nothing> LocalResourceProviderDaemonProcess::launch(
       ProviderData& data = providers[type].at(name);
 
       Try<Owned<LocalResourceProvider>> provider =
-        LocalResourceProvider::create(url, data.info, authToken);
+        LocalResourceProvider::create(
+            url, workDir, data.info, slaveId.get(), authToken);
 
       if (provider.isError()) {
         return Failure(

http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/resource_provider/local.cpp
----------------------------------------------------------------------
diff --git a/src/resource_provider/local.cpp b/src/resource_provider/local.cpp
index 42b6b62..d1d6835 100644
--- a/src/resource_provider/local.cpp
+++ b/src/resource_provider/local.cpp
@@ -34,7 +34,9 @@ namespace internal {
 
 Try<Owned<LocalResourceProvider>> LocalResourceProvider::create(
     const http::URL& url,
+    const string& workDir,
     const ResourceProviderInfo& info,
+    const SlaveID& slaveId,
     const Option<string>& authToken)
 {
   // TODO(jieyu): Document the built-in local resource providers.
@@ -45,7 +47,7 @@ Try<Owned<LocalResourceProvider>> LocalResourceProvider::create(
   };
 
   if (creators.contains(info.type())) {
-    return creators.at(info.type())(url, info, authToken);
+    return creators.at(info.type())(url, workDir, info, slaveId, authToken);
   }
 
   return Error("Unknown local resource provider type '" + info.type() + "'");

http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/resource_provider/local.hpp
----------------------------------------------------------------------
diff --git a/src/resource_provider/local.hpp b/src/resource_provider/local.hpp
index d1dfc90..46111d9 100644
--- a/src/resource_provider/local.hpp
+++ b/src/resource_provider/local.hpp
@@ -17,14 +17,14 @@
 #ifndef __RESOURCE_PROVIDER_LOCAL_HPP__
 #define __RESOURCE_PROVIDER_LOCAL_HPP__
 
+#include <mesos/mesos.hpp>
+
 #include <process/authenticator.hpp>
 #include <process/http.hpp>
 #include <process/owned.hpp>
 
 #include <stout/try.hpp>
 
-#include <mesos/mesos.hpp>
-
 namespace mesos {
 namespace internal {
 
@@ -33,7 +33,9 @@ class LocalResourceProvider
 public:
   static Try<process::Owned<LocalResourceProvider>> create(
       const process::http::URL& url,
+      const std::string& workDir,
       const ResourceProviderInfo& info,
+      const SlaveID& slaveId,
       const Option<std::string>& authToken);
 
   static Try<process::http::authentication::Principal> principal(

http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/resource_provider/storage/provider.cpp
----------------------------------------------------------------------
diff --git a/src/resource_provider/storage/provider.cpp b/src/resource_provider/storage/provider.cpp
index 14d824c..f586afc 100644
--- a/src/resource_provider/storage/provider.cpp
+++ b/src/resource_provider/storage/provider.cpp
@@ -95,12 +95,16 @@ class StorageLocalResourceProviderProcess
 public:
   explicit StorageLocalResourceProviderProcess(
       const http::URL& _url,
+      const string& _workDir,
       const ResourceProviderInfo& _info,
+      const SlaveID& _slaveId,
       const Option<string>& _authToken)
     : ProcessBase(process::ID::generate("storage-local-resource-provider")),
       url(_url),
+      workDir(_workDir),
       contentType(ContentType::PROTOBUF),
       info(_info),
+      slaveId(_slaveId),
       authToken(_authToken) {}
 
   StorageLocalResourceProviderProcess(
@@ -116,9 +120,11 @@ public:
 private:
   void initialize() override;
 
-  const process::http::URL url;
+  const http::URL url;
+  const string workDir;
   const ContentType contentType;
   ResourceProviderInfo info;
+  const SlaveID slaveId;
   Owned<v1::resource_provider::Driver> driver;
   Option<string> authToken;
 };
@@ -178,8 +184,10 @@ void StorageLocalResourceProviderProcess::initialize()
 
 
 Try<Owned<LocalResourceProvider>> StorageLocalResourceProvider::create(
-    const process::http::URL& url,
+    const http::URL& url,
+    const string& workDir,
     const ResourceProviderInfo& info,
+    const SlaveID& slaveId,
     const Option<string>& authToken)
 {
   // Verify that the name follows Java package naming convention.
@@ -192,7 +200,7 @@ Try<Owned<LocalResourceProvider>> StorageLocalResourceProvider::create(
   }
 
   return Owned<LocalResourceProvider>(
-      new StorageLocalResourceProvider(url, info, authToken));
+      new StorageLocalResourceProvider(url, workDir, info, slaveId, authToken));
 }
 
 
@@ -206,10 +214,13 @@ Try<Principal> StorageLocalResourceProvider::principal(
 
 
 StorageLocalResourceProvider::StorageLocalResourceProvider(
-    const process::http::URL& url,
+    const http::URL& url,
+    const string& workDir,
     const ResourceProviderInfo& info,
+    const SlaveID& slaveId,
     const Option<string>& authToken)
-  : process(new StorageLocalResourceProviderProcess(url, info, authToken))
+  : process(new StorageLocalResourceProviderProcess(
+        url, workDir, info, slaveId, authToken))
 {
   spawn(CHECK_NOTNULL(process.get()));
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/resource_provider/storage/provider.hpp
----------------------------------------------------------------------
diff --git a/src/resource_provider/storage/provider.hpp b/src/resource_provider/storage/provider.hpp
index 720b061..374f837 100644
--- a/src/resource_provider/storage/provider.hpp
+++ b/src/resource_provider/storage/provider.hpp
@@ -38,7 +38,9 @@ class StorageLocalResourceProvider : public LocalResourceProvider
 public:
   static Try<process::Owned<LocalResourceProvider>> create(
       const process::http::URL& url,
+      const std::string& workDir,
       const mesos::ResourceProviderInfo& info,
+      const SlaveID& slaveId,
       const Option<std::string>& authToken);
 
   static Try<process::http::authentication::Principal> principal(
@@ -55,7 +57,9 @@ public:
 private:
   explicit StorageLocalResourceProvider(
       const process::http::URL& url,
+      const std::string& workDir,
       const mesos::ResourceProviderInfo& info,
+      const SlaveID& slaveId,
       const Option<std::string>& authToken);
 
   process::Owned<StorageLocalResourceProviderProcess> process;

http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/slave/paths.cpp
----------------------------------------------------------------------
diff --git a/src/slave/paths.cpp b/src/slave/paths.cpp
index b03ffee..f85e46c 100644
--- a/src/slave/paths.cpp
+++ b/src/slave/paths.cpp
@@ -64,6 +64,7 @@ const char TASK_INFO_FILE[] = "task.info";
 const char TASK_UPDATES_FILE[] = "task.updates";
 const char RESOURCES_INFO_FILE[] = "resources.info";
 const char RESOURCES_TARGET_FILE[] = "resources.target";
+const char RESOURCE_PROVIDER_STATE_FILE[] = "resource_provider.state";
 
 
 const char CONTAINERS_DIR[] = "containers";
@@ -72,6 +73,7 @@ const char FRAMEWORKS_DIR[] = "frameworks";
 const char EXECUTORS_DIR[] = "executors";
 const char EXECUTOR_RUNS_DIR[] = "runs";
 const char RESOURCE_PROVIDER_REGISTRY[] = "resource_provider_registry";
+const char RESOURCE_PROVIDERS_DIR[] = "resource_providers";
 
 
 Try<ExecutorRunPath> parseExecutorRunPath(
@@ -474,6 +476,68 @@ string getResourceProviderRegistryPath(
 }
 
 
+Try<list<string>> getResourceProviderPaths(
+    const string& metaDir,
+    const SlaveID& slaveId)
+{
+  return fs::list(path::join(
+      getSlavePath(metaDir, slaveId),
+      RESOURCE_PROVIDERS_DIR,
+      "*", // Resource provider type.
+      "*", // Resource provider name.
+      "*"));
+}
+
+
+string getResourceProviderPath(
+    const string& metaDir,
+    const SlaveID& slaveId,
+    const string& resourceProviderType,
+    const string& resourceProviderName,
+    const ResourceProviderID& resourceProviderId)
+{
+  return path::join(
+      getSlavePath(metaDir, slaveId),
+      RESOURCE_PROVIDERS_DIR,
+      resourceProviderType,
+      resourceProviderName,
+      stringify(resourceProviderId));
+}
+
+
+string getResourceProviderStatePath(
+    const string& metaDir,
+    const SlaveID& slaveId,
+    const string& resourceProviderType,
+    const string& resourceProviderName,
+    const ResourceProviderID& resourceProviderId)
+{
+  return path::join(
+      getResourceProviderPath(
+          metaDir,
+          slaveId,
+          resourceProviderType,
+          resourceProviderName,
+          resourceProviderId),
+      RESOURCE_PROVIDER_STATE_FILE);
+}
+
+
+string getLatestResourceProviderPath(
+    const string& metaDir,
+    const SlaveID& slaveId,
+    const string& resourceProviderType,
+    const string& resourceProviderName)
+{
+  return path::join(
+      getSlavePath(metaDir, slaveId),
+      RESOURCE_PROVIDERS_DIR,
+      resourceProviderType,
+      resourceProviderName,
+      LATEST_SYMLINK);
+}
+
+
 string getResourcesInfoPath(
     const string& rootDir)
 {
@@ -672,6 +736,48 @@ string createSlaveDirectory(
   return directory;
 }
 
+
+string createResourceProviderDirectory(
+    const string& rootDir,
+    const SlaveID& slaveId,
+    const string& resourceProviderType,
+    const string& resourceProviderName,
+    const ResourceProviderID& resourceProviderId)
+{
+  const string directory = getResourceProviderPath(
+      rootDir,
+      slaveId,
+      resourceProviderType,
+      resourceProviderName,
+      resourceProviderId);
+
+  Try<Nothing> mkdir = os::mkdir(directory);
+
+  CHECK_SOME(mkdir)
+    << "Failed to create resource provider directory '" << directory << "'";
+
+  // Remove the previous "latest" symlink.
+  const string latest = getLatestResourceProviderPath(
+      rootDir,
+      slaveId,
+      resourceProviderType,
+      resourceProviderName);
+
+  if (os::exists(latest)) {
+    CHECK_SOME(os::rm(latest))
+      << "Failed to remove latest symlink '" << latest << "'";
+  }
+
+  // Symlink the new resource provider directory to "latest".
+  Try<Nothing> symlink = ::fs::symlink(directory, latest);
+
+  CHECK_SOME(symlink)
+    << "Failed to symlink directory '" << directory
+    << "' to '" << latest << "'";
+
+  return directory;
+}
+
 } // namespace paths {
 } // namespace slave {
 } // namespace internal {

http://git-wip-us.apache.org/repos/asf/mesos/blob/236fa59c/src/slave/paths.hpp
----------------------------------------------------------------------
diff --git a/src/slave/paths.hpp b/src/slave/paths.hpp
index 66dfa45..7944b7d 100644
--- a/src/slave/paths.hpp
+++ b/src/slave/paths.hpp
@@ -71,6 +71,12 @@ namespace paths {
 //   |       |-- latest (symlink)
 //   |       |-- <slave_id>
 //   |           |-- slave.info
+//   |           |-- resource_providers
+//   |           |   |-- <type>
+//   |           |       |-- <name>
+//   |           |           |-- latest (symlink)
+//   |           |           |-- <resource_provider_id>
+//   |           |               |-- resource_provider.state
 //   |           |-- frameworks
 //   |               |-- <framework_id>
 //   |                   |-- framework.info
@@ -112,7 +118,16 @@ Try<ExecutorRunPath> parseExecutorRunPath(
 
 const char LATEST_SYMLINK[] = "latest";
 
-// Helpers for obtaining paths in the layout:
+// Helpers for obtaining paths in the layout.
+// NOTE: The parameter names should adhere to the following convention:
+//
+//   (1) Use `workDir` if the helper expects the `--work_dir` flag.
+//
+//   (2) Use `metaDir` if the helper expects the meta directory.
+//
+//   (3) Use `rootDir` only if the helper is to be reused.
+//
+// TODO(chhsiao): Clean up the parameter names to follow the convention.
 
 std::string getMetaRootDir(const std::string& rootDir);
 
@@ -300,6 +315,34 @@ std::string getResourceProviderRegistryPath(
     const SlaveID& slaveId);
 
 
+Try<std::list<std::string>> getResourceProviderPaths(
+    const std::string& metaDir,
+    const SlaveID& slaveId);
+
+
+std::string getResourceProviderPath(
+    const std::string& metaDir,
+    const SlaveID& slaveId,
+    const std::string& resourceProviderType,
+    const std::string& resourceProviderName,
+    const ResourceProviderID& resourceProviderId);
+
+
+std::string getResourceProviderStatePath(
+    const std::string& metaDir,
+    const SlaveID& slaveId,
+    const std::string& resourceProviderType,
+    const std::string& resourceProviderName,
+    const ResourceProviderID& resourceProviderId);
+
+
+std::string getLatestResourceProviderPath(
+    const std::string& metaDir,
+    const SlaveID& slaveId,
+    const std::string& resourceProviderType,
+    const std::string& resourceProviderName);
+
+
 std::string getResourcesInfoPath(
     const std::string& rootDir);
 
@@ -333,6 +376,14 @@ std::string createSlaveDirectory(
     const SlaveID& slaveId);
 
 
+std::string createResourceProviderDirectory(
+    const std::string& rootDir,
+    const SlaveID& slaveId,
+    const std::string& resourceProviderType,
+    const std::string& resourceProviderName,
+    const ResourceProviderID& resourceProviderId);
+
+
 extern const char LIBPROCESS_PID_FILE[];
 extern const char HTTP_MARKER_FILE[];