]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/msg_types.h: add pick_addr()
authorKefu Chai <kchai@redhat.com>
Tue, 28 Jul 2020 12:29:29 +0000 (20:29 +0800)
committerKefu Chai <kchai@redhat.com>
Tue, 28 Jul 2020 12:46:47 +0000 (20:46 +0800)
for picking an addr from an entity_addrvec_t by given protocol type.
so:
  - v2 => v2, any
  - v1 => v1, any
  - any => any, v1, v2

and add a helper of `addr_of_type()` to avoid repeatings.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/msg/msg_types.h

index 837474ec2397bfce9b3901f1a3fec2ea77097160..207481a5095b007f033017a4383e02a21d57625c 100644 (file)
@@ -570,12 +570,7 @@ struct entity_addrvec_t {
   bool empty() const { return v.empty(); }
 
   entity_addr_t legacy_addr() const {
-    for (auto& a : v) {
-      if (a.type == entity_addr_t::TYPE_LEGACY) {
-       return a;
-      }
-    }
-    return entity_addr_t();
+    return addr_of_type(entity_addr_t::TYPE_LEGACY);
   }
   entity_addr_t as_legacy_addr() const {
     for (auto& a : v) {
@@ -605,22 +600,14 @@ struct entity_addrvec_t {
        return a;
       }
     }
-    if (!v.empty()) {
-      return v.front();
-    }
-    return entity_addr_t();
+    return front();
   }
   std::string get_legacy_str() const {
     return legacy_or_front_addr().get_legacy_str();
   }
 
   entity_addr_t msgr2_addr() const {
-    for (auto &a : v) {
-      if (a.type == entity_addr_t::TYPE_MSGR2) {
-        return a;
-      }
-    }
-    return entity_addr_t();
+    return addr_of_type(entity_addr_t::TYPE_MSGR2);
   }
   bool has_msgr2() const {
     for (auto& a : v) {
@@ -631,6 +618,35 @@ struct entity_addrvec_t {
     return false;
   }
 
+  entity_addr_t pick_addr(uint32_t type) const {
+    entity_addr_t picked_addr;
+    switch (type) {
+    case entity_addr_t::TYPE_LEGACY:
+      [[fallthrough]];
+    case entity_addr_t::TYPE_MSGR2:
+      picked_addr = addr_of_type(type);
+      break;
+    case entity_addr_t::TYPE_ANY:
+      return front();
+    default:
+      return {};
+    }
+    if (!picked_addr.is_blank_ip()) {
+      return picked_addr;
+    } else {
+      return addr_of_type(entity_addr_t::TYPE_ANY);
+    }
+  }
+
+  entity_addr_t addr_of_type(uint32_t type) const {
+    for (auto &a : v) {
+      if (a.type == type) {
+        return a;
+      }
+    }
+    return entity_addr_t();
+  }
+
   bool parse(const char *s, const char **end = 0);
 
   void get_ports(std::set<int> *ports) const {