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/08/22 20:46:39 UTC
[10/12] mesos git commit: Plugged in the volume/image isolator to
mesos containerizer.
Plugged in the volume/image isolator to mesos containerizer.
This patch includes:
1 Plugged in the volume/image isolator.
2 Changed MesosContainerizer interface. The parameter for
provisioner is changed from an owned pointer to a shared
pointer.
3 Fixed corresponding unit tests.
Review: https://reviews.apache.org/r/51173/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/9642d3c6
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/9642d3c6
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/9642d3c6
Branch: refs/heads/master
Commit: 9642d3c67b1215c7e3e9626d95cd0c4954fa9f7b
Parents: 192283f
Author: Gilbert Song <so...@gmail.com>
Authored: Mon Aug 22 13:00:39 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Mon Aug 22 13:37:08 2016 -0700
----------------------------------------------------------------------
src/slave/containerizer/mesos/containerizer.cpp | 44 +++++++++++++++-----
src/slave/containerizer/mesos/containerizer.hpp | 7 ++--
.../mesos/isolators/filesystem/linux.cpp | 9 +++-
src/tests/container_logger_tests.cpp | 2 +-
.../docker_volume_isolator_tests.cpp | 2 +-
.../containerizer/filesystem_isolator_tests.cpp | 26 +++++++++---
.../containerizer/mesos_containerizer_tests.cpp | 17 ++++----
7 files changed, 76 insertions(+), 31 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index 808fc83..e2af95d 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -109,6 +109,10 @@
#include "slave/containerizer/mesos/isolators/network/port_mapping.hpp"
#endif
+#ifdef __linux__
+#include "slave/containerizer/mesos/isolators/volume/image.hpp"
+#endif
+
#include "slave/containerizer/mesos/constants.hpp"
#include "slave/containerizer/mesos/containerizer.hpp"
#include "slave/containerizer/mesos/launch.hpp"
@@ -196,7 +200,18 @@ Try<MesosContainerizer*> MesosContainerizer::create(
if (!strings::contains(flags_.isolation, "network/")) {
flags_.isolation += ",network/cni";
}
-#endif
+
+ // Always enable 'volume/image' on linux if 'filesystem/linux' is
+ // enabled, to ensure backwards compatibility.
+ //
+ // TODO(gilbert): Make sure the 'gpu/nvidia' isolator to be created
+ // after all volume isolators, so that the nvidia gpu libraries
+ // '/usr/local/nvidia' will be overwritten.
+ if (strings::contains(flags_.isolation, "filesystem/linux") &&
+ !strings::contains(flags_.isolation, "volume/image")) {
+ flags_.isolation += ",volume/image";
+ }
+#endif // __linux__
LOG(INFO) << "Using isolation: " << flags_.isolation;
@@ -249,11 +264,13 @@ Try<MesosContainerizer*> MesosContainerizer::create(
return Error("Failed to create launcher: " + launcher.error());
}
- Try<Owned<Provisioner>> provisioner = Provisioner::create(flags_);
- if (provisioner.isError()) {
- return Error("Failed to create provisioner: " + provisioner.error());
+ Try<Owned<Provisioner>> _provisioner = Provisioner::create(flags_);
+ if (_provisioner.isError()) {
+ return Error("Failed to create provisioner: " + _provisioner.error());
}
+ Shared<Provisioner> provisioner = _provisioner.get().share();
+
// Create the isolators.
//
// Currently, the order of the entries in the --isolation flag
@@ -313,6 +330,11 @@ Try<MesosContainerizer*> MesosContainerizer::create(
{"docker/runtime", &DockerRuntimeIsolatorProcess::create},
{"docker/volume", &DockerVolumeIsolatorProcess::create},
+ {"volume/image",
+ [&provisioner] (const Flags& flags) -> Try<Isolator*> {
+ return VolumeImageIsolatorProcess::create(flags, provisioner);
+ }},
+
{"gpu/nvidia",
[&nvidia] (const Flags& flags) -> Try<Isolator*> {
if (!nvml::isAvailable()) {
@@ -335,12 +357,12 @@ Try<MesosContainerizer*> MesosContainerizer::create(
#endif
};
- const vector<string> isolations = strings::tokenize(flags_.isolation, ",");
+ vector<string> tokens = strings::tokenize(flags_.isolation, ",");
+ set<string> isolations = set<string>(tokens.begin(), tokens.end());
- if (isolations.size() !=
- set<string>(isolations.begin(), isolations.end()).size()) {
- return Error("Duplicate entries found in --isolation flag"
- " '" + stringify(isolations) + "'");
+ if (tokens.size() != isolations.size()) {
+ return Error("Duplicate entries found in --isolation flag '" +
+ stringify(tokens) + "'");
}
vector<Owned<Isolator>> isolators;
@@ -376,7 +398,7 @@ Try<MesosContainerizer*> MesosContainerizer::create(
fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher.get()),
- provisioner.get(),
+ provisioner,
isolators);
}
@@ -387,7 +409,7 @@ MesosContainerizer::MesosContainerizer(
Fetcher* fetcher,
const Owned<ContainerLogger>& logger,
const Owned<Launcher>& launcher,
- const Owned<Provisioner>& provisioner,
+ const Shared<Provisioner>& provisioner,
const vector<Owned<Isolator>>& isolators)
: process(new MesosContainerizerProcess(
flags,
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/slave/containerizer/mesos/containerizer.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.hpp b/src/slave/containerizer/mesos/containerizer.hpp
index 0cfe7b0..1f414cf 100644
--- a/src/slave/containerizer/mesos/containerizer.hpp
+++ b/src/slave/containerizer/mesos/containerizer.hpp
@@ -22,6 +22,7 @@
#include <process/id.hpp>
#include <process/sequence.hpp>
+#include <process/shared.hpp>
#include <process/metrics/counter.hpp>
@@ -63,7 +64,7 @@ public:
Fetcher* fetcher,
const process::Owned<mesos::slave::ContainerLogger>& logger,
const process::Owned<Launcher>& launcher,
- const process::Owned<Provisioner>& provisioner,
+ const process::Shared<Provisioner>& provisioner,
const std::vector<process::Owned<mesos::slave::Isolator>>& isolators);
// Used for testing.
@@ -122,7 +123,7 @@ public:
Fetcher* _fetcher,
const process::Owned<mesos::slave::ContainerLogger>& _logger,
const process::Owned<Launcher>& _launcher,
- const process::Owned<Provisioner>& _provisioner,
+ const process::Shared<Provisioner>& _provisioner,
const std::vector<process::Owned<mesos::slave::Isolator>>& _isolators)
: ProcessBase(process::ID::generate("mesos-containerizer")),
flags(_flags),
@@ -271,7 +272,7 @@ private:
Fetcher* fetcher;
process::Owned<mesos::slave::ContainerLogger> logger;
const process::Owned<Launcher> launcher;
- const process::Owned<Provisioner> provisioner;
+ const process::Shared<Provisioner> provisioner;
const std::vector<process::Owned<mesos::slave::Isolator>> isolators;
enum State
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
index 6bf9a4a..ea41825 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
@@ -369,8 +369,13 @@ Try<vector<CommandInfo>> LinuxFilesystemIsolatorProcess::getPreExecCommands(
// NOTE: Volumes with source will be handled by the corresponding
// isolators (e.g., docker/volume).
if (volume.has_source()) {
- VLOG(1) << "Ignored a volume with source for container '"
- << containerId << "'";
+ VLOG(1) << "Ignored a volume with source for container "
+ << containerId;
+ continue;
+ }
+
+ if (volume.has_image()) {
+ VLOG(1) << "Ignored an image volume for container " << containerId;
continue;
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/tests/container_logger_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/container_logger_tests.cpp b/src/tests/container_logger_tests.cpp
index efadcea..e8f9341 100644
--- a/src/tests/container_logger_tests.cpp
+++ b/src/tests/container_logger_tests.cpp
@@ -168,7 +168,7 @@ TEST_F(ContainerLoggerTest, MesosContainerizerRecover)
&fetcher,
Owned<ContainerLogger>(logger),
Owned<Launcher>(launcher.get()),
- provisioner.get(),
+ provisioner->share(),
vector<Owned<Isolator>>());
// Create the container's sandbox to get past a `CHECK` inside
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/tests/containerizer/docker_volume_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_volume_isolator_tests.cpp b/src/tests/containerizer/docker_volume_isolator_tests.cpp
index da96f86..236834e 100644
--- a/src/tests/containerizer/docker_volume_isolator_tests.cpp
+++ b/src/tests/containerizer/docker_volume_isolator_tests.cpp
@@ -200,7 +200,7 @@ protected:
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher.get()),
- provisioner.get(),
+ provisioner->share(),
{Owned<Isolator>(linuxIsolator.get()),
Owned<Isolator>(runtimeIsolator.get()),
Owned<Isolator>(volumeIsolator.get())}));
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/tests/containerizer/filesystem_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/filesystem_isolator_tests.cpp b/src/tests/containerizer/filesystem_isolator_tests.cpp
index 9f6b2ed..a2db8dd 100644
--- a/src/tests/containerizer/filesystem_isolator_tests.cpp
+++ b/src/tests/containerizer/filesystem_isolator_tests.cpp
@@ -41,6 +41,9 @@
#include "slave/containerizer/mesos/linux_launcher.hpp"
#include "slave/containerizer/mesos/isolators/filesystem/linux.hpp"
+
+#include "slave/containerizer/mesos/isolators/volume/image.hpp"
+
#include "slave/containerizer/mesos/provisioner/backend.hpp"
#include "slave/containerizer/mesos/provisioner/paths.hpp"
#include "slave/containerizer/mesos/provisioner/backends/copy.hpp"
@@ -73,6 +76,7 @@ using mesos::internal::slave::Provisioner;
using mesos::internal::slave::ProvisionerProcess;
using mesos::internal::slave::Slave;
using mesos::internal::slave::Store;
+using mesos::internal::slave::VolumeImageIsolatorProcess;
using mesos::master::detector::MasterDetector;
@@ -145,14 +149,25 @@ protected:
stores,
backends));
- Owned<Provisioner> provisioner(new Provisioner(provisionerProcess));
+ Owned<Provisioner> _provisioner(new Provisioner(provisionerProcess));
+ Shared<Provisioner> provisioner = _provisioner.share();
- Try<Isolator*> isolator = LinuxFilesystemIsolatorProcess::create(flags);
+ Try<Isolator*> linuxIsolator =
+ LinuxFilesystemIsolatorProcess::create(flags);
- if (isolator.isError()) {
+ if (linuxIsolator.isError()) {
return Error(
"Failed to create LinuxFilesystemIsolatorProcess: " +
- isolator.error());
+ linuxIsolator.error());
+ }
+
+ Try<Isolator*> imageIsolator =
+ VolumeImageIsolatorProcess::create(flags, provisioner);
+
+ if (imageIsolator.isError()) {
+ return Error(
+ "Failed to create VolumeImageIsolatorProcess: " +
+ imageIsolator.error());
}
Try<Launcher*> launcher = LinuxLauncher::create(flags);
@@ -177,7 +192,8 @@ protected:
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher.get()),
provisioner,
- {Owned<Isolator>(isolator.get())}));
+ {Owned<Isolator>(linuxIsolator.get()),
+ Owned<Isolator>(imageIsolator.get())}));
}
ContainerInfo createContainerInfo(
http://git-wip-us.apache.org/repos/asf/mesos/blob/9642d3c6/src/tests/containerizer/mesos_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/mesos_containerizer_tests.cpp b/src/tests/containerizer/mesos_containerizer_tests.cpp
index 2fd4ec5..c0dda11 100644
--- a/src/tests/containerizer/mesos_containerizer_tests.cpp
+++ b/src/tests/containerizer/mesos_containerizer_tests.cpp
@@ -28,6 +28,7 @@
#include <process/future.hpp>
#include <process/owned.hpp>
+#include <process/shared.hpp>
#include <stout/net.hpp>
#include <stout/strings.hpp>
@@ -170,7 +171,7 @@ public:
fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher.get()),
- provisioner.get(),
+ provisioner->share(),
isolators));
}
@@ -509,7 +510,7 @@ public:
Fetcher* fetcher,
const Owned<ContainerLogger>& logger,
const Owned<Launcher>& launcher,
- const Owned<Provisioner>& provisioner,
+ const Shared<Provisioner>& provisioner,
const vector<Owned<Isolator>>& isolators)
: MesosContainerizerProcess(
flags,
@@ -630,7 +631,7 @@ TEST_F(MesosContainerizerDestroyTest, DestroyWhileFetching)
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher.get()),
- provisioner.get(),
+ provisioner->share(),
vector<Owned<Isolator>>());
Future<Nothing> exec;
@@ -705,7 +706,7 @@ TEST_F(MesosContainerizerDestroyTest, DestroyWhilePreparing)
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher.get()),
- provisioner.get(),
+ provisioner->share(),
{Owned<Isolator>(isolator)});
MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));
@@ -810,7 +811,7 @@ TEST_F(MesosContainerizerProvisionerTest, ProvisionFailed)
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher),
- Owned<Provisioner>(provisioner),
+ Shared<Provisioner>(provisioner),
vector<Owned<Isolator>>());
MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));
@@ -906,7 +907,7 @@ TEST_F(MesosContainerizerProvisionerTest, DestroyWhileProvisioning)
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher),
- Owned<Provisioner>(provisioner),
+ Shared<Provisioner>(provisioner),
vector<Owned<Isolator>>());
MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));
@@ -1009,7 +1010,7 @@ TEST_F(MesosContainerizerProvisionerTest, IsolatorCleanupBeforePrepare)
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher),
- Owned<Provisioner>(provisioner),
+ Shared<Provisioner>(provisioner),
{Owned<Isolator>(isolator)});
MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));
@@ -1107,7 +1108,7 @@ TEST_F(MesosContainerizerDestroyTest, LauncherDestroyFailure)
&fetcher,
Owned<ContainerLogger>(logger.get()),
Owned<Launcher>(launcher),
- provisioner.get(),
+ provisioner->share(),
vector<Owned<Isolator>>());
MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));