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[];