This is an automated email from the ASF dual-hosted git repository.

asekretenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git

commit 095a409913506b0f12772c9a1ee380a67417b083
Author: Andrei Sekretenko <[email protected]>
AuthorDate: Thu Sep 17 19:23:19 2020 +0200

    Enforced explicit construction of `protobuf::...::Capabilities`.
    
    This makes Mesos code more compliant with the Google C++ styleguide's
    rule banning implicit conversions for non-interchangeable types,
    for which the Mesos styleguide makes no exception.
    
    In particular, not enabling a type conversion from an iterable into
    `Capabilities` disallows puzzling code that looks like copying the same
    protobuf twice. Now, an example like
    ```
    framework.info = info;
    framework.capabilities = info.capabilities();`
    ```
    can no longer occur.
    
    Review: https://reviews.apache.org/r/72886
---
 src/common/protobuf_utils.hpp               | 6 +++---
 src/master/allocator/mesos/hierarchical.cpp | 4 +++-
 src/master/master.cpp                       | 2 +-
 src/slave/slave.cpp                         | 3 ++-
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp
index 0558249..e6ece8d 100644
--- a/src/common/protobuf_utils.hpp
+++ b/src/common/protobuf_utils.hpp
@@ -334,7 +334,7 @@ struct Capabilities
   Capabilities() = default;
 
   template <typename Iterable>
-  Capabilities(const Iterable& capabilities)
+  explicit Capabilities(const Iterable& capabilities)
   {
     foreach (const SlaveInfo::Capability& capability, capabilities) {
       switch (capability.type()) {
@@ -550,7 +550,7 @@ struct Capabilities
   Capabilities() = default;
 
   template <typename Iterable>
-  Capabilities(const Iterable& capabilities)
+  explicit Capabilities(const Iterable& capabilities)
   {
     foreach (const MasterInfo::Capability& capability, capabilities) {
       switch (capability.type()) {
@@ -633,7 +633,7 @@ struct Capabilities
   Capabilities() = default;
 
   template <typename Iterable>
-  Capabilities(const Iterable& capabilities)
+  explicit Capabilities(const Iterable& capabilities)
   {
     foreach (const FrameworkInfo::Capability& capability, capabilities) {
       switch (capability.type()) {
diff --git a/src/master/allocator/mesos/hierarchical.cpp 
b/src/master/allocator/mesos/hierarchical.cpp
index d8ebc2c..0b9588d 100644
--- a/src/master/allocator/mesos/hierarchical.cpp
+++ b/src/master/allocator/mesos/hierarchical.cpp
@@ -933,7 +933,9 @@ void HierarchicalAllocatorProcess::updateFramework(
 
   framework.info = frameworkInfo;
   framework.roles = newRoles;
-  framework.capabilities = frameworkInfo.capabilities();
+  framework.capabilities =
+    protobuf::framework::Capabilities(frameworkInfo.capabilities());
+
   framework.minAllocatableResources =
     unpackFrameworkOfferFilters(frameworkInfo.offer_filters());
 
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 54b24b4..599d2c9 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -12989,7 +12989,7 @@ Try<Nothing> Slave::update(
   }
 
   version = _version;
-  capabilities = _capabilities;
+  capabilities = protobuf::slave::Capabilities(_capabilities);
   info = _info;
   checkpointedResources = _checkpointedResources;
 
diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp
index a69937b..c715951 100644
--- a/src/slave/slave.cpp
+++ b/src/slave/slave.cpp
@@ -4461,7 +4461,8 @@ void Slave::updateFramework(
       // if from a master older than 1.3.
       if (message.has_framework_info()) {
         framework->info.CopyFrom(message.framework_info());
-        framework->capabilities = message.framework_info().capabilities();
+        framework->capabilities = protobuf::framework::Capabilities(
+            message.framework_info().capabilities());
       }
 
       if (pid == UPID()) {

Reply via email to