This is an automated email from the ASF dual-hosted git repository. gilbert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 5112ab806ca0fdcdbf8a8fa55e87dbf7437e0f9d Author: Andrei Budnik <[email protected]> AuthorDate: Thu Jul 18 09:10:40 2019 -0700 Added `IsolatorTracker` for tracking calls of isolator methods. This patch adds a new `IsolatorTracker` class that proxies calls to the real isolator and keeps track of returned futures by employing `PendingFutureTracker` class. Review: https://reviews.apache.org/r/70888/ --- src/CMakeLists.txt | 1 + src/Makefile.am | 2 + src/slave/constants.hpp | 3 + src/slave/containerizer/mesos/isolator_tracker.cpp | 152 +++++++++++++++++++++ src/slave/containerizer/mesos/isolator_tracker.hpp | 79 +++++++++++ 5 files changed, 237 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6d14090..c4d32df 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -170,6 +170,7 @@ set(AGENT_SRC slave/containerizer/fetcher.cpp slave/containerizer/mesos/containerizer.cpp slave/containerizer/mesos/isolator.cpp + slave/containerizer/mesos/isolator_tracker.cpp slave/containerizer/mesos/launch.cpp slave/containerizer/mesos/launcher.cpp slave/containerizer/mesos/mount.cpp diff --git a/src/Makefile.am b/src/Makefile.am index ecdced4..395b9f7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1225,6 +1225,8 @@ libmesos_no_3rdparty_la_SOURCES += \ slave/containerizer/mesos/io/switchboard.hpp \ slave/containerizer/mesos/isolator.cpp \ slave/containerizer/mesos/isolator.hpp \ + slave/containerizer/mesos/isolator_tracker.cpp \ + slave/containerizer/mesos/isolator_tracker.hpp \ slave/containerizer/mesos/isolators/docker/volume/driver.cpp \ slave/containerizer/mesos/isolators/docker/volume/driver.hpp \ slave/containerizer/mesos/isolators/docker/volume/paths.cpp \ diff --git a/src/slave/constants.hpp b/src/slave/constants.hpp index cc81e51..721afe1 100644 --- a/src/slave/constants.hpp +++ b/src/slave/constants.hpp @@ -202,6 +202,9 @@ constexpr char MESOS_DEFAULT_EXECUTOR[] = "mesos-default-executor"; constexpr char MESOS_EXECUTOR[] = "mesos-executor"; #endif // __WINDOWS__ +// Name of the component used for describing pending futures. +constexpr char COMPONENT_NAME_CONTAINERIZER[] = "containerizer"; + // Virtual path on which agent logs are mounted in `/files/` endpoint. constexpr char AGENT_LOG_VIRTUAL_PATH[] = "/slave/log"; diff --git a/src/slave/containerizer/mesos/isolator_tracker.cpp b/src/slave/containerizer/mesos/isolator_tracker.cpp new file mode 100644 index 0000000..c78e883 --- /dev/null +++ b/src/slave/containerizer/mesos/isolator_tracker.cpp @@ -0,0 +1,152 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "common/future_tracker.hpp" + +#include "slave/constants.hpp" + +#include "slave/containerizer/mesos/isolator_tracker.hpp" + +using std::string; +using std::vector; + +using process::Future; +using process::Owned; + +using mesos::slave::ContainerConfig; +using mesos::slave::ContainerLaunchInfo; +using mesos::slave::ContainerLimitation; +using mesos::slave::ContainerState; + +namespace mesos { +namespace internal { +namespace slave { + +IsolatorTracker::IsolatorTracker( + const Owned<mesos::slave::Isolator>& _isolator, + const string& _isolatorName, + PendingFutureTracker* _tracker) + : isolator(_isolator), + isolatorName(_isolatorName), + tracker(_tracker) +{} + + +bool IsolatorTracker::supportsNesting() +{ + return isolator->supportsNesting(); +} + + +bool IsolatorTracker::supportsStandalone() +{ + return isolator->supportsStandalone(); +} + + +Future<Nothing> IsolatorTracker::recover( + const vector<ContainerState>& state, + const hashset<ContainerID>& orphans) +{ + return tracker->track( + isolator->recover(state, orphans), + strings::format("%s::recover", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER); +} + + +Future<Option<ContainerLaunchInfo>> IsolatorTracker::prepare( + const ContainerID& containerId, + const ContainerConfig& containerConfig) +{ + return tracker->track( + isolator->prepare(containerId, containerConfig), + strings::format("%s::prepare", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}}); +} + + +Future<Nothing> IsolatorTracker::isolate( + const ContainerID& containerId, + pid_t pid) +{ + return tracker->track( + isolator->isolate(containerId, pid), + strings::format("%s::isolate", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}, + {"pid", stringify(pid)}}); +} + + +Future<ContainerLimitation> IsolatorTracker::watch( + const ContainerID& containerId) +{ + // Do not track `watch` method, since it is supposed + // to be pending as long as the container is running. + return isolator->watch(containerId); +} + + +Future<Nothing> IsolatorTracker::update( + const ContainerID& containerId, + const Resources& resources) +{ + return tracker->track( + isolator->update(containerId, resources), + strings::format("%s::update", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}, + {"resources", stringify(resources)}}); +} + + +Future<ResourceStatistics> IsolatorTracker::usage( + const ContainerID& containerId) +{ + return tracker->track( + isolator->usage(containerId), + strings::format("%s::usage", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}}); +} + + +Future<ContainerStatus> IsolatorTracker::status( + const ContainerID& containerId) +{ + return tracker->track( + isolator->status(containerId), + strings::format("%s::status", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}}); +} + + +Future<Nothing> IsolatorTracker::cleanup( + const ContainerID& containerId) +{ + return tracker->track( + isolator->cleanup(containerId), + strings::format("%s::cleanup", isolatorName).get(), + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}}); +} + +} // namespace slave { +} // namespace internal { +} // namespace mesos { diff --git a/src/slave/containerizer/mesos/isolator_tracker.hpp b/src/slave/containerizer/mesos/isolator_tracker.hpp new file mode 100644 index 0000000..563db10 --- /dev/null +++ b/src/slave/containerizer/mesos/isolator_tracker.hpp @@ -0,0 +1,79 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef __ISOLATOR_TRACKER_HPP__ +#define __ISOLATOR_TRACKER_HPP__ + +#include <mesos/slave/isolator.hpp> + +#include <process/owned.hpp> +#include <process/process.hpp> + +namespace mesos { +namespace internal { +namespace slave { + +class IsolatorTracker : public mesos::slave::Isolator +{ +public: + IsolatorTracker( + const process::Owned<mesos::slave::Isolator>& _isolator, + const std::string& _isolatorName, + PendingFutureTracker* _tracker); + + bool supportsNesting() override; + bool supportsStandalone() override; + + process::Future<Nothing> recover( + const std::vector<mesos::slave::ContainerState>& states, + const hashset<ContainerID>& orphans) override; + + process::Future<Option<mesos::slave::ContainerLaunchInfo>> prepare( + const ContainerID& containerId, + const mesos::slave::ContainerConfig& containerConfig) override; + + process::Future<Nothing> isolate( + const ContainerID& containerId, + pid_t pid) override; + + process::Future<mesos::slave::ContainerLimitation> watch( + const ContainerID& containerId) override; + + process::Future<Nothing> update( + const ContainerID& containerId, + const Resources& resources) override; + + process::Future<ResourceStatistics> usage( + const ContainerID& containerId) override; + + process::Future<ContainerStatus> status( + const ContainerID& containerId) override; + + process::Future<Nothing> cleanup( + const ContainerID& containerId) override; + +private: + process::Owned<mesos::slave::Isolator> isolator; + std::string isolatorName; + PendingFutureTracker* tracker; +}; + +} // namespace slave { +} // namespace internal { +} // namespace mesos { + + +#endif // __ISOLATOR_TRACKER_HPP__
