You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/04/24 20:04:08 UTC
mesos git commit: Implemented cleanup() for docker volume isolator.
Repository: mesos
Updated Branches:
refs/heads/master e8e65535c -> 3add364e1
Implemented cleanup() for docker volume isolator.
Review: https://reviews.apache.org/r/45375
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/3add364e
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/3add364e
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/3add364e
Branch: refs/heads/master
Commit: 3add364e10ea6dac116bc8102b37f0de9db8bf99
Parents: e8e6553
Author: Guangya Liu <gy...@gmail.com>
Authored: Sun Apr 24 11:03:36 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Sun Apr 24 11:03:36 2016 -0700
----------------------------------------------------------------------
.../mesos/isolators/docker/volume/isolator.cpp | 79 ++++++++++++++++++++
.../mesos/isolators/docker/volume/isolator.hpp | 4 +
2 files changed, 83 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/3add364e/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
index 7c147cf..c33cef3 100644
--- a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
+++ b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
@@ -346,6 +346,85 @@ Future<ResourceStatistics> DockerVolumeIsolatorProcess::usage(
Future<Nothing> DockerVolumeIsolatorProcess::cleanup(
const ContainerID& containerId)
{
+ if (!infos.contains(containerId)) {
+ VLOG(1) << "Ignoring cleanup request for unknown container '"
+ << containerId << "'";
+
+ return Nothing();
+ }
+
+ hashmap<DockerVolume, int> references;
+ foreachvalue (const Owned<Info>& info, infos) {
+ foreach (const DockerVolume& volume, info->volumes) {
+ if (!references.contains(volume)) {
+ references[volume] = 1;
+ } else {
+ references[volume]++;
+ }
+ }
+ }
+
+ list<Future<Nothing>> futures;
+
+ foreach (const DockerVolume& volume, infos[containerId]->volumes) {
+ if (references.contains(volume) && references[volume] > 1) {
+ VLOG(1) << "Cannot unmount the volume with driver '"
+ << volume.driver() << "' and name '" << volume.name()
+ << "' for container " << containerId
+ << " since its reference count is " << references[volume];
+ continue;
+ }
+
+ VLOG(1) << "Unmounting the volume with driver '"
+ << volume.driver() << "' and name '" << volume.name()
+ << "' for container " << containerId;
+
+ // Invoke dvdcli client to unmount the docker volume.
+ futures.push_back(client->unmount(volume.driver(), volume.name()));
+ }
+
+ return await(futures)
+ .then(defer(
+ PID<DockerVolumeIsolatorProcess>(this),
+ &DockerVolumeIsolatorProcess::_cleanup,
+ containerId,
+ lambda::_1));
+}
+
+
+Future<Nothing> DockerVolumeIsolatorProcess::_cleanup(
+ const ContainerID& containerId,
+ const list<Future<Nothing>>& futures)
+{
+ CHECK(infos.contains(containerId));
+
+ vector<string> messages;
+ foreach (const Future<Nothing>& future, futures) {
+ if (!future.isReady()) {
+ messages.push_back(future.isFailed() ? future.failure() : "discarded");
+ }
+ }
+
+ if (!messages.empty()) {
+ return Failure(strings::join("\n", messages));
+ }
+
+ const string containerDir =
+ paths::getContainerDir(rootDir, containerId.value());
+
+ Try<Nothing> rmdir = os::rmdir(containerDir);
+ if (rmdir.isError()) {
+ return Failure(
+ "Failed to remove the checkpoint directory at '" +
+ containerDir + "': " + rmdir.error());
+ }
+
+ LOG(INFO) << "Removed the checkpoint directory at '" << containerDir
+ << "' for container " << containerId;
+
+ // Remove all this container's docker volume information from infos.
+ infos.erase(containerId);
+
return Nothing();
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/3add364e/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
index 02e1cff..8fb6c38 100644
--- a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
+++ b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
@@ -88,6 +88,10 @@ private:
const std::vector<std::string>& targets,
const std::list<process::Future<std::string>>& futures);
+ process::Future<Nothing> _cleanup(
+ const ContainerID& containerId,
+ const std::list<process::Future<Nothing>>& futures);
+
const Flags flags;
const std::string rootDir;
const process::Owned<docker::volume::DriverClient> client;