provide more comments/defaults in etc/startup-config.default
[l2tpns.git] / cluster.c
index 9049079..59ae023 100644 (file)
--- a/cluster.c
+++ b/cluster.c
@@ -1,6 +1,6 @@
 // L2TPNS Clustering Stuff
 
-char const *cvs_id_cluster = "$Id: cluster.c,v 1.40 2005/06/02 11:32:30 bodea Exp $";
+char const *cvs_id_cluster = "$Id: cluster.c,v 1.43 2005/06/27 04:52:54 bodea Exp $";
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -38,7 +38,7 @@ char const *cvs_id_cluster = "$Id: cluster.c,v 1.40 2005/06/02 11:32:30 bodea Ex
  */
 
 // Module variables.
-int cluster_sockfd = 0;                        // The filedescriptor for the cluster communications port.
+extern int cluster_sockfd;             // The filedescriptor for the cluster communications port.
 
 in_addr_t my_address = 0;              // The network address of my ethernet port.
 static int walk_session_number = 0;    // The next session to send when doing the slow table walk.
@@ -533,6 +533,7 @@ void cluster_check_master(void)
                return; // Everything's ok!
 
        config->cluster_last_hb = TIME + 1;     // Just the one election thanks.
+       config->cluster_master_address = 0;
 
        LOG(0, 0, 0, "Master timed out! Holding election...\n");
 
@@ -568,7 +569,6 @@ void cluster_check_master(void)
                // to become a master!!!
 
        config->cluster_iam_master = 1;
-       config->cluster_master_address = 0;
 
        LOG(0, 0, 0, "I am declaring myself the master!\n");
 
@@ -1022,7 +1022,6 @@ static int cluster_add_peer(in_addr_t peer, time_t basetime, pingt *pp, int size
                config->cluster_master_address = 0;
                config->cluster_last_hb = 0; // Force an election.
                cluster_check_master();
-               return 0;
        }
 
        if (i >= num_peers)
@@ -1069,6 +1068,16 @@ static int cluster_set_master(in_addr_t peer, in_addr_t master)
                fmtaddr(master, 1));
 
        config->cluster_master_address = master;
+       if (master)
+       {
+               // catchup with new master
+               peer_send_message(master, C_LASTSEEN, config->cluster_seq_number, NULL, 0);
+
+               // delay next election
+               config->cluster_last_hb = TIME;
+       }
+
+       // run election (or reset "probed" if master was set)
        cluster_check_master();
        return 0;
 }
@@ -1368,8 +1377,7 @@ static int cluster_process_heartbeat(uint8_t *data, int size, int more, uint8_t
                // Note that after a clean failover, the cluster_master_address
                // is cleared, so this doesn't run. 
                //
-       if (config->cluster_master_address && addr != config->cluster_master_address
-           && (config->cluster_last_hb + config->cluster_hb_timeout - 11) > TIME) {
+       if (config->cluster_master_address && addr != config->cluster_master_address) {
                    LOG(0, 0, 0, "Ignoring stray heartbeat from %s, current master %s has not yet timed out (last heartbeat %.1f seconds ago).\n",
                            fmtaddr(addr, 0), fmtaddr(config->cluster_master_address, 1),
                            0.1 * (TIME - config->cluster_last_hb));