From cc4d8102cd52f66036ed448e8b21e32f8d3fa7d8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 26 May 2007 14:01:08 +1000 Subject: [PATCH] moved system specific ip code to system.c (This used to be ctdb commit 9de9e4ccda9665108baac12a8716b189d26340b1) --- ctdb/common/ctdb_recoverd.c | 5 +++-- ctdb/include/ctdb_private.h | 2 ++ ctdb/takeover/ctdb_takeover.c | 33 +++++++++++++++++---------------- ctdb/takeover/system.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/ctdb/common/ctdb_recoverd.c b/ctdb/common/ctdb_recoverd.c index 05dc649a33a..cd68a9ce00c 100644 --- a/ctdb/common/ctdb_recoverd.c +++ b/ctdb/common/ctdb_recoverd.c @@ -666,9 +666,10 @@ static void force_election(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, uint3 return; } - /* wait for one second to collect all responses */ + /* wait for a few seconds to collect all responses */ timed_out = 0; - event_add_timed(ctdb->ev, mem_ctx, CONTROL_TIMEOUT(), timeout_func, ctdb); + event_add_timed(ctdb->ev, mem_ctx, timeval_current_ofs(3, 0), + timeout_func, ctdb); while (!timed_out) { event_loop_once(ctdb->ev); } diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 291ac5fac10..418e4751ee0 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -894,6 +894,8 @@ int ctdb_ctrl_release_ip(struct ctdb_context *ctdb, struct timeval timeout, /* from takeover/system.c */ int ctdb_sys_send_arp(const struct sockaddr_in *saddr, const char *iface); +int ctdb_sys_take_ip(const char *ip, const char *interface); +int ctdb_sys_release_ip(const char *ip, const char *interface); int ctdb_set_public_addresses(struct ctdb_context *ctdb, const char *alist); diff --git a/ctdb/takeover/ctdb_takeover.c b/ctdb/takeover/ctdb_takeover.c index e288cd9c617..63b5ed7dab6 100644 --- a/ctdb/takeover/ctdb_takeover.c +++ b/ctdb/takeover/ctdb_takeover.c @@ -73,16 +73,16 @@ int32_t ctdb_control_takeover_ip(struct ctdb_context *ctdb, TDB_DATA indata) { int ret; struct sockaddr_in *sin = (struct sockaddr_in *)indata.dptr; - char *cmdstr; struct ctdb_takeover_arp *arp; + char *ip = inet_ntoa(sin->sin_addr); - cmdstr = talloc_asprintf(ctdb, "ip addr add %s/32 dev %s 2> /dev/null", - inet_ntoa(sin->sin_addr), ctdb->takeover.interface); - CTDB_NO_MEMORY(ctdb, cmdstr); - - DEBUG(0,("Taking over IP : %s\n", cmdstr)); - system(cmdstr); - talloc_free(cmdstr); + DEBUG(0,("Takover of IP %s on interface %s\n", ip, ctdb->takeover.interface)); + ret = ctdb_sys_take_ip(ip, ctdb->takeover.interface); + if (ret != 0) { + DEBUG(0,(__location__ " Failed to takeover IP %s on interface %s\n", + ip, ctdb->takeover.interface)); + return -1; + } if (!ctdb->takeover.last_ctx) { ctdb->takeover.last_ctx = talloc_new(ctdb); @@ -107,21 +107,22 @@ int32_t ctdb_control_takeover_ip(struct ctdb_context *ctdb, TDB_DATA indata) int32_t ctdb_control_release_ip(struct ctdb_context *ctdb, TDB_DATA indata) { struct sockaddr_in *sin = (struct sockaddr_in *)indata.dptr; - char *cmdstr; TDB_DATA data; char *ip = inet_ntoa(sin->sin_addr); + int ret; + + DEBUG(0,("Release of IP %s on interface %s\n", ip, ctdb->takeover.interface)); /* 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", - ip, ctdb->takeover.interface); - - DEBUG(0,("Releasing IP : %s\n", cmdstr)); - system(cmdstr); - - talloc_free(cmdstr); + ret = ctdb_sys_release_ip(ip, ctdb->takeover.interface); + if (ret != 0) { + DEBUG(0,(__location__ " Failed to release IP %s on interface %s\n", + ip, ctdb->takeover.interface)); + return -1; + } /* send a message to all clients of this node telling them that the cluster has been reconfigured and they should diff --git a/ctdb/takeover/system.c b/ctdb/takeover/system.c index 1d808b4c028..8dcb4740c7e 100644 --- a/ctdb/takeover/system.c +++ b/ctdb/takeover/system.c @@ -126,3 +126,35 @@ int ctdb_sys_send_arp(const struct sockaddr_in *saddr, const char *iface) close(s); return 0; } + +/* + takeover an IP on an interface + */ +int ctdb_sys_take_ip(const char *ip, const char *interface) +{ + char *cmdstr; + cmdstr = talloc_asprintf(NULL, "/sbin/ip addr add %s/32 dev %s 2> /dev/null", + ip, interface); + if (cmdstr == NULL) { + return -1; + } + system(cmdstr); + talloc_free(cmdstr); + return 0; +} + +/* + release an IP on an interface + */ +int ctdb_sys_release_ip(const char *ip, const char *interface) +{ + char *cmdstr; + cmdstr = talloc_asprintf(NULL, "/sbin/ip addr del %s/32 dev %s 2> /dev/null", + ip, interface); + if (cmdstr == NULL) { + return -1; + } + system(cmdstr); + talloc_free(cmdstr); + return 0; +} -- 2.47.3