Rev 345: keep sending ARPs for 2 minutes, every 5 seconds in http://samba.org/~tridge/ctdb

tridge at samba.org tridge at samba.org
Fri May 25 11:27:26 GMT 2007


------------------------------------------------------------
revno: 345
revision-id: tridge at samba.org-20070525112726-m22jkf53zf4xkfpc
parent: tridge at samba.org-20070525100006-gpdqevfym61pqwm6
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Fri 2007-05-25 21:27:26 +1000
message:
  keep sending ARPs for 2 minutes, every 5 seconds
modified:
  include/ctdb_private.h         ctdb_private.h-20061117234101-o3qt14umlg9en8z0-13
  takeover/ctdb_takeover.c       ctdb_takeover.c-20070525071636-a5n1ihghjtppy08r-2
=== modified file 'include/ctdb_private.h'
--- a/include/ctdb_private.h	2007-05-25 10:00:06 +0000
+++ b/include/ctdb_private.h	2007-05-25 11:27:26 +0000
@@ -250,6 +250,7 @@
 struct ctdb_takeover {
 	bool enabled;
 	const char *interface;
+	TALLOC_CTX *last_ctx;
 };
 
 

=== modified file 'takeover/ctdb_takeover.c'
--- a/takeover/ctdb_takeover.c	2007-05-25 07:16:50 +0000
+++ b/takeover/ctdb_takeover.c	2007-05-25 11:27:26 +0000
@@ -29,6 +29,43 @@
 
 #define TAKEOVER_TIMEOUT() timeval_current_ofs(5,0)
 
+#define CTDB_ARP_INTERVAL 5
+#define CTDB_ARP_REPEAT  24
+
+struct ctdb_takeover_arp {
+	struct ctdb_context *ctdb;
+	uint32_t count;
+	struct sockaddr_in sin;
+};
+
+
+/*
+  send a gratuitous arp
+ */
+static void ctdb_control_send_arp(struct event_context *ev, struct timed_event *te, 
+				  struct timeval t, void *private_data)
+{
+	struct ctdb_takeover_arp *arp = talloc_get_type(private_data, 
+							struct ctdb_takeover_arp);
+	int ret;
+
+	ret = ctdb_sys_send_arp(&arp->sin, arp->ctdb->takeover.interface);
+	if (ret != 0) {
+		DEBUG(0,(__location__ "sending of arp failed (%s)\n", strerror(errno)));
+	}
+
+	arp->count++;
+
+	if (arp->count == CTDB_ARP_REPEAT) {
+		talloc_free(arp);
+		return;
+	}
+	
+	event_add_timed(arp->ctdb->ev, arp->ctdb->takeover.last_ctx, 
+			timeval_current_ofs(CTDB_ARP_INTERVAL, 0), 
+			ctdb_control_send_arp, arp);
+}
+
 /*
   take over an ip address
  */
@@ -37,6 +74,7 @@
 	int ret;
 	struct sockaddr_in *sin = (struct sockaddr_in *)indata.dptr;
 	char *cmdstr;
+	struct ctdb_takeover_arp *arp;
 
 	cmdstr = talloc_asprintf(ctdb, "ip addr add %s/32 dev %s 2> /dev/null",
 				 inet_ntoa(sin->sin_addr), ctdb->takeover.interface);
@@ -46,11 +84,20 @@
 	system(cmdstr);
 	talloc_free(cmdstr);
 
-	ret = ctdb_sys_send_arp(sin, ctdb->takeover.interface);
-	if (ret != 0) {
-		DEBUG(0,(__location__ "sending of arp failed (%s)\n", strerror(errno)));
+	if (!ctdb->takeover.last_ctx) {
+		ctdb->takeover.last_ctx = talloc_new(ctdb);
+		CTDB_NO_MEMORY(ctdb, ctdb->takeover.last_ctx);
 	}
 
+	arp = talloc_zero(ctdb->takeover.last_ctx, struct ctdb_takeover_arp);
+	CTDB_NO_MEMORY(ctdb, arp);
+	
+	arp->ctdb = ctdb;
+	arp->sin = *sin;
+
+	event_add_timed(arp->ctdb->ev, arp->ctdb->takeover.last_ctx, 
+			timeval_zero(), ctdb_control_send_arp, arp);
+
 	return ret;
 }
 
@@ -62,6 +109,10 @@
 	struct sockaddr_in *sin = (struct sockaddr_in *)indata.dptr;
 	char *cmdstr;
 
+	/* stop any previous arps */
+	talloc_free(ctdb->takeover.last_ctx);
+	ctdb->takeover.last_ctx = NULL;
+
 	cmdstr = talloc_asprintf(ctdb, "ip addr del %s/32 dev %s 2> /dev/null",
 				 inet_ntoa(sin->sin_addr), ctdb->takeover.interface);
 		



More information about the samba-cvs mailing list