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.