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__

Reply via email to