You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by bm...@apache.org on 2015/01/08 20:59:31 UTC
[1/3] mesos git commit: Added slave path helpers to avoid depending
on raw format strings.
Repository: mesos
Updated Branches:
refs/heads/master f2cf56290 -> 7b1a00386
Added slave path helpers to avoid depending on raw format strings.
Review: https://reviews.apache.org/r/29675
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/d7cd0511
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/d7cd0511
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/d7cd0511
Branch: refs/heads/master
Commit: d7cd05114a298f3a5e934608c20c1831cddd30ac
Parents: f2cf562
Author: Benjamin Mahler <be...@gmail.com>
Authored: Wed Jan 7 12:37:08 2015 -0800
Committer: Benjamin Mahler <be...@gmail.com>
Committed: Thu Jan 8 11:22:14 2015 -0800
----------------------------------------------------------------------
src/slave/paths.hpp | 77 ++++++++++++++++++++++++++
src/slave/state.cpp | 19 +++----
src/tests/slave_recovery_tests.cpp | 31 ++++++-----
src/tests/status_update_manager_tests.cpp | 63 ++++++++++-----------
4 files changed, 131 insertions(+), 59 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/d7cd0511/src/slave/paths.hpp
----------------------------------------------------------------------
diff --git a/src/slave/paths.hpp b/src/slave/paths.hpp
index ee8687d..606c822 100644
--- a/src/slave/paths.hpp
+++ b/src/slave/paths.hpp
@@ -20,6 +20,7 @@
#define __SLAVE_PATHS_HPP__
#include <list>
+#include <string>
#include <stout/check.hpp>
#include <stout/foreach.hpp>
@@ -138,6 +139,22 @@ inline std::string getSlavePath(
}
+inline Try<std::list<std::string>> getFrameworkPaths(
+ const std::string& rootDir,
+ const SlaveID& slaveId)
+{
+ Try<std::string> format = strings::format(
+ paths::FRAMEWORK_PATH,
+ rootDir,
+ slaveId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
inline std::string getFrameworkPath(
const std::string& rootDir,
const SlaveID& slaveId,
@@ -168,6 +185,24 @@ inline std::string getFrameworkInfoPath(
}
+inline Try<std::list<std::string>> getExecutorPaths(
+ const std::string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId)
+{
+ Try<std::string> format = strings::format(
+ paths::EXECUTOR_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
inline std::string getExecutorPath(
const std::string& rootDir,
const SlaveID& slaveId,
@@ -190,6 +225,26 @@ inline std::string getExecutorInfoPath(
}
+inline Try<std::list<std::string>> getExecutorRunPaths(
+ const std::string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId)
+{
+ Try<std::string> format = strings::format(
+ paths::EXECUTOR_RUN_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
inline std::string getExecutorRunPath(
const std::string& rootDir,
const SlaveID& slaveId,
@@ -273,6 +328,28 @@ inline std::string getForkedPidPath(
}
+inline Try<std::list<std::string>> getTaskPaths(
+ const std::string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ Try<std::string> format = strings::format(
+ paths::TASK_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
inline std::string getTaskPath(
const std::string& rootDir,
const SlaveID& slaveId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/d7cd0511/src/slave/state.cpp
----------------------------------------------------------------------
diff --git a/src/slave/state.cpp b/src/slave/state.cpp
index 5e73dbc..9de3815 100644
--- a/src/slave/state.cpp
+++ b/src/slave/state.cpp
@@ -139,8 +139,7 @@ Try<SlaveState> SlaveState::recover(
state.info = slaveInfo.get();
// Find the frameworks.
- Try<list<string> > frameworks = os::glob(
- strings::format(paths::FRAMEWORK_PATH, rootDir, slaveId, "*").get());
+ Try<list<string> > frameworks = paths::getFrameworkPaths(rootDir, slaveId);
if (frameworks.isError()) {
return Error("Failed to find frameworks for slave " + slaveId.value() +
@@ -247,8 +246,8 @@ Try<FrameworkState> FrameworkState::recover(
state.pid = process::UPID(pid.get());
// Find the executors.
- Try<list<string> > executors = os::glob(strings::format(
- paths::EXECUTOR_PATH, rootDir, slaveId, frameworkId, "*").get());
+ Try<list<string> > executors =
+ paths::getExecutorPaths(rootDir, slaveId, frameworkId);
if (executors.isError()) {
return Error(
@@ -289,13 +288,11 @@ Try<ExecutorState> ExecutorState::recover(
string message;
// Find the runs.
- Try<list<string> > runs = os::glob(strings::format(
- paths::EXECUTOR_RUN_PATH,
+ Try<list<string> > runs = paths::getExecutorRunPaths(
rootDir,
slaveId,
frameworkId,
- executorId,
- "*").get());
+ executorId);
if (runs.isError()) {
return Error("Failed to find runs for executor '" + executorId.value() +
@@ -408,14 +405,12 @@ Try<RunState> RunState::recover(
state.completed = os::exists(path);
// Find the tasks.
- Try<list<string> > tasks = os::glob(strings::format(
- paths::TASK_PATH,
+ Try<list<string> > tasks = paths::getTaskPaths(
rootDir,
slaveId,
frameworkId,
executorId,
- containerId,
- "*").get());
+ containerId);
if (tasks.isError()) {
return Error(
http://git-wip-us.apache.org/repos/asf/mesos/blob/d7cd0511/src/tests/slave_recovery_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_recovery_tests.cpp b/src/tests/slave_recovery_tests.cpp
index cd4a398..809822e 100644
--- a/src/tests/slave_recovery_tests.cpp
+++ b/src/tests/slave_recovery_tests.cpp
@@ -2314,23 +2314,28 @@ TYPED_TEST(SlaveRecoveryTest, ReconcileTasksMissingFromSlave)
// Kill the forked pid, so that we don't leak a child process.
// Construct the executor id from the task id, since this test
// uses a command executor.
- ExecutorID executorId;
- executorId.set_value(task.task_id().value());
+ Result<slave::state::State> state =
+ slave::state::recover(slave::paths::getMetaRootDir(flags.work_dir), true);
- string executorPath = paths::getExecutorLatestRunPath(
- paths::getMetaRootDir(flags.work_dir),
- offers1.get()[0].slave_id(),
- frameworkId.get(),
- executorId);
+ ASSERT_SOME(state);
+ ASSERT_SOME(state.get().slave);
+ ASSERT_TRUE(state.get().slave.get().frameworks.contains(frameworkId.get()));
- Try<string> read = os::read(
- path::join(executorPath, "pids", paths::FORKED_PID_FILE));
- ASSERT_SOME(read);
+ slave::state::FrameworkState frameworkState =
+ state.get().slave.get().frameworks.get(frameworkId.get()).get();
- Try<pid_t> pid = numify<pid_t>(read.get());
- ASSERT_SOME(pid);
+ ASSERT_EQ(1u, frameworkState.executors.size());
+
+ slave::state::ExecutorState executorState =
+ frameworkState.executors.begin()->second;
+
+ ASSERT_EQ(1u, executorState.runs.size());
+
+ slave::state::RunState runState = executorState.runs.begin()->second;
+
+ ASSERT_SOME(runState.forkedPid);
- ASSERT_SOME(os::killtree(pid.get(), SIGKILL));
+ ASSERT_SOME(os::killtree(runState.forkedPid.get(), SIGKILL));
// Remove the framework meta directory, so that the slave will not
// recover the task.
http://git-wip-us.apache.org/repos/asf/mesos/blob/d7cd0511/src/tests/status_update_manager_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/status_update_manager_tests.cpp b/src/tests/status_update_manager_tests.cpp
index b0b1316..6ff7320 100644
--- a/src/tests/status_update_manager_tests.cpp
+++ b/src/tests/status_update_manager_tests.cpp
@@ -41,6 +41,7 @@
#include "slave/constants.hpp"
#include "slave/paths.hpp"
#include "slave/slave.hpp"
+#include "slave/state.hpp"
#include "messages/messages.hpp"
@@ -49,7 +50,6 @@
using namespace mesos;
using namespace mesos::internal;
using namespace mesos::internal::tests;
-using namespace mesos::internal::slave::paths;
using mesos::internal::master::Master;
@@ -110,8 +110,9 @@ TEST_F(StatusUpdateManagerTest, CheckpointStatusUpdate)
MesosSchedulerDriver driver(
&sched, frameworkInfo, master.get(), DEFAULT_CREDENTIAL);
+ Future<FrameworkID> frameworkId;
EXPECT_CALL(sched, registered(_, _, _))
- .Times(1);
+ .WillOnce(FutureArg<1>(&frameworkId));
Future<vector<Offer> > offers;
EXPECT_CALL(sched, resourceOffers(_, _))
@@ -120,6 +121,7 @@ TEST_F(StatusUpdateManagerTest, CheckpointStatusUpdate)
driver.start();
+ AWAIT_READY(frameworkId);
AWAIT_READY(offers);
EXPECT_NE(0u, offers.get().size());
@@ -145,38 +147,31 @@ TEST_F(StatusUpdateManagerTest, CheckpointStatusUpdate)
// Ensure that both the status update and its acknowledgement are
// correctly checkpointed.
- Try<list<string> > found = os::find(flags.work_dir, TASK_UPDATES_FILE);
- ASSERT_SOME(found);
- ASSERT_EQ(1u, found.get().size());
-
- Try<int> fd = os::open(found.get().front(), O_RDONLY);
- ASSERT_SOME(fd);
-
- int updates = 0;
- int acks = 0;
- string uuid;
- Result<StatusUpdateRecord> record = None();
- while (true) {
- record = ::protobuf::read<StatusUpdateRecord>(fd.get());
- ASSERT_FALSE(record.isError());
- if (record.isNone()) { // Reached EOF.
- break;
- }
-
- if (record.get().type() == StatusUpdateRecord::UPDATE) {
- EXPECT_EQ(TASK_RUNNING, record.get().update().status().state());
- uuid = record.get().update().uuid();
- updates++;
- } else {
- EXPECT_EQ(uuid, record.get().uuid());
- acks++;
- }
- }
-
- ASSERT_EQ(1, updates);
- ASSERT_EQ(1, acks);
-
- close(fd.get());
+ Result<slave::state::State> state =
+ slave::state::recover(slave::paths::getMetaRootDir(flags.work_dir), true);
+
+ ASSERT_SOME(state);
+ ASSERT_SOME(state.get().slave);
+ ASSERT_TRUE(state.get().slave.get().frameworks.contains(frameworkId.get()));
+
+ slave::state::FrameworkState frameworkState =
+ state.get().slave.get().frameworks.get(frameworkId.get()).get();
+
+ ASSERT_EQ(1u, frameworkState.executors.size());
+
+ slave::state::ExecutorState executorState =
+ frameworkState.executors.begin()->second;
+
+ ASSERT_EQ(1u, executorState.runs.size());
+
+ slave::state::RunState runState = executorState.runs.begin()->second;
+
+ ASSERT_EQ(1u, runState.tasks.size());
+
+ slave::state::TaskState taskState = runState.tasks.begin()->second;
+
+ EXPECT_EQ(1u, taskState.updates.size());
+ EXPECT_EQ(1u, taskState.acks.size());
EXPECT_CALL(exec, shutdown(_))
.Times(AtMost(1));
[3/3] mesos git commit: Documented the slave's filesystem layout.
Posted by bm...@apache.org.
Documented the slave's filesystem layout.
Review: https://reviews.apache.org/r/29677
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/7b1a0038
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/7b1a0038
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/7b1a0038
Branch: refs/heads/master
Commit: 7b1a003865736154eba8836fa035bc414c9626e2
Parents: 2eff8dd
Author: Benjamin Mahler <be...@gmail.com>
Authored: Wed Jan 7 12:19:27 2015 -0800
Committer: Benjamin Mahler <be...@gmail.com>
Committed: Thu Jan 8 11:40:11 2015 -0800
----------------------------------------------------------------------
src/slave/paths.hpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/7b1a0038/src/slave/paths.hpp
----------------------------------------------------------------------
diff --git a/src/slave/paths.hpp b/src/slave/paths.hpp
index 1e9e823..8378a51 100644
--- a/src/slave/paths.hpp
+++ b/src/slave/paths.hpp
@@ -29,6 +29,62 @@ namespace internal {
namespace slave {
namespace paths {
+
+// The slave leverages the file system for a number of purposes:
+//
+// (1) For executor sandboxes.
+//
+// (2) For checkpointing metadata in order to support "slave
+// recovery". That is, allow the slave to restart without
+// affecting the tasks / executors.
+//
+// (3) To detect reboots (by checkpointing the boot id), in which
+// case everything has died so no recovery should be attempted.
+//
+// (4) For checkpointing resources that persist across slaves.
+// This includes things like persistent volumes and dynamic
+// reservations.
+//
+// The file system layout is as follows:
+//
+// root ('--work_dir' flag)
+// |-- slaves
+// | |-- latest (symlink)
+// | |-- <slave_id>
+// | |-- frameworks
+// | |-- <framework__id>
+// | |-- executors
+// | |-- <executor_id>
+// | |-- runs
+// | |-- latest (symlink)
+// | |-- <container_id> (sandbox)
+// |-- meta
+// | |-- slaves
+// | |-- latest (symlink)
+// | |-- <slave_id>
+// | |-- slave.info
+// | |-- frameworks
+// | |-- <framework__id>
+// | |-- framework.info
+// | |-- framework.pid
+// | |-- executors
+// | |-- <executor_id>
+// | |-- executor.info
+// | |-- runs
+// | |-- latest (symlink)
+// | |-- <container_id> (sandbox)
+// | |-- executor.sentinel (if completed)
+// | |-- pids
+// | | |-- forked.pid
+// | | |-- libprocess.pid
+// | |-- tasks
+// | |-- <task_id>
+// | |-- task.info
+// | |-- task.updates
+// |-- boot_id
+// |-- resources
+// |-- resources.info
+
const std::string LATEST_SYMLINK = "latest";
// Helpers for obtaining paths in the layout:
[2/3] mesos git commit: Moved the raw path formatting strings into a
.cpp file.
Posted by bm...@apache.org.
Moved the raw path formatting strings into a .cpp file.
Review: https://reviews.apache.org/r/29676
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/2eff8dd4
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/2eff8dd4
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/2eff8dd4
Branch: refs/heads/master
Commit: 2eff8dd4b3a3d363021a0d3308188d6f23565dfb
Parents: d7cd051
Author: Benjamin Mahler <be...@gmail.com>
Authored: Wed Jan 7 12:18:49 2015 -0800
Committer: Benjamin Mahler <be...@gmail.com>
Committed: Thu Jan 8 11:40:10 2015 -0800
----------------------------------------------------------------------
src/Makefile.am | 1 +
src/slave/paths.cpp | 486 +++++++++++++++++++++++++++++++++++++++++++++++
src/slave/paths.hpp | 437 ++++++++----------------------------------
3 files changed, 563 insertions(+), 361 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/2eff8dd4/src/Makefile.am
----------------------------------------------------------------------
diff --git a/src/Makefile.am b/src/Makefile.am
index f989a54..fc0c322 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -304,6 +304,7 @@ libmesos_no_3rdparty_la_SOURCES = \
slave/http.cpp \
slave/metrics.cpp \
slave/monitor.cpp \
+ slave/paths.cpp \
slave/state.cpp \
slave/slave.cpp \
slave/containerizer/containerizer.cpp \
http://git-wip-us.apache.org/repos/asf/mesos/blob/2eff8dd4/src/slave/paths.cpp
----------------------------------------------------------------------
diff --git a/src/slave/paths.cpp b/src/slave/paths.cpp
new file mode 100644
index 0000000..edd8011
--- /dev/null
+++ b/src/slave/paths.cpp
@@ -0,0 +1,486 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <list>
+#include <string>
+
+#include <mesos/mesos.hpp>
+
+#include <stout/check.hpp>
+#include <stout/format.hpp>
+#include <stout/fs.hpp>
+#include <stout/nothing.hpp>
+#include <stout/os.hpp>
+#include <stout/try.hpp>
+
+#include "common/type_utils.hpp"
+
+#include "messages/messages.hpp"
+
+#include "slave/paths.hpp"
+
+using std::list;
+using std::string;
+
+namespace mesos {
+namespace internal {
+namespace slave {
+namespace paths {
+
+// TODO(bmahler): Replace these non-POD globals, per MESOS-1023.
+
+// File names.
+const string BOOT_ID_FILE = "boot_id";
+const string SLAVE_INFO_FILE = "slave.info";
+const string FRAMEWORK_PID_FILE = "framework.pid";
+const string FRAMEWORK_INFO_FILE = "framework.info";
+const string LIBPROCESS_PID_FILE = "libprocess.pid";
+const string EXECUTOR_INFO_FILE = "executor.info";
+const string EXECUTOR_SENTINEL_FILE = "executor.sentinel";
+const string FORKED_PID_FILE = "forked.pid";
+const string TASK_INFO_FILE = "task.info";
+const string TASK_UPDATES_FILE = "task.updates";
+const string RESOURCES_INFO_FILE = "resources.info";
+
+// Path layout templates.
+const string ROOT_PATH = "%s";
+const string LATEST_SLAVE_PATH =
+ path::join(ROOT_PATH, "slaves", LATEST_SYMLINK);
+const string SLAVE_PATH =
+ path::join(ROOT_PATH, "slaves", "%s");
+const string BOOT_ID_PATH =
+ path::join(ROOT_PATH, BOOT_ID_FILE);
+const string SLAVE_INFO_PATH =
+ path::join(SLAVE_PATH, SLAVE_INFO_FILE);
+const string FRAMEWORK_PATH =
+ path::join(SLAVE_PATH, "frameworks", "%s");
+const string FRAMEWORK_PID_PATH =
+ path::join(FRAMEWORK_PATH, FRAMEWORK_PID_FILE);
+const string FRAMEWORK_INFO_PATH =
+ path::join(FRAMEWORK_PATH, FRAMEWORK_INFO_FILE);
+const string EXECUTOR_PATH =
+ path::join(FRAMEWORK_PATH, "executors", "%s");
+const string EXECUTOR_INFO_PATH =
+ path::join(EXECUTOR_PATH, EXECUTOR_INFO_FILE);
+const string EXECUTOR_RUN_PATH =
+ path::join(EXECUTOR_PATH, "runs", "%s");
+const string EXECUTOR_SENTINEL_PATH =
+ path::join(EXECUTOR_RUN_PATH, EXECUTOR_SENTINEL_FILE);
+const string EXECUTOR_LATEST_RUN_PATH =
+ path::join(EXECUTOR_PATH, "runs", LATEST_SYMLINK);
+const string PIDS_PATH =
+ path::join(EXECUTOR_RUN_PATH, "pids");
+const string LIBPROCESS_PID_PATH =
+ path::join(PIDS_PATH, LIBPROCESS_PID_FILE);
+const string FORKED_PID_PATH =
+ path::join(PIDS_PATH, FORKED_PID_FILE);
+const string TASK_PATH =
+ path::join(EXECUTOR_RUN_PATH, "tasks", "%s");
+const string TASK_INFO_PATH =
+ path::join(TASK_PATH, TASK_INFO_FILE);
+const string TASK_UPDATES_PATH =
+ path::join(TASK_PATH, TASK_UPDATES_FILE);
+const string RESOURCES_INFO_PATH =
+ path::join(ROOT_PATH, "resources", RESOURCES_INFO_FILE);
+
+
+string getMetaRootDir(const string& rootDir)
+{
+ return path::join(rootDir, "meta");
+}
+
+
+string getArchiveDir(const string& rootDir)
+{
+ return path::join(rootDir, "archive");
+}
+
+
+string getLatestSlavePath(const string& rootDir)
+{
+ return strings::format(LATEST_SLAVE_PATH, rootDir).get();
+}
+
+
+string getBootIdPath(const string& rootDir)
+{
+ return strings::format(BOOT_ID_PATH, rootDir).get();
+}
+
+
+string getSlaveInfoPath(
+ const string& rootDir,
+ const SlaveID& slaveId)
+{
+ return strings::format(SLAVE_INFO_PATH, rootDir, slaveId).get();
+}
+
+
+string getSlavePath(
+ const string& rootDir,
+ const SlaveID& slaveId)
+{
+ return strings::format(SLAVE_PATH, rootDir, slaveId).get();
+}
+
+
+Try<list<string>> getFrameworkPaths(
+ const string& rootDir,
+ const SlaveID& slaveId)
+{
+ Try<string> format = strings::format(
+ paths::FRAMEWORK_PATH,
+ rootDir,
+ slaveId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
+string getFrameworkPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId)
+{
+ return strings::format(
+ FRAMEWORK_PATH, rootDir, slaveId, frameworkId).get();
+}
+
+
+string getFrameworkPidPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId)
+{
+ return strings::format(
+ FRAMEWORK_PID_PATH, rootDir, slaveId, frameworkId).get();
+}
+
+
+string getFrameworkInfoPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId)
+{
+ return strings::format(
+ FRAMEWORK_INFO_PATH, rootDir, slaveId, frameworkId).get();
+}
+
+
+Try<list<string>> getExecutorPaths(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId)
+{
+ Try<string> format = strings::format(
+ paths::EXECUTOR_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
+string getExecutorPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId)
+{
+ return strings::format(
+ EXECUTOR_PATH, rootDir, slaveId, frameworkId, executorId).get();
+}
+
+
+string getExecutorInfoPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId)
+{
+ return strings::format(
+ EXECUTOR_INFO_PATH, rootDir, slaveId, frameworkId, executorId).get();
+}
+
+
+Try<list<string>> getExecutorRunPaths(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId)
+{
+ Try<string> format = strings::format(
+ paths::EXECUTOR_RUN_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
+string getExecutorRunPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ return strings::format(
+ EXECUTOR_RUN_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId).get();
+}
+
+
+string getExecutorSentinelPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ return strings::format(
+ EXECUTOR_SENTINEL_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId).get();
+}
+
+
+string getExecutorLatestRunPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId)
+{
+ return strings::format(
+ EXECUTOR_LATEST_RUN_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId).get();
+}
+
+
+string getLibprocessPidPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ return strings::format(
+ LIBPROCESS_PID_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId).get();
+}
+
+
+string getForkedPidPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ return strings::format(
+ FORKED_PID_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId).get();
+}
+
+
+Try<list<string>> getTaskPaths(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ Try<string> format = strings::format(
+ paths::TASK_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId,
+ "*");
+
+ CHECK_SOME(format);
+
+ return os::glob(format.get());
+}
+
+
+string getTaskPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId,
+ const TaskID& taskId)
+{
+ return strings::format(
+ TASK_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId,
+ taskId).get();
+}
+
+
+string getTaskInfoPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId,
+ const TaskID& taskId)
+{
+ return strings::format(
+ TASK_INFO_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId,
+ taskId).get();
+}
+
+
+string getTaskUpdatesPath(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId,
+ const TaskID& taskId)
+{
+ return strings::format(
+ TASK_UPDATES_PATH,
+ rootDir,
+ slaveId,
+ frameworkId,
+ executorId,
+ containerId,
+ taskId).get();
+}
+
+
+string getResourcesInfoPath(
+ const string& rootDir)
+{
+ return strings::format(
+ RESOURCES_INFO_PATH,
+ rootDir).get();
+}
+
+
+string createExecutorDirectory(
+ const string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId)
+{
+ string directory =
+ getExecutorRunPath(rootDir, slaveId, frameworkId, executorId, containerId);
+
+ Try<Nothing> mkdir = os::mkdir(directory);
+
+ CHECK_SOME(mkdir)
+ << "Failed to create executor directory '" << directory << "'";
+
+ // Remove the previous "latest" symlink.
+ string latest =
+ getExecutorLatestRunPath(rootDir, slaveId, frameworkId, executorId);
+
+ if (os::exists(latest)) {
+ CHECK_SOME(os::rm(latest))
+ << "Failed to remove latest symlink '" << latest << "'";
+ }
+
+ // Symlink the new executor directory to "latest".
+ Try<Nothing> symlink = ::fs::symlink(directory, latest);
+
+ CHECK_SOME(symlink)
+ << "Failed to symlink directory '" << directory
+ << "' to '" << latest << "'";
+
+ return directory;
+}
+
+
+string createSlaveDirectory(
+ const string& rootDir,
+ const SlaveID& slaveId)
+{
+ string directory = getSlavePath(rootDir, slaveId);
+
+ Try<Nothing> mkdir = os::mkdir(directory);
+
+ CHECK_SOME(mkdir)
+ << "Failed to create slave directory '" << directory << "'";
+
+ // Remove the previous "latest" symlink.
+ string latest = getLatestSlavePath(rootDir);
+
+ if (os::exists(latest)) {
+ CHECK_SOME(os::rm(latest))
+ << "Failed to remove latest symlink '" << latest << "'";
+ }
+
+ // Symlink the new slave 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 {
+} // namespace mesos {
http://git-wip-us.apache.org/repos/asf/mesos/blob/2eff8dd4/src/slave/paths.hpp
----------------------------------------------------------------------
diff --git a/src/slave/paths.hpp b/src/slave/paths.hpp
index 606c822..1e9e823 100644
--- a/src/slave/paths.hpp
+++ b/src/slave/paths.hpp
@@ -22,18 +22,7 @@
#include <list>
#include <string>
-#include <stout/check.hpp>
-#include <stout/foreach.hpp>
-#include <stout/format.hpp>
-#include <stout/fs.hpp>
-#include <stout/nothing.hpp>
-#include <stout/os.hpp>
-#include <stout/try.hpp>
-#include <stout/uuid.hpp>
-
-#include "logging/logging.hpp"
-
-#include "messages/messages.hpp"
+#include <mesos/mesos.hpp>
namespace mesos {
namespace internal {
@@ -42,443 +31,169 @@ namespace paths {
const std::string LATEST_SYMLINK = "latest";
-// Helper functions to generate paths.
-
-// File names.
-const std::string BOOT_ID_FILE = "boot_id";
-const std::string SLAVE_INFO_FILE = "slave.info";
-const std::string FRAMEWORK_PID_FILE = "framework.pid";
-const std::string FRAMEWORK_INFO_FILE = "framework.info";
-const std::string LIBPROCESS_PID_FILE = "libprocess.pid";
-const std::string EXECUTOR_INFO_FILE = "executor.info";
-const std::string EXECUTOR_SENTINEL_FILE = "executor.sentinel";
-const std::string FORKED_PID_FILE = "forked.pid";
-const std::string TASK_INFO_FILE = "task.info";
-const std::string TASK_UPDATES_FILE = "task.updates";
-const std::string RESOURCES_INFO_FILE = "resources.info";
-
-// Path layout templates.
-const std::string ROOT_PATH = "%s";
-const std::string LATEST_SLAVE_PATH =
- path::join(ROOT_PATH, "slaves", LATEST_SYMLINK);
-const std::string SLAVE_PATH =
- path::join(ROOT_PATH, "slaves", "%s");
-const std::string BOOT_ID_PATH =
- path::join(ROOT_PATH, BOOT_ID_FILE);
-const std::string SLAVE_INFO_PATH =
- path::join(SLAVE_PATH, SLAVE_INFO_FILE);
-const std::string FRAMEWORK_PATH =
- path::join(SLAVE_PATH, "frameworks", "%s");
-const std::string FRAMEWORK_PID_PATH =
- path::join(FRAMEWORK_PATH, FRAMEWORK_PID_FILE);
-const std::string FRAMEWORK_INFO_PATH =
- path::join(FRAMEWORK_PATH, FRAMEWORK_INFO_FILE);
-const std::string EXECUTOR_PATH =
- path::join(FRAMEWORK_PATH, "executors", "%s");
-const std::string EXECUTOR_INFO_PATH =
- path::join(EXECUTOR_PATH, EXECUTOR_INFO_FILE);
-const std::string EXECUTOR_RUN_PATH =
- path::join(EXECUTOR_PATH, "runs", "%s");
-const std::string EXECUTOR_SENTINEL_PATH =
- path::join(EXECUTOR_RUN_PATH, EXECUTOR_SENTINEL_FILE);
-const std::string EXECUTOR_LATEST_RUN_PATH =
- path::join(EXECUTOR_PATH, "runs", LATEST_SYMLINK);
-const std::string PIDS_PATH =
- path::join(EXECUTOR_RUN_PATH, "pids");
-const std::string LIBPROCESS_PID_PATH =
- path::join(PIDS_PATH, LIBPROCESS_PID_FILE);
-const std::string FORKED_PID_PATH =
- path::join(PIDS_PATH, FORKED_PID_FILE);
-const std::string TASK_PATH =
- path::join(EXECUTOR_RUN_PATH, "tasks", "%s");
-const std::string TASK_INFO_PATH =
- path::join(TASK_PATH, TASK_INFO_FILE);
-const std::string TASK_UPDATES_PATH =
- path::join(TASK_PATH, TASK_UPDATES_FILE);
-const std::string RESOURCES_INFO_PATH =
- path::join(ROOT_PATH, "resources", RESOURCES_INFO_FILE);
-
-
-inline std::string getMetaRootDir(const std::string rootDir)
-{
- return path::join(rootDir, "meta");
-}
-
-
-inline std::string getArchiveDir(const std::string rootDir)
-{
- return path::join(rootDir, "archive");
-}
-
-
-inline std::string getLatestSlavePath(const std::string& rootDir)
-{
- return strings::format(LATEST_SLAVE_PATH, rootDir).get();
-}
-
-
-inline std::string getBootIdPath(const std::string& rootDir)
-{
- return strings::format(BOOT_ID_PATH, rootDir).get();
-}
-
-
-inline std::string getSlaveInfoPath(
- const std::string& rootDir,
- const SlaveID& slaveId)
-{
- return strings::format(SLAVE_INFO_PATH, rootDir, slaveId).get();
-}
+// Helpers for obtaining paths in the layout:
+std::string getMetaRootDir(const std::string& rootDir);
-inline std::string getSlavePath(
- const std::string& rootDir,
- const SlaveID& slaveId)
-{
- return strings::format(SLAVE_PATH, rootDir, slaveId).get();
-}
+
+std::string getArchiveDir(const std::string& rootDir);
+
+
+std::string getLatestSlavePath(const std::string& rootDir);
-inline Try<std::list<std::string>> getFrameworkPaths(
+std::string getBootIdPath(const std::string& rootDir);
+
+
+std::string getSlaveInfoPath(
const std::string& rootDir,
- const SlaveID& slaveId)
-{
- Try<std::string> format = strings::format(
- paths::FRAMEWORK_PATH,
- rootDir,
- slaveId,
- "*");
+ const SlaveID& slaveId);
- CHECK_SOME(format);
- return os::glob(format.get());
-}
+std::string getSlavePath(
+ const std::string& rootDir,
+ const SlaveID& slaveId);
-inline std::string getFrameworkPath(
+Try<std::list<std::string>> getFrameworkPaths(
const std::string& rootDir,
- const SlaveID& slaveId,
- const FrameworkID& frameworkId)
-{
- return strings::format(
- FRAMEWORK_PATH, rootDir, slaveId, frameworkId).get();
-}
+ const SlaveID& slaveId);
-inline std::string getFrameworkPidPath(
+std::string getFrameworkPath(
const std::string& rootDir,
const SlaveID& slaveId,
- const FrameworkID& frameworkId)
-{
- return strings::format(
- FRAMEWORK_PID_PATH, rootDir, slaveId, frameworkId).get();
-}
+ const FrameworkID& frameworkId);
-inline std::string getFrameworkInfoPath(
+std::string getFrameworkPidPath(
const std::string& rootDir,
const SlaveID& slaveId,
- const FrameworkID& frameworkId)
-{
- return strings::format(
- FRAMEWORK_INFO_PATH, rootDir, slaveId, frameworkId).get();
-}
+ const FrameworkID& frameworkId);
-inline Try<std::list<std::string>> getExecutorPaths(
+std::string getFrameworkInfoPath(
const std::string& rootDir,
const SlaveID& slaveId,
- const FrameworkID& frameworkId)
-{
- Try<std::string> format = strings::format(
- paths::EXECUTOR_PATH,
- rootDir,
- slaveId,
- frameworkId,
- "*");
+ const FrameworkID& frameworkId);
- CHECK_SOME(format);
- return os::glob(format.get());
-}
+Try<std::list<std::string>> getExecutorPaths(
+ const std::string& rootDir,
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId);
-inline std::string getExecutorPath(
+std::string getExecutorPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
- const ExecutorID& executorId)
-{
- return strings::format(
- EXECUTOR_PATH, rootDir, slaveId, frameworkId, executorId).get();
-}
+ const ExecutorID& executorId);
-inline std::string getExecutorInfoPath(
+std::string getExecutorInfoPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
- const ExecutorID& executorId)
-{
- return strings::format(
- EXECUTOR_INFO_PATH, rootDir, slaveId, frameworkId, executorId).get();
-}
+ const ExecutorID& executorId);
-inline Try<std::list<std::string>> getExecutorRunPaths(
+Try<std::list<std::string>> getExecutorRunPaths(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
- const ExecutorID& executorId)
-{
- Try<std::string> format = strings::format(
- paths::EXECUTOR_RUN_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- "*");
+ const ExecutorID& executorId);
- CHECK_SOME(format);
- return os::glob(format.get());
-}
-
-
-inline std::string getExecutorRunPath(
+std::string getExecutorRunPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
- const ContainerID& containerId)
-{
- return strings::format(
- EXECUTOR_RUN_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId).get();
-}
-
-
-inline std::string getExecutorSentinelPath(
+ const ContainerID& containerId);
+
+
+std::string getExecutorSentinelPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
- const ContainerID& containerId)
-{
- return strings::format(
- EXECUTOR_SENTINEL_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId).get();
-}
-
-
-inline std::string getExecutorLatestRunPath(
+ const ContainerID& containerId);
+
+
+std::string getExecutorLatestRunPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
- const ExecutorID& executorId)
-{
- return strings::format(
- EXECUTOR_LATEST_RUN_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId).get();
-}
-
-
-inline std::string getLibprocessPidPath(
+ const ExecutorID& executorId);
+
+
+std::string getLibprocessPidPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
- const ContainerID& containerId)
-{
- return strings::format(
- LIBPROCESS_PID_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId).get();
-}
-
-
-inline std::string getForkedPidPath(
+ const ContainerID& containerId);
+
+
+std::string getForkedPidPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
- const ContainerID& containerId)
-{
- return strings::format(
- FORKED_PID_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId).get();
-}
-
-
-inline Try<std::list<std::string>> getTaskPaths(
+ const ContainerID& containerId);
+
+
+Try<std::list<std::string>> getTaskPaths(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
- const ContainerID& containerId)
-{
- Try<std::string> format = strings::format(
- paths::TASK_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId,
- "*");
+ const ContainerID& containerId);
- CHECK_SOME(format);
- return os::glob(format.get());
-}
-
-
-inline std::string getTaskPath(
+std::string getTaskPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
const ContainerID& containerId,
- const TaskID& taskId)
-{
- return strings::format(
- TASK_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId,
- taskId).get();
-}
-
-
-inline std::string getTaskInfoPath(
+ const TaskID& taskId);
+
+
+std::string getTaskInfoPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
const ContainerID& containerId,
- const TaskID& taskId)
-{
- return strings::format(
- TASK_INFO_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId,
- taskId).get();
-}
-
-
-inline std::string getTaskUpdatesPath(
+ const TaskID& taskId);
+
+
+std::string getTaskUpdatesPath(
const std::string& rootDir,
const SlaveID& slaveId,
const FrameworkID& frameworkId,
const ExecutorID& executorId,
const ContainerID& containerId,
- const TaskID& taskId)
-{
- return strings::format(
- TASK_UPDATES_PATH,
- rootDir,
- slaveId,
- frameworkId,
- executorId,
- containerId,
- taskId).get();
-}
-
-
-inline std::string getResourcesInfoPath(
- const std::string& rootDir)
-{
- return strings::format(
- RESOURCES_INFO_PATH,
- rootDir).get();
-}
-
-
-inline std::string createExecutorDirectory(
- const std::string& rootDir,
- const SlaveID& slaveId,
- const FrameworkID& frameworkId,
- const ExecutorID& executorId,
- const ContainerID& containerId)
-{
- std::string directory =
- getExecutorRunPath(rootDir, slaveId, frameworkId, executorId, containerId);
-
- Try<Nothing> mkdir = os::mkdir(directory);
-
- CHECK_SOME(mkdir)
- << "Failed to create executor directory '" << directory << "'";
+ const TaskID& taskId);
- // Remove the previous "latest" symlink.
- std::string latest =
- getExecutorLatestRunPath(rootDir, slaveId, frameworkId, executorId);
- if (os::exists(latest)) {
- CHECK_SOME(os::rm(latest))
- << "Failed to remove latest symlink '" << latest << "'";
- }
+std::string getResourcesInfoPath(
+ const std::string& rootDir);
- // Symlink the new executor directory to "latest".
- Try<Nothing> symlink = ::fs::symlink(directory, latest);
- CHECK_SOME(symlink)
- << "Failed to symlink directory '" << directory
- << "' to '" << latest << "'";
-
- return directory;
-}
-
-
-inline std::string createSlaveDirectory(
+std::string createExecutorDirectory(
const std::string& rootDir,
- const SlaveID& slaveId)
-{
- std::string directory = getSlavePath(rootDir, slaveId);
-
- Try<Nothing> mkdir = os::mkdir(directory);
-
- CHECK_SOME(mkdir)
- << "Failed to create slave directory '" << directory << "'";
-
- // Remove the previous "latest" symlink.
- std::string latest = getLatestSlavePath(rootDir);
-
- if (os::exists(latest)) {
- CHECK_SOME(os::rm(latest))
- << "Failed to remove latest symlink '" << latest << "'";
- }
-
- // Symlink the new slave directory to "latest".
- Try<Nothing> symlink = ::fs::symlink(directory, latest);
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const ExecutorID& executorId,
+ const ContainerID& containerId);
- CHECK_SOME(symlink)
- << "Failed to symlink directory '" << directory
- << "' to '" << latest << "'";
- return directory;
-}
+std::string createSlaveDirectory(
+ const std::string& rootDir,
+ const SlaveID& slaveId);
} // namespace paths {
} // namespace slave {