This is an automated email from the ASF dual-hosted git repository.

gilbert pushed a commit to branch 1.5.x
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit 597bc1930fad66bccd0daddf9fecfefa310fc11f
Author: Gilbert Song <[email protected]>
AuthorDate: Mon Apr 15 21:47:10 2019 -0700

    Supported docker manifest v2s2 config with image GC.
    
    After the docker manifest v2 schema2 support, the manifest config
    is saved as a layer in image store. However, the config file
    cannot survive if the image GC is triggered.
    
    This patch supports checkpointing the config path in provisioner,
    so that the provisioner has the information of configs so that
    they will not be deleted during GC.
    
    (cherry picked from commit cd75916020080232a27df4597f9de4dc2dc961d9)
---
 .../mesos/provisioner/docker/metadata_manager.cpp            |  4 ++++
 src/slave/containerizer/mesos/provisioner/docker/store.cpp   |  4 ++++
 src/slave/containerizer/mesos/provisioner/provisioner.cpp    | 12 ++++++++++++
 3 files changed, 20 insertions(+)

diff --git 
a/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp 
b/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp
index 417c13f..22e4171 100644
--- a/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp
+++ b/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp
@@ -201,6 +201,10 @@ Future<hashset<string>> MetadataManagerProcess::prune(
     foreach (const string& layerId, image->layer_ids()) {
       retainedLayers.insert(layerId);
     }
+
+    if (image->has_config_digest()) {
+      retainedLayers.insert(image->config_digest());
+    }
   }
 
   storedImages = std::move(retainedImages);
diff --git a/src/slave/containerizer/mesos/provisioner/docker/store.cpp 
b/src/slave/containerizer/mesos/provisioner/docker/store.cpp
index 8071409..166d7fa 100644
--- a/src/slave/containerizer/mesos/provisioner/docker/store.cpp
+++ b/src/slave/containerizer/mesos/provisioner/docker/store.cpp
@@ -406,6 +406,10 @@ Future<ImageInfo> StoreProcess::__get(
         v1.error());
   }
 
+  if (image.has_config_digest()) {
+    return ImageInfo{layerPaths, v1.get(), None(), configPath};
+  }
+
   return ImageInfo{layerPaths, v1.get()};
 }
 
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.cpp 
b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
index 6280144..c08c5c4 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.cpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
@@ -442,6 +442,10 @@ Future<Nothing> ProvisionerProcess::recover(
             layers->paths().begin(),
             layers->paths().end(),
             std::back_inserter(info->layers.get()));
+
+        if (layers->has_config()) {
+          info->layers->push_back(layers->config());
+        }
       }
     }
 
@@ -556,6 +560,10 @@ Future<ProvisionInfo> ProvisionerProcess::_provision(
   infos[containerId]->rootfses[backend].insert(rootfsId);
   infos[containerId]->layers = imageInfo.layers;
 
+  if (imageInfo.config.isSome()) {
+    infos[containerId]->layers->push_back(imageInfo.config.get());
+  }
+
   string backendDir = provisioner::paths::getBackendDir(
       rootDir,
       containerId,
@@ -575,6 +583,10 @@ Future<ProvisionInfo> ProvisionerProcess::_provision(
         containerLayers.add_paths(layer);
       }
 
+      if (imageInfo.config.isSome()) {
+        containerLayers.set_config(imageInfo.config.get());
+      }
+
       Try<Nothing> checkpoint = slave::state::checkpoint(path, 
containerLayers);
       if (checkpoint.isError()) {
         return Failure(

Reply via email to