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 5e01feb96874c0f7327ada82c39165900610c1b4 Author: Andrei Budnik <[email protected]> AuthorDate: Thu Jul 18 09:10:44 2019 -0700 Added `LauncherTracker` for tracking calls of launcher methods. This patch adds a new `LauncherTracker` class that proxies calls to the real `Launcher` and keeps track of returned futures by employing `PendingFutureTracker` class. Review: https://reviews.apache.org/r/70890/ --- src/CMakeLists.txt | 1 + src/Makefile.am | 2 + src/slave/containerizer/mesos/launcher_tracker.cpp | 109 +++++++++++++++++++++ src/slave/containerizer/mesos/launcher_tracker.hpp | 63 ++++++++++++ 4 files changed, 175 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c4d32df..99402cb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -173,6 +173,7 @@ set(AGENT_SRC slave/containerizer/mesos/isolator_tracker.cpp slave/containerizer/mesos/launch.cpp slave/containerizer/mesos/launcher.cpp + slave/containerizer/mesos/launcher_tracker.cpp slave/containerizer/mesos/mount.cpp slave/containerizer/mesos/paths.cpp slave/containerizer/mesos/io/switchboard.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 395b9f7..80ae6c0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1254,6 +1254,8 @@ libmesos_no_3rdparty_la_SOURCES += \ slave/containerizer/mesos/launch.hpp \ slave/containerizer/mesos/launcher.cpp \ slave/containerizer/mesos/launcher.hpp \ + slave/containerizer/mesos/launcher_tracker.cpp \ + slave/containerizer/mesos/launcher_tracker.hpp \ slave/containerizer/mesos/mount.cpp \ slave/containerizer/mesos/mount.hpp \ slave/containerizer/mesos/paths.cpp \ diff --git a/src/slave/containerizer/mesos/launcher_tracker.cpp b/src/slave/containerizer/mesos/launcher_tracker.cpp new file mode 100644 index 0000000..4434e57 --- /dev/null +++ b/src/slave/containerizer/mesos/launcher_tracker.cpp @@ -0,0 +1,109 @@ +// 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 <process/async.hpp> + +#include "common/future_tracker.hpp" + +#include "slave/constants.hpp" + +#include "slave/containerizer/mesos/launcher_tracker.hpp" + +using std::map; +using std::string; +using std::vector; + +using process::Future; +using process::Promise; + +namespace mesos { +namespace internal { +namespace slave { + +LauncherTracker::LauncherTracker( + const process::Owned<Launcher>& _launcher, PendingFutureTracker* _tracker) + : launcher(_launcher), tracker(_tracker) +{} + + +Future<hashset<ContainerID>> LauncherTracker::recover( + const vector<mesos::slave::ContainerState>& states) +{ + return tracker->track( + launcher->recover(states), + "launcher::recover", + COMPONENT_NAME_CONTAINERIZER); +} + + +Try<pid_t> LauncherTracker::fork( + const ContainerID& containerId, + const string& path, + const vector<string>& argv, + const mesos::slave::ContainerIO& containerIO, + const flags::FlagsBase* flags, + const Option<map<string, string>>& environment, + const Option<int>& enterNamespaces, + const Option<int>& cloneNamespaces, + const vector<int_fd>& whitelistFds) +{ + Promise<Try<pid_t>> promise; + + tracker->track( + promise.future(), + "launcher::fork", + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}, + {"path", path}}); + + Try<pid_t> forked = launcher->fork( + containerId, + path, + argv, + containerIO, + flags, + environment, + enterNamespaces, + cloneNamespaces, + whitelistFds); + + promise.set(forked); + return forked; +} + + +Future<Nothing> LauncherTracker::destroy(const ContainerID& containerId) +{ + return tracker->track( + launcher->destroy(containerId), + "launcher::destroy", + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}}); +} + + +Future<ContainerStatus> LauncherTracker::status(const ContainerID& containerId) +{ + return tracker->track( + launcher->status(containerId), + "launcher::status", + COMPONENT_NAME_CONTAINERIZER, + {{"containerId", stringify(containerId)}}); +} + +} // namespace slave { +} // namespace internal { +} // namespace mesos { diff --git a/src/slave/containerizer/mesos/launcher_tracker.hpp b/src/slave/containerizer/mesos/launcher_tracker.hpp new file mode 100644 index 0000000..999f6be --- /dev/null +++ b/src/slave/containerizer/mesos/launcher_tracker.hpp @@ -0,0 +1,63 @@ +// 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 __LAUNCHER_TRACKER_HPP__ +#define __LAUNCHER_TRACKER_HPP__ + +#include <process/owned.hpp> + +#include "slave/containerizer/mesos/launcher.hpp" + +namespace mesos { +namespace internal { +namespace slave { + +class LauncherTracker : public Launcher +{ +public: + LauncherTracker( + const process::Owned<Launcher>& _launcher, + PendingFutureTracker* _tracker); + + process::Future<hashset<ContainerID>> recover( + const std::vector<mesos::slave::ContainerState>& states) override; + + Try<pid_t> fork( + const ContainerID& containerId, + const std::string& path, + const std::vector<std::string>& argv, + const mesos::slave::ContainerIO& containerIO, + const flags::FlagsBase* flags, + const Option<std::map<std::string, std::string>>& environment, + const Option<int>& enterNamespaces, + const Option<int>& cloneNamespaces, + const std::vector<int_fd>& whitelistFds) override; + + process::Future<Nothing> destroy(const ContainerID& containerId) override; + + process::Future<ContainerStatus> status( + const ContainerID& containerId) override; + +private: + process::Owned<Launcher> launcher; + PendingFutureTracker* tracker; +}; + +} // namespace slave { +} // namespace internal { +} // namespace mesos { + +#endif // __LAUNCHER_TRACKER_HPP__
