]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common: make pick_address() aware about public_bind_addr
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Sun, 18 Dec 2022 22:43:28 +0000 (22:43 +0000)
committerRadosław Zarzyński <rzarzyns@redhat.com>
Mon, 20 Feb 2023 12:28:49 +0000 (13:28 +0100)
Fixes: https://tracker.ceph.com/issues/58779
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
(cherry picked from commit a235be23685964a4832167fb5504a49697ec058d)

src/common/pick_address.cc
src/common/pick_address.h

index 0ab19292582b5d8701e3e458d6220d5782a66e0e..b1a36e0729128024c13b83adc2b4fe862c168c9e 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "common/pick_address.h"
 
+#include <bitset>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <string>
@@ -354,10 +355,13 @@ int pick_addresses(
   addrs->v.clear();
 
   unsigned addrt = (flags & (CEPH_PICK_ADDRESS_PUBLIC |
+                            CEPH_PICK_ADDRESS_PUBLIC_BIND |
                             CEPH_PICK_ADDRESS_CLUSTER));
-  if (addrt == 0 ||
-      addrt == (CEPH_PICK_ADDRESS_PUBLIC |
-               CEPH_PICK_ADDRESS_CLUSTER)) {
+  // TODO: move to std::popcount when it's available for all release lines
+  // we are interested in (quincy was a blocker at the time of writing)
+  if (std::bitset<sizeof(addrt)*CHAR_BIT>(addrt).count() != 1) {
+    // these flags are mutually exclusive and one of them must be
+    // always set (in other words: it's mode selection).
     return -EINVAL;
   }
   unsigned msgrv = flags & (CEPH_PICK_ADDRESS_MSGR1 |
@@ -400,6 +404,13 @@ int pick_addresses(
     networks = cct->_conf.get_val<std::string>("public_network");
     interfaces =
       cct->_conf.get_val<std::string>("public_network_interface");
+  } else if (addrt & CEPH_PICK_ADDRESS_PUBLIC_BIND) {
+    addr = cct->_conf.get_val<entity_addr_t>("public_bind_addr");
+    // XXX: we don't support _network nor _network_interface for
+    // the public_bind addrs yet.
+    if (addr.is_blank_ip()) {
+      return -ENOENT;
+    }
   } else {
     addr = cct->_conf.get_val<entity_addr_t>("cluster_addr");
     networks = cct->_conf.get_val<std::string>("cluster_network");
index 1faf60dbd75bcf65f183311df305d7f2cbcc377e..4fd77e546f1081051e808dcf80adf3dedced9cc7 100644 (file)
@@ -20,6 +20,7 @@ class entity_addrvec_t;
 #define CEPH_PICK_ADDRESS_IPV6        0x20
 #define CEPH_PICK_ADDRESS_PREFER_IPV4 0x40
 #define CEPH_PICK_ADDRESS_DEFAULT_MON_PORTS  0x80
+#define CEPH_PICK_ADDRESS_PUBLIC_BIND 0x100
 
 #ifndef WITH_SEASTAR
 /*