Repository: mesos Updated Branches: refs/heads/master 8ff66b1c2 -> 2e3f614bd
Cleaned up docker metadata manager. Review: https://reviews.apache.org/r/41263 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/1390d226 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/1390d226 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/1390d226 Branch: refs/heads/master Commit: 1390d226dc1b012ffb1b49d22e1e504eb5723d85 Parents: 8ff66b1 Author: Gilbert Song <[email protected]> Authored: Fri Dec 11 12:17:43 2015 -0800 Committer: Jie Yu <[email protected]> Committed: Fri Dec 11 12:17:43 2015 -0800 ---------------------------------------------------------------------- .../provisioner/docker/metadata_manager.cpp | 41 ++++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/1390d226/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp b/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp index f1005a7..bf85038 100644 --- a/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp +++ b/src/slave/containerizer/mesos/provisioner/docker/metadata_manager.cpp @@ -14,8 +14,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "slave/containerizer/mesos/provisioner/docker/metadata_manager.hpp" - +#include <string> #include <vector> #include <glog/logging.h> @@ -31,10 +30,11 @@ #include "common/status_utils.hpp" +#include "slave/state.hpp" + #include "slave/containerizer/mesos/provisioner/docker/paths.hpp" #include "slave/containerizer/mesos/provisioner/docker/message.hpp" - -#include "slave/state.hpp" +#include "slave/containerizer/mesos/provisioner/docker/metadata_manager.hpp" using namespace process; @@ -58,7 +58,7 @@ public: Future<Image> put( const Image::Name& name, - const std::vector<std::string>& layerIds); + const vector<string>& layerIds); Future<Option<Image>> get(const Image::Name& name); @@ -71,9 +71,9 @@ private: const Flags flags; // This is a lookup table for images that are stored in memory. It is keyed - // by the name of the Image. + // by image name. // For example, "ubuntu:14.04" -> ubuntu14:04 Image. - hashmap<std::string, Image> storedImages; + hashmap<string, Image> storedImages; }; @@ -88,20 +88,20 @@ Try<Owned<MetadataManager>> MetadataManager::create(const Flags& flags) MetadataManager::MetadataManager(Owned<MetadataManagerProcess> process) : process(process) { - process::spawn(CHECK_NOTNULL(process.get())); + spawn(CHECK_NOTNULL(process.get())); } MetadataManager::~MetadataManager() { - process::terminate(process.get()); - process::wait(process.get()); + terminate(process.get()); + wait(process.get()); } Future<Nothing> MetadataManager::recover() { - return process::dispatch(process.get(), &MetadataManagerProcess::recover); + return dispatch(process.get(), &MetadataManagerProcess::recover); } @@ -189,13 +189,20 @@ Future<Nothing> MetadataManagerProcess::recover() Result<Images> images = ::protobuf::read<Images>(storedImagesPath); if (images.isError()) { - return Failure("Failed to read protobuf for Docker provisioner image: " + + return Failure("Failed to read images from '" + storedImagesPath + "' " + images.error()); } - foreach (const Image image, images.get().images()) { + if (images.isNone()) { + // This could happen if the slave died after opening the file for + // writing but before persisted on disk. + return Failure("Unexpected empty images file '" + storedImagesPath + "'"); + } + + foreach (const Image& image, images.get().images()) { vector<string> missingLayerIds; - foreach (const string layerId, image.layer_ids()) { + + foreach (const string& layerId, image.layer_ids()) { const string rootfsPath = paths::getImageLayerRootfsPath(flags.docker_store_dir, layerId); @@ -204,13 +211,13 @@ Future<Nothing> MetadataManagerProcess::recover() } } + const string imageName = stringify(image.name()); + if (!missingLayerIds.empty()) { - LOG(WARNING) << "Skipped loading image '" << stringify(image.name()) - << "' due to missing layers: " << stringify(missingLayerIds); + LOG(WARNING) << "Skipped loading image '" << imageName << "'"; continue; } - const string imageName = stringify(image.name()); if (storedImages.contains(imageName)) { LOG(WARNING) << "Found duplicate image in recovery for image name '" << imageName << "'";
