]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: bind front heartbeat messenger to public_addr
authorSage Weil <sage@inktank.com>
Wed, 22 May 2013 00:10:01 +0000 (17:10 -0700)
committerSage Weil <sage@inktank.com>
Wed, 22 May 2013 23:13:37 +0000 (16:13 -0700)
Signed-off-by: Sage Weil <sage@inktank.com>
src/ceph_osd.cc
src/osd/OSD.cc

index ea29896db57429def6fe71af2bd4568cb8a4057f..17d7239d0a54b99d79b68390a30a563bcb98560b 100644 (file)
@@ -392,17 +392,24 @@ int main(int argc, const char **argv)
   if (r < 0)
     exit(1);
 
-  // hb should bind to same ip as cluster_addr (if specified)
-  entity_addr_t hb_addr = g_conf->osd_heartbeat_addr;
-  if (hb_addr.is_blank_ip()) {
-    hb_addr = g_conf->cluster_addr;
-    if (hb_addr.is_ip())
-      hb_addr.set_port(0);
+  // hb back should bind to same ip as cluster_addr (if specified)
+  entity_addr_t hb_back_addr = g_conf->osd_heartbeat_addr;
+  if (hb_back_addr.is_blank_ip()) {
+    hb_back_addr = g_conf->cluster_addr;
+    if (hb_back_addr.is_ip())
+      hb_back_addr.set_port(0);
   }
-  r = messenger_hb_back_server->bind(hb_addr);
+  r = messenger_hb_back_server->bind(hb_back_addr);
   if (r < 0)
     exit(1);
 
+  // hb front should bind to same ip as public_addr
+  entity_addr_t hb_front_addr = g_conf->public_addr;
+  if (hb_front_addr.is_ip())
+    hb_front_addr.set_port(0);
+  r = messenger_hb_front_server->bind(hb_front_addr);
+  if (r < 0)
+    exit(1);
 
   // Set up crypto, daemonize, etc.
   global_init_daemonize(g_ceph_context, 0);
index ab93a800f64580fde2025ba1db931d9a8b2ff54b..b5a3a5ea309b2b69218ce51263964442c425a47e 100644 (file)
@@ -3035,9 +3035,17 @@ void OSD::_send_boot()
     hb_back_addr = cluster_addr;
     hb_back_addr.set_port(port);
     hb_back_server_messenger->set_addr_unknowns(hb_back_addr);
-    dout(10) << " assuming hb_addr ip matches cluster_addr" << dendl;
+    dout(10) << " assuming hb_back_addr ip matches cluster_addr" << dendl;
   }
-  entity_addr_t hb_front_addr;
+  entity_addr_t hb_front_addr = hb_front_server_messenger->get_myaddr();
+  if (hb_front_addr.is_blank_ip()) {
+    int port = hb_front_addr.get_port();
+    hb_front_addr = client_messenger->get_myaddr();
+    hb_front_addr.set_port(port);
+    hb_front_server_messenger->set_addr_unknowns(hb_front_addr);
+    dout(10) << " assuming hb_front_addr ip matches client_addr" << dendl;
+  }
+
   MOSDBoot *mboot = new MOSDBoot(superblock, boot_epoch, hb_back_addr, hb_front_addr, cluster_addr);
   dout(10) << " client_addr " << client_messenger->get_myaddr()
           << ", cluster_addr " << cluster_addr
@@ -4423,7 +4431,8 @@ void OSD::handle_osd_map(MOSDMap *m)
     } else if (!osdmap->is_up(whoami) ||
               !osdmap->get_addr(whoami).probably_equals(client_messenger->get_myaddr()) ||
               !osdmap->get_cluster_addr(whoami).probably_equals(cluster_messenger->get_myaddr()) ||
-              !osdmap->get_hb_back_addr(whoami).probably_equals(hb_back_server_messenger->get_myaddr())) {
+              !osdmap->get_hb_back_addr(whoami).probably_equals(hb_back_server_messenger->get_myaddr()) ||
+              !osdmap->get_hb_front_addr(whoami).probably_equals(hb_front_server_messenger->get_myaddr())) {
       if (!osdmap->is_up(whoami)) {
        if (service.is_preparing_to_stop()) {
          service.got_stop_ack();
@@ -4444,6 +4453,10 @@ void OSD::handle_osd_map(MOSDMap *m)
        clog.error() << "map e" << osdmap->get_epoch()
                    << " had wrong hb back addr (" << osdmap->get_hb_back_addr(whoami)
                     << " != my " << hb_back_server_messenger->get_myaddr() << ")";
+      else if (!osdmap->get_hb_front_addr(whoami).probably_equals(hb_front_server_messenger->get_myaddr()))
+       clog.error() << "map e" << osdmap->get_epoch()
+                   << " had wrong hb front addr (" << osdmap->get_hb_front_addr(whoami)
+                    << " != my " << hb_front_server_messenger->get_myaddr() << ")";
       
       if (!service.is_stopping()) {
        state = STATE_BOOTING;
@@ -4462,6 +4475,10 @@ void OSD::handle_osd_map(MOSDMap *m)
        if (r != 0)
          do_shutdown = true;  // FIXME: do_restart?
 
+       r = hb_front_server_messenger->rebind(hbport);
+       if (r != 0)
+         do_shutdown = true;  // FIXME: do_restart?
+
        hbclient_messenger->mark_down_all();
 
        reset_heartbeat_peers();