You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gi...@apache.org on 2017/11/20 20:31:27 UTC

[4/5] mesos git commit: Added checkpoint and recover capability for layers in provisioner.

Added checkpoint and recover capability for layers in provisioner.

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


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

Branch: refs/heads/master
Commit: e273efe6976434858edb85bbcf367a02e963a467
Parents: 3aa7147
Author: Zhitao Li <zh...@gmail.com>
Authored: Fri Nov 17 16:36:29 2017 -0800
Committer: Gilbert Song <so...@gmail.com>
Committed: Mon Nov 20 12:29:39 2017 -0800

----------------------------------------------------------------------
 include/mesos/slave/containerizer.proto         | 10 +++++
 .../containerizer/mesos/provisioner/paths.cpp   | 10 +++++
 .../containerizer/mesos/provisioner/paths.hpp   | 11 +++++
 .../mesos/provisioner/provisioner.cpp           | 43 ++++++++++++++++++++
 .../mesos/provisioner/provisioner.hpp           |  4 ++
 5 files changed, 78 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/e273efe6/include/mesos/slave/containerizer.proto
----------------------------------------------------------------------
diff --git a/include/mesos/slave/containerizer.proto b/include/mesos/slave/containerizer.proto
index 689acfc..0f1e1da 100644
--- a/include/mesos/slave/containerizer.proto
+++ b/include/mesos/slave/containerizer.proto
@@ -255,3 +255,13 @@ message ContainerTermination {
   // multiple roles (e.g. `"mem(*):1;mem(role):2"`).
   repeated Resource limited_resources = 6;
 }
+
+
+/**
+ * Information about all layers used to provision a container. This is used
+ * to checkpoint and recover in provisioner.
+ */
+message ContainerLayers {
+  // Paths of all layers used to provision the container.
+  repeated string paths = 1;
+}

http://git-wip-us.apache.org/repos/asf/mesos/blob/e273efe6/src/slave/containerizer/mesos/provisioner/paths.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/paths.cpp b/src/slave/containerizer/mesos/provisioner/paths.cpp
index 268dbeb..80486c5 100644
--- a/src/slave/containerizer/mesos/provisioner/paths.cpp
+++ b/src/slave/containerizer/mesos/provisioner/paths.cpp
@@ -86,6 +86,16 @@ string getContainerDir(
 }
 
 
+string getLayersFilePath(
+    const string& provisionerDir,
+    const ContainerID& containerId)
+{
+  return path::join(
+      getContainerDir(provisionerDir, containerId),
+      LAYERS_FILE);
+}
+
+
 string getContainerRootfsDir(
     const string& provisionerDir,
     const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/e273efe6/src/slave/containerizer/mesos/provisioner/paths.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/paths.hpp b/src/slave/containerizer/mesos/provisioner/paths.hpp
index 466f5ed..07f5bcf 100644
--- a/src/slave/containerizer/mesos/provisioner/paths.hpp
+++ b/src/slave/containerizer/mesos/provisioner/paths.hpp
@@ -36,12 +36,14 @@ namespace paths {
 // |-- provisioner
 //     |-- containers
 //         |-- <container_id>
+//             |-- layers (paths to all layers to provision)
 //             |-- backends
 //                 |-- <backend> (copy, bind, etc.)
 //                     |-- rootfses
 //                         |-- <rootfs_id> (the rootfs)
 //             |-- containers (nested containers)
 //                 |-- <container_id>
+//                     |-- layers (paths to all layers to provision)
 //                     |-- backends
 //                         |-- <backend> (copy, bind, etc.)
 //                             |-- rootfses
@@ -52,11 +54,20 @@ namespace paths {
 // is a UUID.
 
 
+constexpr char LAYERS_FILE[] = "layers";
+
+
+// TODO(gilbert): rename this to `getContainerPath` for consistency.
 std::string getContainerDir(
     const std::string& provisionerDir,
     const ContainerID& containerId);
 
 
+std::string getLayersFilePath(
+    const std::string& provisionerDir,
+    const ContainerID& containerId);
+
+
 std::string getContainerRootfsDir(
     const std::string& provisionerDir,
     const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/e273efe6/src/slave/containerizer/mesos/provisioner/provisioner.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.cpp b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
index 450a3b3..1723588 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.cpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
@@ -41,6 +41,7 @@
 #endif
 
 #include "slave/paths.hpp"
+#include "slave/state.hpp"
 
 #include "slave/containerizer/mesos/provisioner/constants.hpp"
 #include "slave/containerizer/mesos/provisioner/backend.hpp"
@@ -61,6 +62,7 @@ using mesos::internal::slave::BIND_BACKEND;
 using mesos::internal::slave::COPY_BACKEND;
 using mesos::internal::slave::OVERLAY_BACKEND;
 
+using mesos::slave::ContainerLayers;
 using mesos::slave::ContainerState;
 
 namespace mesos {
@@ -366,6 +368,31 @@ Future<Nothing> ProvisionerProcess::recover(
       info->rootfses.put(backend, rootfses.get()[backend]);
     }
 
+    Result<ContainerLayers> layers = None();
+    const string path = provisioner::paths::getLayersFilePath(
+      rootDir, containerId);
+
+    if (!os::exists(path)) {
+      // This is possible if we recovered a container provisioned before we
+      // started to checkpoint `ContainerLayers`.
+      VLOG(1) << "Layers path '" << path << "' is missing for container' "
+              << containerId << "'";
+    } else {
+      layers = ::protobuf::read<ContainerLayers>(path);
+    }
+
+    if (layers.isError()) {
+      return Failure(
+          "Failed to recover layers for container '" + stringify(containerId) +
+          "': " + layers.error());
+    } else if (layers.isSome()) {
+      info->layers = vector<string>();
+      std::copy(
+        layers->paths().begin(),
+        layers->paths().end(),
+        std::back_inserter(info->layers.get()));
+    }
+
     infos.put(containerId, info);
 
     if (knownContainerIds.contains(containerId)) {
@@ -478,6 +505,22 @@ Future<ProvisionInfo> ProvisionerProcess::_provision(
       rootfs,
       backendDir)
     .then([=]() -> Future<ProvisionInfo> {
+      const string path =
+        provisioner::paths::getLayersFilePath(rootDir, containerId);
+
+      ContainerLayers containerLayers;
+
+      foreach(const string& layer, imageInfo.layers) {
+        containerLayers.add_paths(layer);
+      }
+
+      Try<Nothing> checkpoint = slave::state::checkpoint(path, containerLayers);
+      if (checkpoint.isError()) {
+        return Failure(
+            "Failed to checkpoint layers to '" + path + "': " +
+            checkpoint.error());
+      }
+
       return ProvisionInfo{
           rootfs, imageInfo.dockerManifest, imageInfo.appcManifest};
     });

http://git-wip-us.apache.org/repos/asf/mesos/blob/e273efe6/src/slave/containerizer/mesos/provisioner/provisioner.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.hpp b/src/slave/containerizer/mesos/provisioner/provisioner.hpp
index 7cba54c..b87144c 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.hpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.hpp
@@ -167,6 +167,10 @@ private:
     // Mappings: backend -> {rootfsId, ...}
     hashmap<std::string, hashset<std::string>> rootfses;
 
+    // TODO(zhitao): Remove Option after the deprecation cycle
+    // started in 1.5.
+    Option<std::vector<std::string>> layers;
+
     process::Promise<bool> termination;
 
     // The container status in provisioner.