X-Git-Url: http://git.sameswireless.fr/l2tpns.git/blobdiff_plain/7aa420ce9f2c55049b061c7df836ccc990303ebf..d78201b5d724fc1927b2eb803c65a5198356ea77:/cluster.c diff --git a/cluster.c b/cluster.c index 4c4efde..d9c619e 100644 --- a/cluster.c +++ b/cluster.c @@ -1,6 +1,6 @@ // L2TPNS Clustering Stuff -char const *cvs_id_cluster = "$Id: cluster.c,v 1.4 2004-06-28 02:43:13 fred_nerk Exp $"; +char const *cvs_id_cluster = "$Id: cluster.c,v 1.6 2004-07-05 06:54:01 bodea Exp $"; #include #include @@ -343,6 +343,7 @@ static void send_heartbeat(int seq, char * data, int size) if (size > sizeof(past_hearts[0].data)) { log(0,0,0,0, "Tried to heartbeat something larger than the maximum packet!\n"); kill(0, SIGTERM); + exit(1); } i = seq % HB_HISTORY_SIZE; past_hearts[i].seq = seq; @@ -437,6 +438,20 @@ void cluster_check_master(void) int last_free = 0; int had_peers = have_peers; clockt t = TIME; + static int probed = 0; + + // Is the master late? If so, try probing it... + if (TIME > (config->cluster_last_hb + config->cluster_hb_timeout/8 + 11)) { + if (!probed) { + if (config->cluster_master_address) { + peer_send_message(config->cluster_master_address, + C_LASTSEEN, config->cluster_seq_number, NULL, 0); + probed = 1; + } + } + } else { // We got a recent heartbeat; reset the probe flag. + probed = 0; + } if (TIME < (config->cluster_last_hb + config->cluster_hb_timeout) ) return; // Everything's ok. return. @@ -770,8 +785,8 @@ void cluster_heartbeat(int highsession, int freesession, int hightunnel) kill(0, SIGTERM); } - log(3,0,0,0, "Sending heartbeat with %d changes (%d x-sess, %d x-tunnels, %d highsess, %d hightun size %d)\n", - config->cluster_num_changes, count, tcount, config->cluster_highest_sessionid, + log(3,0,0,0, "Sending heartbeat #%d with %d changes (%d x-sess, %d x-tunnels, %d highsess, %d hightun size %d)\n", + h.seq, config->cluster_num_changes, count, tcount, config->cluster_highest_sessionid, config->cluster_highest_tunnelid, (p-buff)); config->cluster_num_changes = 0; @@ -1068,16 +1083,18 @@ static int cluster_process_heartbeat_v2(u8 * data, int size, int more, u8 * p, u log(0,0,0,0, "I just got a packet claiming to be from a master but _I_ am the master!\n"); if (!h->basetime) { - log(0,0,0,0, "Heartbeat from addr %s with zero basetime!\n", inet_toa(htonl(addr)) ); + log(0,0,0,0, "Heartbeat from addr %s with zero basetime!\n", inet_toa(addr) ); return -1; // Skip it. } if (basetime > h->basetime) { - log(0,0,0,0, "They're (%s) an older master than me so I'm gone!\n", inet_toa(htonl(addr))); + log(0,0,0,0, "They're (%s) an older master than me so I'm gone!\n", inet_toa(addr)); kill(0, SIGTERM); + exit(1); } if (basetime == h->basetime && my_address < addr) { // Tie breaker. log(0,0,0,0, "They're a higher IP address than me, so I'm gone!\n"); kill(0, SIGTERM); + exit(1); } return -1; // Skip it. }