You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by nn...@apache.org on 2015/02/10 19:22:38 UTC
[4/9] mesos git commit: Out of tree build 4: Introduced
ExecutorRunState struct for Isolators and Launchers.
Out of tree build 4: Introduced ExecutorRunState struct for Isolators and Launchers.
The struct is constructed from some fields of RunState and passed on
to Isolators. This further allows us to do cleanup various
isolators/launchers. The goal was to remove the dependency on RunState
so that we can eventually expose slave/containerizer/isolator.hpp as a
public header.
Review: https://reviews.apache.org/r/30338
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/79a18e60
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/79a18e60
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/79a18e60
Branch: refs/heads/master
Commit: 79a18e60f81e9234f4d1d308030a9c815af89913
Parents: bcb01db
Author: Kapil Arya <ka...@mesosphere.io>
Authored: Tue Feb 10 09:54:03 2015 -0800
Committer: Niklas Q. Nielsen <ni...@mesosphere.io>
Committed: Tue Feb 10 09:54:03 2015 -0800
----------------------------------------------------------------------
.../containerizer/external_containerizer.hpp | 2 ++
src/slave/containerizer/isolator.cpp | 2 +-
src/slave/containerizer/isolator.hpp | 21 ++++++++++++++----
.../isolators/cgroups/cpushare.cpp | 14 +++---------
.../isolators/cgroups/cpushare.hpp | 2 +-
.../containerizer/isolators/cgroups/mem.cpp | 14 +++---------
.../containerizer/isolators/cgroups/mem.hpp | 2 +-
.../isolators/cgroups/perf_event.cpp | 14 +++---------
.../isolators/cgroups/perf_event.hpp | 2 +-
.../isolators/filesystem/shared.cpp | 2 +-
.../isolators/filesystem/shared.hpp | 2 +-
.../containerizer/isolators/namespaces/pid.cpp | 11 +++-------
.../containerizer/isolators/namespaces/pid.hpp | 2 +-
.../isolators/network/port_mapping.cpp | 22 ++++---------------
.../isolators/network/port_mapping.hpp | 2 +-
src/slave/containerizer/isolators/posix.hpp | 18 +++++----------
.../containerizer/isolators/posix/disk.cpp | 16 +++-----------
.../containerizer/isolators/posix/disk.hpp | 2 +-
src/slave/containerizer/launcher.cpp | 21 +++++-------------
src/slave/containerizer/launcher.hpp | 7 +++---
src/slave/containerizer/linux_launcher.cpp | 19 +++++-----------
src/slave/containerizer/linux_launcher.hpp | 2 +-
src/slave/containerizer/mesos/containerizer.cpp | 23 +++++++++++---------
src/slave/containerizer/mesos/containerizer.hpp | 6 +++--
src/tests/isolator.hpp | 2 +-
25 files changed, 86 insertions(+), 144 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/external_containerizer.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/external_containerizer.hpp b/src/slave/containerizer/external_containerizer.hpp
index 1296878..d7ae6d6 100644
--- a/src/slave/containerizer/external_containerizer.hpp
+++ b/src/slave/containerizer/external_containerizer.hpp
@@ -31,6 +31,8 @@
#include <stout/try.hpp>
#include <stout/tuple.hpp>
+#include "slave/state.hpp"
+
#include "slave/containerizer/containerizer.hpp"
#include "slave/containerizer/isolator.hpp"
#include "slave/containerizer/launcher.hpp"
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolator.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolator.cpp b/src/slave/containerizer/isolator.cpp
index bb4da46..9f5ba99 100644
--- a/src/slave/containerizer/isolator.cpp
+++ b/src/slave/containerizer/isolator.cpp
@@ -43,7 +43,7 @@ Isolator::~Isolator()
}
-Future<Nothing> Isolator::recover(const list<state::RunState>& state)
+Future<Nothing> Isolator::recover(const list<ExecutorRunState>& state)
{
return dispatch(process.get(), &IsolatorProcess::recover, state);
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolator.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolator.hpp b/src/slave/containerizer/isolator.hpp
index e39a8a5..0823f4a 100644
--- a/src/slave/containerizer/isolator.hpp
+++ b/src/slave/containerizer/isolator.hpp
@@ -31,8 +31,6 @@
#include <stout/try.hpp>
-#include "slave/state.hpp"
-
namespace mesos {
namespace slave {
@@ -61,6 +59,21 @@ struct Limitation
};
+// This struct is derived from slave::state::RunState. It contains
+// only those fields that are needed by Isolators for recovering the
+// containers. The reason for not using RunState instead is to avoid
+// any dependency on RunState and in turn on internal protobufs.
+struct ExecutorRunState
+{
+ ExecutorRunState(ContainerID id_, pid_t pid_, std::string directory_)
+ : id(id_), pid(pid_), directory(directory_) {}
+
+ ContainerID id; // Container id of the last executor run.
+ pid_t pid; // Executor pid.
+ std::string directory; // Executor work directory.
+};
+
+
class Isolator
{
public:
@@ -69,7 +82,7 @@ public:
// Recover containers from the run states.
process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
// Prepare for isolation of the executor. Any steps that require execution in
// the containerized context (e.g. inside a network namespace) can be
@@ -118,7 +131,7 @@ public:
virtual ~IsolatorProcess() {}
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& state) = 0;
+ const std::list<ExecutorRunState>& state) = 0;
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/cgroups/cpushare.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/cpushare.cpp b/src/slave/containerizer/isolators/cgroups/cpushare.cpp
index 91e3a01..e724b12 100644
--- a/src/slave/containerizer/isolators/cgroups/cpushare.cpp
+++ b/src/slave/containerizer/isolators/cgroups/cpushare.cpp
@@ -167,20 +167,12 @@ Try<Isolator*> CgroupsCpushareIsolatorProcess::create(const Flags& flags)
Future<Nothing> CgroupsCpushareIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
hashset<string> cgroups;
- foreach (const state::RunState& state, states) {
- if (!state.id.isSome()) {
- foreachvalue (Info* info, infos) {
- delete info;
- }
- infos.clear();
- return Failure("ContainerID is required to recover");
- }
-
- const ContainerID& containerId = state.id.get();
+ foreach (const ExecutorRunState& state, states) {
+ const ContainerID& containerId = state.id;
const string cgroup = path::join(flags.cgroups_root, containerId.value());
Try<bool> exists = cgroups::exists(hierarchies["cpu"], cgroup);
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/cgroups/cpushare.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/cpushare.hpp b/src/slave/containerizer/isolators/cgroups/cpushare.hpp
index 1050af7..6c6c57d 100644
--- a/src/slave/containerizer/isolators/cgroups/cpushare.hpp
+++ b/src/slave/containerizer/isolators/cgroups/cpushare.hpp
@@ -44,7 +44,7 @@ public:
virtual ~CgroupsCpushareIsolatorProcess();
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/cgroups/mem.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/mem.cpp b/src/slave/containerizer/isolators/cgroups/mem.cpp
index 276aa2b..c022127 100644
--- a/src/slave/containerizer/isolators/cgroups/mem.cpp
+++ b/src/slave/containerizer/isolators/cgroups/mem.cpp
@@ -130,20 +130,12 @@ Try<Isolator*> CgroupsMemIsolatorProcess::create(const Flags& flags)
Future<Nothing> CgroupsMemIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
hashset<string> cgroups;
- foreach (const state::RunState& state, states) {
- if (state.id.isNone()) {
- foreachvalue (Info* info, infos) {
- delete info;
- }
- infos.clear();
- return Failure("ContainerID is required to recover");
- }
-
- const ContainerID& containerId = state.id.get();
+ foreach (const ExecutorRunState& state, states) {
+ const ContainerID& containerId = state.id;
const string cgroup = path::join(flags.cgroups_root, containerId.value());
Try<bool> exists = cgroups::exists(hierarchy, cgroup);
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/cgroups/mem.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/mem.hpp b/src/slave/containerizer/isolators/cgroups/mem.hpp
index 4de5c64..c3793c4 100644
--- a/src/slave/containerizer/isolators/cgroups/mem.hpp
+++ b/src/slave/containerizer/isolators/cgroups/mem.hpp
@@ -38,7 +38,7 @@ public:
virtual ~CgroupsMemIsolatorProcess();
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/cgroups/perf_event.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/perf_event.cpp b/src/slave/containerizer/isolators/cgroups/perf_event.cpp
index f94eeae..331a10b 100644
--- a/src/slave/containerizer/isolators/cgroups/perf_event.cpp
+++ b/src/slave/containerizer/isolators/cgroups/perf_event.cpp
@@ -137,20 +137,12 @@ void CgroupsPerfEventIsolatorProcess::initialize()
Future<Nothing> CgroupsPerfEventIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
hashset<string> cgroups;
- foreach (const state::RunState& state, states) {
- if (state.id.isNone()) {
- foreachvalue (Info* info, infos) {
- delete info;
- }
- infos.clear();
- return Failure("ContainerID is required to recover");
- }
-
- const ContainerID& containerId = state.id.get();
+ foreach (const ExecutorRunState& state, states) {
+ const ContainerID& containerId = state.id;
const string cgroup = path::join(flags.cgroups_root, containerId.value());
Try<bool> exists = cgroups::exists(hierarchy, cgroup);
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/cgroups/perf_event.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/perf_event.hpp b/src/slave/containerizer/isolators/cgroups/perf_event.hpp
index 6bf8858..a546697 100644
--- a/src/slave/containerizer/isolators/cgroups/perf_event.hpp
+++ b/src/slave/containerizer/isolators/cgroups/perf_event.hpp
@@ -42,7 +42,7 @@ public:
virtual ~CgroupsPerfEventIsolatorProcess();
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/filesystem/shared.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/filesystem/shared.cpp b/src/slave/containerizer/isolators/filesystem/shared.cpp
index 85a5ade..cfd1e96 100644
--- a/src/slave/containerizer/isolators/filesystem/shared.cpp
+++ b/src/slave/containerizer/isolators/filesystem/shared.cpp
@@ -57,7 +57,7 @@ Try<Isolator*> SharedFilesystemIsolatorProcess::create(const Flags& flags)
Future<Nothing> SharedFilesystemIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
// There is nothing to recover because we do not keep any state and
// do not monitor filesystem usage or perform any action on cleanup.
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/filesystem/shared.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/filesystem/shared.hpp b/src/slave/containerizer/isolators/filesystem/shared.hpp
index a5b5ca1..27c7a65 100644
--- a/src/slave/containerizer/isolators/filesystem/shared.hpp
+++ b/src/slave/containerizer/isolators/filesystem/shared.hpp
@@ -39,7 +39,7 @@ public:
virtual ~SharedFilesystemIsolatorProcess();
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/namespaces/pid.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/namespaces/pid.cpp b/src/slave/containerizer/isolators/namespaces/pid.cpp
index 0ad102d..ae52404 100644
--- a/src/slave/containerizer/isolators/namespaces/pid.cpp
+++ b/src/slave/containerizer/isolators/namespaces/pid.cpp
@@ -118,17 +118,12 @@ Result<ino_t> NamespacesPidIsolatorProcess::getNamespace(
Future<Nothing> NamespacesPidIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
hashset<ContainerID> containers;
- foreach (const state::RunState& state, states)
- {
- if (!state.id.isSome()) {
- return Failure("ContainerID required to recover");
- }
-
- containers.insert(state.id.get());
+ foreach (const ExecutorRunState& state, states) {
+ containers.insert(state.id);
}
// Clean up any orphaned bind mounts and empty files.
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/namespaces/pid.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/namespaces/pid.hpp b/src/slave/containerizer/isolators/namespaces/pid.hpp
index 7052a03..21674ce 100644
--- a/src/slave/containerizer/isolators/namespaces/pid.hpp
+++ b/src/slave/containerizer/isolators/namespaces/pid.hpp
@@ -56,7 +56,7 @@ public:
virtual ~NamespacesPidIsolatorProcess() {}
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/network/port_mapping.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/network/port_mapping.cpp b/src/slave/containerizer/isolators/network/port_mapping.cpp
index 361e33b..b860b17 100644
--- a/src/slave/containerizer/isolators/network/port_mapping.cpp
+++ b/src/slave/containerizer/isolators/network/port_mapping.cpp
@@ -1314,7 +1314,7 @@ Try<Isolator*> PortMappingIsolatorProcess::create(const Flags& flags)
Future<Nothing> PortMappingIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
// Extract pids from virtual device names.
Try<set<string> > links = net::links();
@@ -1337,23 +1337,9 @@ Future<Nothing> PortMappingIsolatorProcess::recover(
pids.insert(pid.get());
}
- foreach (const state::RunState& state, states) {
- if (!state.id.isSome()) {
- foreachvalue (Info* info, infos) {
- delete info;
- }
- infos.clear();
- unmanaged.clear();
-
- return Failure("ContainerID and pid are required to recover");
- }
-
- // Containerizer is not supposed to let the isolator recover a run
- // with a forked pid.
- CHECK_SOME(state.forkedPid);
-
- const ContainerID& containerId = state.id.get();
- pid_t pid = state.forkedPid.get();
+ foreach (const ExecutorRunState& state, states) {
+ const ContainerID& containerId = state.id;
+ pid_t pid = state.pid;
VLOG(1) << "Recovering network isolator for container "
<< containerId << " with pid " << pid;
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/network/port_mapping.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/network/port_mapping.hpp b/src/slave/containerizer/isolators/network/port_mapping.hpp
index 1e4ed3d..a74bd65 100644
--- a/src/slave/containerizer/isolators/network/port_mapping.hpp
+++ b/src/slave/containerizer/isolators/network/port_mapping.hpp
@@ -129,7 +129,7 @@ public:
virtual ~PortMappingIsolatorProcess() {}
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/posix.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/posix.hpp b/src/slave/containerizer/isolators/posix.hpp
index b6d289b..0d59384 100644
--- a/src/slave/containerizer/isolators/posix.hpp
+++ b/src/slave/containerizer/isolators/posix.hpp
@@ -41,28 +41,20 @@ class PosixIsolatorProcess : public IsolatorProcess
{
public:
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& state)
+ const std::list<ExecutorRunState>& state)
{
- foreach (const state::RunState& run, state) {
- if (!run.id.isSome()) {
- return process::Failure("ContainerID is required to recover");
- }
-
- if (!run.forkedPid.isSome()) {
- return process::Failure("Executor pid is required to recover");
- }
-
+ foreach (const ExecutorRunState& run, state) {
// This should (almost) never occur: see comment in
// PosixLauncher::recover().
- if (pids.contains(run.id.get())) {
+ if (pids.contains(run.id)) {
return process::Failure("Container already recovered");
}
- pids.put(run.id.get(), run.forkedPid.get());
+ pids.put(run.id, run.pid);
process::Owned<process::Promise<Limitation> > promise(
new process::Promise<Limitation>());
- promises.put(run.id.get(), promise);
+ promises.put(run.id, promise);
}
return Nothing();
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/posix/disk.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/posix/disk.cpp b/src/slave/containerizer/isolators/posix/disk.cpp
index b2be552..ee53063 100644
--- a/src/slave/containerizer/isolators/posix/disk.cpp
+++ b/src/slave/containerizer/isolators/posix/disk.cpp
@@ -76,25 +76,15 @@ PosixDiskIsolatorProcess::~PosixDiskIsolatorProcess() {}
Future<Nothing> PosixDiskIsolatorProcess::recover(
- const list<state::RunState>& states)
+ const list<ExecutorRunState>& states)
{
- foreach (const state::RunState& state, states) {
- if (state.id.isNone()) {
- infos.clear();
-
- return Failure("ContainerID is required for recovery");
- }
-
- if (state.completed) {
- continue;
- }
-
+ foreach (const ExecutorRunState& state, states) {
// Since we checkpoint the executor after we create its working
// directory, the working directory should definitely exist.
CHECK(os::exists(state.directory))
<< "Executor work directory " << state.directory << " doesn't exist";
- infos.put(state.id.get(), Owned<Info>(new Info(state.directory)));
+ infos.put(state.id, Owned<Info>(new Info(state.directory)));
}
return Nothing();
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/isolators/posix/disk.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/posix/disk.hpp b/src/slave/containerizer/isolators/posix/disk.hpp
index 58a06c7..4760d06 100644
--- a/src/slave/containerizer/isolators/posix/disk.hpp
+++ b/src/slave/containerizer/isolators/posix/disk.hpp
@@ -76,7 +76,7 @@ public:
virtual ~PosixDiskIsolatorProcess();
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual process::Future<Option<CommandInfo>> prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/launcher.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/launcher.cpp b/src/slave/containerizer/launcher.cpp
index f2267ad..f413a51 100644
--- a/src/slave/containerizer/launcher.cpp
+++ b/src/slave/containerizer/launcher.cpp
@@ -16,6 +16,8 @@
* limitations under the License.
*/
+#include <mesos/type_utils.hpp>
+
#include <process/collect.hpp>
#include <process/delay.hpp>
#include <process/process.hpp>
@@ -37,8 +39,6 @@ using std::vector;
namespace mesos {
namespace slave {
-using state::RunState;
-
Try<Launcher*> PosixLauncher::create(const Flags& flags)
{
@@ -46,20 +46,11 @@ Try<Launcher*> PosixLauncher::create(const Flags& flags)
}
-Future<Nothing> PosixLauncher::recover(const list<RunState>& states)
+Future<Nothing> PosixLauncher::recover(const list<ExecutorRunState>& states)
{
- foreach (const RunState& state, states) {
- if (state.id.isNone()) {
- return Failure("ContainerID is required to recover");
- }
-
- const ContainerID& containerId = state.id.get();
-
- if (state.forkedPid.isNone()) {
- return Failure("Executor pid is required to recover container " +
- stringify(containerId));
- }
- pid_t pid = state.forkedPid.get();
+ foreach (const ExecutorRunState& state, states) {
+ const ContainerID& containerId = state.id;
+ pid_t pid = state.pid;
if (pids.containsValue(pid)) {
// This should (almost) never occur. There is the possibility
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/launcher.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/launcher.hpp b/src/slave/containerizer/launcher.hpp
index b6fab38..75ade8b 100644
--- a/src/slave/containerizer/launcher.hpp
+++ b/src/slave/containerizer/launcher.hpp
@@ -32,7 +32,8 @@
#include <stout/try.hpp>
#include "slave/flags.hpp"
-#include "slave/state.hpp"
+
+#include "slave/containerizer/isolator.hpp"
namespace mesos {
namespace slave {
@@ -44,7 +45,7 @@ public:
// Recover the necessary state for each container listed in state.
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states) = 0;
+ const std::list<ExecutorRunState>& states) = 0;
// Fork a new process in the containerized context. The child will
// exec the binary at the given path with the given argv, flags and
@@ -81,7 +82,7 @@ public:
virtual ~PosixLauncher() {}
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual Try<pid_t> fork(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/linux_launcher.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/linux_launcher.cpp b/src/slave/containerizer/linux_launcher.cpp
index 8417160..3fdfb57 100644
--- a/src/slave/containerizer/linux_launcher.cpp
+++ b/src/slave/containerizer/linux_launcher.cpp
@@ -50,8 +50,6 @@ using std::vector;
namespace mesos {
namespace slave {
-using state::RunState;
-
LinuxLauncher::LinuxLauncher(
const Flags& _flags,
int _namespaces,
@@ -124,21 +122,14 @@ Future<Nothing> _recover(const Future<list<Nothing> >& futures)
}
-Future<Nothing> LinuxLauncher::recover(const std::list<state::RunState>& states)
+Future<Nothing> LinuxLauncher::recover(
+ const std::list<ExecutorRunState>& states)
{
hashset<string> cgroups;
- foreach (const RunState& state, states) {
- if (state.id.isNone()) {
- return Failure("ContainerID is required to recover");
- }
- const ContainerID& containerId = state.id.get();
-
- if (state.forkedPid.isNone()) {
- return Failure("Executor pid is required to recover container " +
- stringify(containerId));
- }
- pid_t pid = state.forkedPid.get();
+ foreach (const ExecutorRunState& state, states) {
+ const ContainerID& containerId = state.id;
+ pid_t pid = state.pid;
if (pids.containsValue(pid)) {
// This should (almost) never occur. There is the possibility
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/linux_launcher.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/linux_launcher.hpp b/src/slave/containerizer/linux_launcher.hpp
index 0d630fa..3730422 100644
--- a/src/slave/containerizer/linux_launcher.hpp
+++ b/src/slave/containerizer/linux_launcher.hpp
@@ -34,7 +34,7 @@ public:
virtual ~LinuxLauncher() {}
virtual process::Future<Nothing> recover(
- const std::list<state::RunState>& states);
+ const std::list<ExecutorRunState>& states);
virtual Try<pid_t> fork(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index fa40d47..e1b85b6 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -299,7 +299,7 @@ Future<Nothing> MesosContainerizerProcess::recover(
LOG(INFO) << "Recovering containerizer";
// Gather the executor run states that we will attempt to recover.
- list<RunState> recoverable;
+ list<ExecutorRunState> recoverable;
if (state.isSome()) {
foreachvalue (const FrameworkState& framework, state.get().frameworks) {
foreachvalue (const ExecutorState& executor, framework.executors) {
@@ -321,6 +321,7 @@ Future<Nothing> MesosContainerizerProcess::recover(
const ContainerID& containerId = executor.latest.get();
Option<RunState> run = executor.runs.get(containerId);
CHECK_SOME(run);
+ CHECK_SOME(run.get().id);
// We need the pid so the reaper can monitor the executor so skip this
// executor if it's not present. This is not an error because the slave
@@ -342,7 +343,12 @@ Future<Nothing> MesosContainerizerProcess::recover(
<< "' for executor '" << executor.id
<< "' of framework " << framework.id;
- recoverable.push_back(run.get());
+ ExecutorRunState executorRunState(
+ run.get().id.get(),
+ run.get().forkedPid.get(),
+ run.get().directory);
+
+ recoverable.push_back(executorRunState);
}
}
}
@@ -354,7 +360,7 @@ Future<Nothing> MesosContainerizerProcess::recover(
Future<Nothing> MesosContainerizerProcess::_recover(
- const list<RunState>& recoverable)
+ const list<ExecutorRunState>& recoverable)
{
// Then recover the isolators.
list<Future<Nothing>> futures;
@@ -369,16 +375,13 @@ Future<Nothing> MesosContainerizerProcess::_recover(
Future<Nothing> MesosContainerizerProcess::__recover(
- const list<RunState>& recovered)
+ const list<ExecutorRunState>& recovered)
{
- foreach (const RunState& run, recovered) {
- CHECK_SOME(run.id);
- CHECK_SOME(run.forkedPid);
-
- const ContainerID& containerId = run.id.get();
+ foreach (const ExecutorRunState& run, recovered) {
+ const ContainerID& containerId = run.id;
Container* container = new Container();
- Future<Option<int>> status = process::reap(run.forkedPid.get());
+ Future<Option<int>> status = process::reap(run.pid);
status.onAny(defer(self(), &Self::reaped, containerId));
container->status = status;
// We only checkpoint the containerizer pid after the container
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/slave/containerizer/mesos/containerizer.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.hpp b/src/slave/containerizer/mesos/containerizer.hpp
index b3aafe4..293c2d8 100644
--- a/src/slave/containerizer/mesos/containerizer.hpp
+++ b/src/slave/containerizer/mesos/containerizer.hpp
@@ -25,6 +25,8 @@
#include <stout/hashmap.hpp>
#include <stout/multihashmap.hpp>
+#include "slave/state.hpp"
+
#include "slave/containerizer/containerizer.hpp"
#include "slave/containerizer/isolator.hpp"
#include "slave/containerizer/launcher.hpp"
@@ -156,10 +158,10 @@ public:
private:
process::Future<Nothing> _recover(
- const std::list<state::RunState>& recoverable);
+ const std::list<ExecutorRunState>& recoverable);
process::Future<Nothing> __recover(
- const std::list<state::RunState>& recovered);
+ const std::list<ExecutorRunState>& recovered);
process::Future<std::list<Option<CommandInfo>>> prepare(
const ContainerID& containerId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/79a18e60/src/tests/isolator.hpp
----------------------------------------------------------------------
diff --git a/src/tests/isolator.hpp b/src/tests/isolator.hpp
index 7c40f3c..547b0bb 100644
--- a/src/tests/isolator.hpp
+++ b/src/tests/isolator.hpp
@@ -40,7 +40,7 @@ public:
MOCK_METHOD1(
recover,
- process::Future<Nothing>(const std::list<slave::state::RunState>&));
+ process::Future<Nothing>(const std::list<slave::ExecutorRunState>&));
virtual process::Future<Option<CommandInfo> > prepare(
const ContainerID& containerId,