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,