4 Copyright (C) Ronnie Sahlberg 2007
5 Copyright (C) Andrew Tridgell 2007
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #include "lib/events/events.h"
22 #include "lib/tdb/include/tdb.h"
23 #include "lib/util/dlinklist.h"
24 #include "system/network.h"
25 #include "system/filesys.h"
26 #include "system/wait.h"
27 #include "../include/ctdb_private.h"
28 #include "../common/rb_tree.h"
31 #define TAKEOVER_TIMEOUT() timeval_current_ofs(ctdb->tunable.takeover_timeout,0)
33 #define CTDB_ARP_INTERVAL 1
34 #define CTDB_ARP_REPEAT 3
37 struct ctdb_iface *prev, *next;
43 static const char *ctdb_vnn_iface_string(const struct ctdb_vnn *vnn)
46 return vnn->iface->name;
52 static int ctdb_add_local_iface(struct ctdb_context *ctdb, const char *iface)
56 /* Verify that we dont have an entry for this ip yet */
57 for (i=ctdb->ifaces;i;i=i->next) {
58 if (strcmp(i->name, iface) == 0) {
63 /* create a new structure for this interface */
64 i = talloc_zero(ctdb, struct ctdb_iface);
65 CTDB_NO_MEMORY_FATAL(ctdb, i);
66 i->name = talloc_strdup(i, iface);
67 CTDB_NO_MEMORY(ctdb, i->name);
70 DLIST_ADD(ctdb->ifaces, i);
75 static struct ctdb_iface *ctdb_find_iface(struct ctdb_context *ctdb,
80 /* Verify that we dont have an entry for this ip yet */
81 for (i=ctdb->ifaces;i;i=i->next) {
82 if (strcmp(i->name, iface) == 0) {
90 static struct ctdb_iface *ctdb_vnn_best_iface(struct ctdb_context *ctdb,
94 struct ctdb_iface *cur = NULL;
95 struct ctdb_iface *best = NULL;
97 for (i=0; vnn->ifaces[i]; i++) {
99 cur = ctdb_find_iface(ctdb, vnn->ifaces[i]);
113 if (cur->references < best->references) {
122 static int32_t ctdb_vnn_assign_iface(struct ctdb_context *ctdb,
123 struct ctdb_vnn *vnn)
125 struct ctdb_iface *best = NULL;
128 DEBUG(DEBUG_INFO, (__location__ " public address '%s' "
129 "still assigned to iface '%s'\n",
130 ctdb_addr_to_str(&vnn->public_address),
131 ctdb_vnn_iface_string(vnn)));
135 best = ctdb_vnn_best_iface(ctdb, vnn);
137 DEBUG(DEBUG_ERR, (__location__ " public address '%s' "
138 "cannot assign to iface any iface\n",
139 ctdb_addr_to_str(&vnn->public_address)));
145 vnn->pnn = ctdb->pnn;
147 DEBUG(DEBUG_INFO, (__location__ " public address '%s' "
148 "now assigned to iface '%s' refs[%d]\n",
149 ctdb_addr_to_str(&vnn->public_address),
150 ctdb_vnn_iface_string(vnn),
155 static void ctdb_vnn_unassign_iface(struct ctdb_context *ctdb,
156 struct ctdb_vnn *vnn)
158 DEBUG(DEBUG_INFO, (__location__ " public address '%s' "
159 "now unassigned (old iface '%s' refs[%d])\n",
160 ctdb_addr_to_str(&vnn->public_address),
161 ctdb_vnn_iface_string(vnn),
162 vnn->iface?vnn->iface->references:0));
164 vnn->iface->references--;
167 if (vnn->pnn == ctdb->pnn) {
172 static bool ctdb_vnn_available(struct ctdb_context *ctdb,
173 struct ctdb_vnn *vnn)
177 if (vnn->iface && vnn->iface->link_up) {
181 for (i=0; vnn->ifaces[i]; i++) {
182 struct ctdb_iface *cur;
184 cur = ctdb_find_iface(ctdb, vnn->ifaces[i]);
197 struct ctdb_takeover_arp {
198 struct ctdb_context *ctdb;
201 struct ctdb_tcp_array *tcparray;
202 struct ctdb_vnn *vnn;
207 lists of tcp endpoints
209 struct ctdb_tcp_list {
210 struct ctdb_tcp_list *prev, *next;
211 struct ctdb_tcp_connection connection;
215 list of clients to kill on IP release
217 struct ctdb_client_ip {
218 struct ctdb_client_ip *prev, *next;
219 struct ctdb_context *ctdb;
226 send a gratuitous arp
228 static void ctdb_control_send_arp(struct event_context *ev, struct timed_event *te,
229 struct timeval t, void *private_data)
231 struct ctdb_takeover_arp *arp = talloc_get_type(private_data,
232 struct ctdb_takeover_arp);
234 struct ctdb_tcp_array *tcparray;
235 const char *iface = ctdb_vnn_iface_string(arp->vnn);
237 ret = ctdb_sys_send_arp(&arp->addr, iface);
239 DEBUG(DEBUG_CRIT,(__location__ " sending of arp failed on iface '%s' (%s)\n",
240 iface, strerror(errno)));
243 tcparray = arp->tcparray;
245 for (i=0;i<tcparray->num;i++) {
246 struct ctdb_tcp_connection *tcon;
248 tcon = &tcparray->connections[i];
249 DEBUG(DEBUG_INFO,("sending tcp tickle ack for %u->%s:%u\n",
250 (unsigned)ntohs(tcon->dst_addr.ip.sin_port),
251 ctdb_addr_to_str(&tcon->src_addr),
252 (unsigned)ntohs(tcon->src_addr.ip.sin_port)));
253 ret = ctdb_sys_send_tcp(
258 DEBUG(DEBUG_CRIT,(__location__ " Failed to send tcp tickle ack for %s\n",
259 ctdb_addr_to_str(&tcon->src_addr)));
266 if (arp->count == CTDB_ARP_REPEAT) {
271 event_add_timed(arp->ctdb->ev, arp->vnn->takeover_ctx,
272 timeval_current_ofs(CTDB_ARP_INTERVAL, 100000),
273 ctdb_control_send_arp, arp);
276 static int32_t ctdb_announce_vnn_iface(struct ctdb_context *ctdb,
277 struct ctdb_vnn *vnn)
279 struct ctdb_takeover_arp *arp;
280 struct ctdb_tcp_array *tcparray;
282 if (!vnn->takeover_ctx) {
283 vnn->takeover_ctx = talloc_new(vnn);
284 if (!vnn->takeover_ctx) {
289 arp = talloc_zero(vnn->takeover_ctx, struct ctdb_takeover_arp);
295 arp->addr = vnn->public_address;
298 tcparray = vnn->tcp_array;
300 /* add all of the known tcp connections for this IP to the
301 list of tcp connections to send tickle acks for */
302 arp->tcparray = talloc_steal(arp, tcparray);
304 vnn->tcp_array = NULL;
305 vnn->tcp_update_needed = true;
308 event_add_timed(arp->ctdb->ev, vnn->takeover_ctx,
309 timeval_zero(), ctdb_control_send_arp, arp);
314 struct takeover_callback_state {
315 struct ctdb_req_control *c;
316 ctdb_sock_addr *addr;
317 struct ctdb_vnn *vnn;
320 struct ctdb_do_takeip_state {
321 struct ctdb_req_control *c;
322 struct ctdb_vnn *vnn;
326 called when takeip event finishes
328 static void ctdb_do_takeip_callback(struct ctdb_context *ctdb, int status,
331 struct ctdb_do_takeip_state *state =
332 talloc_get_type(private_data, struct ctdb_do_takeip_state);
336 if (status == -ETIME) {
339 DEBUG(DEBUG_ERR,(__location__ " Failed to takeover IP %s on interface %s\n",
340 ctdb_addr_to_str(&state->vnn->public_address),
341 ctdb_vnn_iface_string(state->vnn)));
342 ctdb_request_control_reply(ctdb, state->c, NULL, status, NULL);
347 ret = ctdb_announce_vnn_iface(ctdb, state->vnn);
349 ctdb_request_control_reply(ctdb, state->c, NULL, -1, NULL);
354 /* the control succeeded */
355 ctdb_request_control_reply(ctdb, state->c, NULL, 0, NULL);
361 take over an ip address
363 static int32_t ctdb_do_takeip(struct ctdb_context *ctdb,
364 struct ctdb_req_control *c,
365 struct ctdb_vnn *vnn)
368 struct ctdb_do_takeip_state *state;
370 ret = ctdb_vnn_assign_iface(ctdb, vnn);
372 DEBUG(DEBUG_ERR,("Takeover of IP %s/%u failed to "
373 "assin a usable interface\n",
374 ctdb_addr_to_str(&vnn->public_address),
375 vnn->public_netmask_bits));
379 state = talloc(vnn, struct ctdb_do_takeip_state);
380 CTDB_NO_MEMORY(ctdb, state);
382 state->c = talloc_steal(ctdb, c);
385 DEBUG(DEBUG_NOTICE,("Takeover of IP %s/%u on interface %s\n",
386 ctdb_addr_to_str(&vnn->public_address),
387 vnn->public_netmask_bits,
388 ctdb_vnn_iface_string(vnn)));
390 ret = ctdb_event_script_callback(ctdb,
392 ctdb_do_takeip_callback,
397 ctdb_vnn_iface_string(vnn),
398 ctdb_addr_to_str(&vnn->public_address),
399 vnn->public_netmask_bits);
402 DEBUG(DEBUG_ERR,(__location__ " Failed to takeover IP %s on interface %s\n",
403 ctdb_addr_to_str(&vnn->public_address),
404 ctdb_vnn_iface_string(vnn)));
412 struct ctdb_do_updateip_state {
413 struct ctdb_req_control *c;
414 struct ctdb_iface *old;
415 struct ctdb_vnn *vnn;
419 called when updateip event finishes
421 static void ctdb_do_updateip_callback(struct ctdb_context *ctdb, int status,
424 struct ctdb_do_updateip_state *state =
425 talloc_get_type(private_data, struct ctdb_do_updateip_state);
429 if (status == -ETIME) {
432 DEBUG(DEBUG_ERR,(__location__ " Failed to move IP %s from interface %s to %s\n",
433 ctdb_addr_to_str(&state->vnn->public_address),
435 ctdb_vnn_iface_string(state->vnn)));
438 * All we can do is reset the old interface
439 * and let the next run fix it
441 ctdb_vnn_unassign_iface(ctdb, state->vnn);
442 state->vnn->iface = state->old;
443 state->vnn->iface->references++;
445 ctdb_request_control_reply(ctdb, state->c, NULL, status, NULL);
450 ret = ctdb_announce_vnn_iface(ctdb, state->vnn);
452 ctdb_request_control_reply(ctdb, state->c, NULL, -1, NULL);
457 /* the control succeeded */
458 ctdb_request_control_reply(ctdb, state->c, NULL, 0, NULL);
464 update (move) an ip address
466 static int32_t ctdb_do_updateip(struct ctdb_context *ctdb,
467 struct ctdb_req_control *c,
468 struct ctdb_vnn *vnn)
471 struct ctdb_do_updateip_state *state;
472 struct ctdb_iface *old = vnn->iface;
474 ctdb_vnn_unassign_iface(ctdb, vnn);
475 ret = ctdb_vnn_assign_iface(ctdb, vnn);
477 DEBUG(DEBUG_ERR,("update of IP %s/%u failed to "
478 "assin a usable interface (old iface '%s')\n",
479 ctdb_addr_to_str(&vnn->public_address),
480 vnn->public_netmask_bits,
485 if (vnn->iface == old) {
486 DEBUG(DEBUG_ERR,("update of IP %s/%u trying to "
487 "assin a same interface '%s'\n",
488 ctdb_addr_to_str(&vnn->public_address),
489 vnn->public_netmask_bits,
494 state = talloc(vnn, struct ctdb_do_updateip_state);
495 CTDB_NO_MEMORY(ctdb, state);
497 state->c = talloc_steal(ctdb, c);
501 DEBUG(DEBUG_NOTICE,("Update of IP %s/%u from "
502 "interface %s to %s\n",
503 ctdb_addr_to_str(&vnn->public_address),
504 vnn->public_netmask_bits,
506 ctdb_vnn_iface_string(vnn)));
508 ret = ctdb_event_script_callback(ctdb,
510 ctdb_do_updateip_callback,
513 CTDB_EVENT_UPDATE_IP,
516 ctdb_vnn_iface_string(vnn),
517 ctdb_addr_to_str(&vnn->public_address),
518 vnn->public_netmask_bits);
520 DEBUG(DEBUG_ERR,(__location__ " Failed update IP %s from interface %s to %s\n",
521 ctdb_addr_to_str(&vnn->public_address),
522 old->name, ctdb_vnn_iface_string(vnn)));
531 Find the vnn of the node that has a public ip address
532 returns -1 if the address is not known as a public address
534 static struct ctdb_vnn *find_public_ip_vnn(struct ctdb_context *ctdb, ctdb_sock_addr *addr)
536 struct ctdb_vnn *vnn;
538 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
539 if (ctdb_same_ip(&vnn->public_address, addr)) {
548 take over an ip address
550 int32_t ctdb_control_takeover_ip(struct ctdb_context *ctdb,
551 struct ctdb_req_control *c,
556 struct ctdb_public_ip *pip = (struct ctdb_public_ip *)indata.dptr;
557 struct ctdb_vnn *vnn;
558 bool have_ip = false;
559 bool do_updateip = false;
560 bool do_takeip = false;
562 /* update out vnn list */
563 vnn = find_public_ip_vnn(ctdb, &pip->addr);
565 DEBUG(DEBUG_INFO,("takeoverip called for an ip '%s' that is not a public address\n",
566 ctdb_addr_to_str(&pip->addr)));
571 have_ip = ctdb_sys_have_ip(&pip->addr);
574 if (vnn->iface->link_up) {
575 struct ctdb_iface *best;
576 best = ctdb_vnn_best_iface(ctdb, vnn);
577 /* only move when the rebalance gains something */
578 if (best && vnn->iface->references > (best->references + 1)) {
581 } else if (vnn->iface != best_iface) {
588 ctdb_vnn_unassign_iface(ctdb, vnn);
595 ret = ctdb_do_takeip(ctdb, c, vnn);
599 } else if (do_updateip) {
600 ret = ctdb_do_updateip(ctdb, c, vnn);
606 * The interface is up and the kernel known the ip
612 /* tell ctdb_control.c that we will be replying asynchronously */
619 takeover an ip address old v4 style
621 int32_t ctdb_control_takeover_ipv4(struct ctdb_context *ctdb,
622 struct ctdb_req_control *c,
628 data.dsize = sizeof(struct ctdb_public_ip);
629 data.dptr = (uint8_t *)talloc_zero(c, struct ctdb_public_ip);
630 CTDB_NO_MEMORY(ctdb, data.dptr);
632 memcpy(data.dptr, indata.dptr, indata.dsize);
633 return ctdb_control_takeover_ip(ctdb, c, data, async_reply);
637 kill any clients that are registered with a IP that is being released
639 static void release_kill_clients(struct ctdb_context *ctdb, ctdb_sock_addr *addr)
641 struct ctdb_client_ip *ip;
643 DEBUG(DEBUG_INFO,("release_kill_clients for ip %s\n",
644 ctdb_addr_to_str(addr)));
646 for (ip=ctdb->client_ip_list; ip; ip=ip->next) {
647 ctdb_sock_addr tmp_addr;
650 DEBUG(DEBUG_INFO,("checking for client %u with IP %s\n",
652 ctdb_addr_to_str(&ip->addr)));
654 if (ctdb_same_ip(&tmp_addr, addr)) {
655 struct ctdb_client *client = ctdb_reqid_find(ctdb,
658 DEBUG(DEBUG_INFO,("matched client %u with IP %s and pid %u\n",
660 ctdb_addr_to_str(&ip->addr),
663 if (client->pid != 0) {
664 DEBUG(DEBUG_INFO,(__location__ " Killing client pid %u for IP %s on client_id %u\n",
665 (unsigned)client->pid,
666 ctdb_addr_to_str(addr),
668 kill(client->pid, SIGKILL);
675 called when releaseip event finishes
677 static void release_ip_callback(struct ctdb_context *ctdb, int status,
680 struct takeover_callback_state *state =
681 talloc_get_type(private_data, struct takeover_callback_state);
684 if (status == -ETIME) {
688 /* send a message to all clients of this node telling them
689 that the cluster has been reconfigured and they should
690 release any sockets on this IP */
691 data.dptr = (uint8_t *)talloc_strdup(state, ctdb_addr_to_str(state->addr));
692 CTDB_NO_MEMORY_VOID(ctdb, data.dptr);
693 data.dsize = strlen((char *)data.dptr)+1;
695 DEBUG(DEBUG_INFO,(__location__ " sending RELEASE_IP for '%s'\n", data.dptr));
697 ctdb_daemon_send_message(ctdb, ctdb->pnn, CTDB_SRVID_RELEASE_IP, data);
699 /* kill clients that have registered with this IP */
700 release_kill_clients(ctdb, state->addr);
702 ctdb_vnn_unassign_iface(ctdb, state->vnn);
704 /* the control succeeded */
705 ctdb_request_control_reply(ctdb, state->c, NULL, 0, NULL);
710 release an ip address
712 int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
713 struct ctdb_req_control *c,
718 struct takeover_callback_state *state;
719 struct ctdb_public_ip *pip = (struct ctdb_public_ip *)indata.dptr;
720 struct ctdb_vnn *vnn;
722 /* update our vnn list */
723 vnn = find_public_ip_vnn(ctdb, &pip->addr);
725 DEBUG(DEBUG_INFO,("releaseip called for an ip '%s' that is not a public address\n",
726 ctdb_addr_to_str(&pip->addr)));
731 /* stop any previous arps */
732 talloc_free(vnn->takeover_ctx);
733 vnn->takeover_ctx = NULL;
735 if (!ctdb_sys_have_ip(&pip->addr)) {
736 DEBUG(DEBUG_NOTICE,("Redundant release of IP %s/%u on interface %s (ip not held)\n",
737 ctdb_addr_to_str(&pip->addr),
738 vnn->public_netmask_bits,
739 ctdb_vnn_iface_string(vnn)));
740 ctdb_vnn_unassign_iface(ctdb, vnn);
744 DEBUG(DEBUG_NOTICE,("Release of IP %s/%u on interface %s node:%u\n",
745 ctdb_addr_to_str(&pip->addr),
746 vnn->public_netmask_bits,
747 ctdb_vnn_iface_string(vnn),
750 state = talloc(ctdb, struct takeover_callback_state);
751 CTDB_NO_MEMORY(ctdb, state);
753 state->c = talloc_steal(state, c);
754 state->addr = talloc(state, ctdb_sock_addr);
755 CTDB_NO_MEMORY(ctdb, state->addr);
756 *state->addr = pip->addr;
759 ret = ctdb_event_script_callback(ctdb,
760 state, release_ip_callback, state,
762 CTDB_EVENT_RELEASE_IP,
764 ctdb_vnn_iface_string(vnn),
765 ctdb_addr_to_str(&pip->addr),
766 vnn->public_netmask_bits);
768 DEBUG(DEBUG_ERR,(__location__ " Failed to release IP %s on interface %s\n",
769 ctdb_addr_to_str(&pip->addr),
770 ctdb_vnn_iface_string(vnn)));
775 /* tell the control that we will be reply asynchronously */
781 release an ip address old v4 style
783 int32_t ctdb_control_release_ipv4(struct ctdb_context *ctdb,
784 struct ctdb_req_control *c,
790 data.dsize = sizeof(struct ctdb_public_ip);
791 data.dptr = (uint8_t *)talloc_zero(c, struct ctdb_public_ip);
792 CTDB_NO_MEMORY(ctdb, data.dptr);
794 memcpy(data.dptr, indata.dptr, indata.dsize);
795 return ctdb_control_release_ip(ctdb, c, data, async_reply);
799 static int ctdb_add_public_address(struct ctdb_context *ctdb,
800 ctdb_sock_addr *addr,
801 unsigned mask, const char *ifaces)
803 struct ctdb_vnn *vnn;
810 /* Verify that we dont have an entry for this ip yet */
811 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
812 if (ctdb_same_sockaddr(addr, &vnn->public_address)) {
813 DEBUG(DEBUG_CRIT,("Same ip '%s' specified multiple times in the public address list \n",
814 ctdb_addr_to_str(addr)));
819 /* create a new vnn structure for this ip address */
820 vnn = talloc_zero(ctdb, struct ctdb_vnn);
821 CTDB_NO_MEMORY_FATAL(ctdb, vnn);
822 vnn->ifaces = talloc_array(vnn, const char *, num + 2);
823 tmp = talloc_strdup(vnn, ifaces);
824 CTDB_NO_MEMORY_FATAL(ctdb, tmp);
825 for (iface = strtok(tmp, ","); iface; iface = strtok(NULL, ",")) {
826 vnn->ifaces = talloc_realloc(vnn, vnn->ifaces, const char *, num + 2);
827 CTDB_NO_MEMORY_FATAL(ctdb, vnn->ifaces);
828 vnn->ifaces[num] = talloc_strdup(vnn, iface);
829 CTDB_NO_MEMORY_FATAL(ctdb, vnn->ifaces[num]);
833 vnn->ifaces[num] = NULL;
834 vnn->public_address = *addr;
835 vnn->public_netmask_bits = mask;
838 for (i=0; vnn->ifaces[i]; i++) {
839 ret = ctdb_add_local_iface(ctdb, vnn->ifaces[i]);
841 DEBUG(DEBUG_CRIT, (__location__ " failed to add iface[%s] "
842 "for public_address[%s]\n",
843 vnn->ifaces[i], ctdb_addr_to_str(addr)));
849 DLIST_ADD(ctdb->vnn, vnn);
855 setup the event script directory
857 int ctdb_set_event_script_dir(struct ctdb_context *ctdb, const char *script_dir)
859 ctdb->event_script_dir = talloc_strdup(ctdb, script_dir);
860 CTDB_NO_MEMORY(ctdb, ctdb->event_script_dir);
865 setup the public address lists from a file
867 int ctdb_set_public_addresses(struct ctdb_context *ctdb, const char *alist)
873 lines = file_lines_load(alist, &nlines, ctdb);
875 ctdb_set_error(ctdb, "Failed to load public address list '%s'\n", alist);
878 while (nlines > 0 && strcmp(lines[nlines-1], "") == 0) {
882 for (i=0;i<nlines;i++) {
890 while ((*line == ' ') || (*line == '\t')) {
896 if (strcmp(line, "") == 0) {
899 tok = strtok(line, " \t");
901 tok = strtok(NULL, " \t");
903 if (NULL == ctdb->default_public_interface) {
904 DEBUG(DEBUG_CRIT,("No default public interface and no interface specified at line %u of public address list\n",
909 ifaces = ctdb->default_public_interface;
914 if (!addrstr || !parse_ip_mask(addrstr, ifaces, &addr, &mask)) {
915 DEBUG(DEBUG_CRIT,("Badly formed line %u in public address list\n", i+1));
919 if (ctdb_add_public_address(ctdb, &addr, mask, ifaces)) {
920 DEBUG(DEBUG_CRIT,("Failed to add line %u to the public address list\n", i+1));
930 int ctdb_set_single_public_ip(struct ctdb_context *ctdb,
934 struct ctdb_vnn *svnn;
938 svnn = talloc_zero(ctdb, struct ctdb_vnn);
939 CTDB_NO_MEMORY(ctdb, svnn);
941 svnn->ifaces = talloc_array(svnn, const char *, 2);
942 CTDB_NO_MEMORY(ctdb, svnn->ifaces);
943 svnn->ifaces[0] = talloc_strdup(svnn->ifaces, iface);
944 CTDB_NO_MEMORY(ctdb, svnn->ifaces[0]);
945 svnn->ifaces[1] = NULL;
947 ok = parse_ip(ip, iface, 0, &svnn->public_address);
953 ret = ctdb_add_local_iface(ctdb, svnn->ifaces[0]);
955 DEBUG(DEBUG_CRIT, (__location__ " failed to add iface[%s] "
956 "for single_ip[%s]\n",
958 ctdb_addr_to_str(&svnn->public_address)));
963 ret = ctdb_vnn_assign_iface(ctdb, svnn);
969 ctdb->single_ip_vnn = svnn;
973 struct ctdb_public_ip_list {
974 struct ctdb_public_ip_list *next;
980 /* Given a physical node, return the number of
981 public addresses that is currently assigned to this node.
983 static int node_ip_coverage(struct ctdb_context *ctdb,
985 struct ctdb_public_ip_list *ips)
989 for (;ips;ips=ips->next) {
990 if (ips->pnn == pnn) {
998 /* Check if this is a public ip known to the node, i.e. can that
999 node takeover this ip ?
1001 static int can_node_serve_ip(struct ctdb_context *ctdb, int32_t pnn,
1002 struct ctdb_public_ip_list *ip)
1004 struct ctdb_all_public_ips *public_ips;
1007 public_ips = ctdb->nodes[pnn]->available_public_ips;
1009 if (public_ips == NULL) {
1013 for (i=0;i<public_ips->num;i++) {
1014 if (ctdb_same_ip(&ip->addr, &public_ips->ips[i].addr)) {
1015 /* yes, this node can serve this public ip */
1024 /* search the node lists list for a node to takeover this ip.
1025 pick the node that currently are serving the least number of ips
1026 so that the ips get spread out evenly.
1028 static int find_takeover_node(struct ctdb_context *ctdb,
1029 struct ctdb_node_map *nodemap, uint32_t mask,
1030 struct ctdb_public_ip_list *ip,
1031 struct ctdb_public_ip_list *all_ips)
1033 int pnn, min=0, num;
1037 for (i=0;i<nodemap->num;i++) {
1038 if (nodemap->nodes[i].flags & mask) {
1039 /* This node is not healty and can not be used to serve
1045 /* verify that this node can serve this ip */
1046 if (can_node_serve_ip(ctdb, i, ip)) {
1047 /* no it couldnt so skip to the next node */
1051 num = node_ip_coverage(ctdb, i, all_ips);
1052 /* was this the first node we checked ? */
1064 DEBUG(DEBUG_WARNING,(__location__ " Could not find node to take over public address '%s'\n",
1065 ctdb_addr_to_str(&ip->addr)));
1075 static uint32_t *ip_key(ctdb_sock_addr *ip)
1077 static uint32_t key[IP_KEYLEN];
1079 bzero(key, sizeof(key));
1081 switch (ip->sa.sa_family) {
1083 key[3] = htonl(ip->ip.sin_addr.s_addr);
1086 key[0] = htonl(ip->ip6.sin6_addr.s6_addr32[0]);
1087 key[1] = htonl(ip->ip6.sin6_addr.s6_addr32[1]);
1088 key[2] = htonl(ip->ip6.sin6_addr.s6_addr32[2]);
1089 key[3] = htonl(ip->ip6.sin6_addr.s6_addr32[3]);
1092 DEBUG(DEBUG_ERR, (__location__ " ERROR, unknown family passed :%u\n", ip->sa.sa_family));
1099 static void *add_ip_callback(void *parm, void *data)
1104 void getips_count_callback(void *param, void *data)
1106 struct ctdb_public_ip_list **ip_list = (struct ctdb_public_ip_list **)param;
1107 struct ctdb_public_ip_list *new_ip = (struct ctdb_public_ip_list *)data;
1109 new_ip->next = *ip_list;
1113 struct ctdb_public_ip_list *
1114 create_merged_ip_list(struct ctdb_context *ctdb, TALLOC_CTX *tmp_ctx)
1117 struct ctdb_public_ip_list *ip_list;
1118 struct ctdb_all_public_ips *public_ips;
1119 trbt_tree_t *ip_tree;
1121 ip_tree = trbt_create(tmp_ctx, 0);
1123 for (i=0;i<ctdb->num_nodes;i++) {
1124 public_ips = ctdb->nodes[i]->known_public_ips;
1126 if (ctdb->nodes[i]->flags & NODE_FLAGS_DELETED) {
1130 /* there were no public ips for this node */
1131 if (public_ips == NULL) {
1135 for (j=0;j<public_ips->num;j++) {
1136 struct ctdb_public_ip_list *tmp_ip;
1138 tmp_ip = talloc_zero(tmp_ctx, struct ctdb_public_ip_list);
1139 CTDB_NO_MEMORY_NULL(ctdb, tmp_ip);
1140 tmp_ip->pnn = public_ips->ips[j].pnn;
1141 tmp_ip->addr = public_ips->ips[j].addr;
1142 tmp_ip->next = NULL;
1144 trbt_insertarray32_callback(ip_tree,
1145 IP_KEYLEN, ip_key(&public_ips->ips[j].addr),
1152 trbt_traversearray32(ip_tree, IP_KEYLEN, getips_count_callback, &ip_list);
1158 make any IP alias changes for public addresses that are necessary
1160 int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map *nodemap)
1162 int i, num_healthy, retries;
1163 struct ctdb_public_ip ip;
1164 struct ctdb_public_ipv4 ipv4;
1166 struct ctdb_public_ip_list *all_ips, *tmp_ip;
1167 int maxnode, maxnum=0, minnode, minnum=0, num;
1169 struct timeval timeout;
1170 struct client_async_data *async_data;
1171 struct ctdb_client_control_state *state;
1172 TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
1177 /* Count how many completely healthy nodes we have */
1179 for (i=0;i<nodemap->num;i++) {
1180 if (!(nodemap->nodes[i].flags & (NODE_FLAGS_INACTIVE|NODE_FLAGS_DISABLED))) {
1185 if (num_healthy > 0) {
1186 /* We have healthy nodes, so only consider them for
1187 serving public addresses
1189 mask = NODE_FLAGS_INACTIVE|NODE_FLAGS_DISABLED;
1191 /* We didnt have any completely healthy nodes so
1192 use "disabled" nodes as a fallback
1194 mask = NODE_FLAGS_INACTIVE;
1197 /* since nodes only know about those public addresses that
1198 can be served by that particular node, no single node has
1199 a full list of all public addresses that exist in the cluster.
1200 Walk over all node structures and create a merged list of
1201 all public addresses that exist in the cluster.
1203 all_ips = create_merged_ip_list(ctdb, tmp_ctx);
1205 /* If we want deterministic ip allocations, i.e. that the ip addresses
1206 will always be allocated the same way for a specific set of
1207 available/unavailable nodes.
1209 if (1 == ctdb->tunable.deterministic_public_ips) {
1210 DEBUG(DEBUG_NOTICE,("Deterministic IPs enabled. Resetting all ip allocations\n"));
1211 for (i=0,tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next,i++) {
1212 tmp_ip->pnn = i%nodemap->num;
1217 /* mark all public addresses with a masked node as being served by
1220 for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
1221 if (tmp_ip->pnn == -1) {
1224 if (nodemap->nodes[tmp_ip->pnn].flags & mask) {
1229 /* verify that the assigned nodes can serve that public ip
1230 and set it to -1 if not
1232 for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
1233 if (tmp_ip->pnn == -1) {
1236 if (can_node_serve_ip(ctdb, tmp_ip->pnn, tmp_ip) != 0) {
1237 /* this node can not serve this ip. */
1243 /* now we must redistribute all public addresses with takeover node
1244 -1 among the nodes available
1248 /* loop over all ip's and find a physical node to cover for
1251 for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
1252 if (tmp_ip->pnn == -1) {
1253 if (find_takeover_node(ctdb, nodemap, mask, tmp_ip, all_ips)) {
1254 DEBUG(DEBUG_WARNING,("Failed to find node to cover ip %s\n",
1255 ctdb_addr_to_str(&tmp_ip->addr)));
1260 /* If we dont want ips to fail back after a node becomes healthy
1261 again, we wont even try to reallocat the ip addresses so that
1262 they are evenly spread out.
1263 This can NOT be used at the same time as DeterministicIPs !
1265 if (1 == ctdb->tunable.no_ip_failback) {
1266 if (1 == ctdb->tunable.deterministic_public_ips) {
1267 DEBUG(DEBUG_ERR, ("ERROR: You can not use 'DeterministicIPs' and 'NoIPFailback' at the same time\n"));
1273 /* now, try to make sure the ip adresses are evenly distributed
1275 for each ip address, loop over all nodes that can serve this
1276 ip and make sure that the difference between the node
1277 serving the most and the node serving the least ip's are not greater
1280 for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
1281 if (tmp_ip->pnn == -1) {
1285 /* Get the highest and lowest number of ips's served by any
1286 valid node which can serve this ip.
1290 for (i=0;i<nodemap->num;i++) {
1291 if (nodemap->nodes[i].flags & mask) {
1295 /* only check nodes that can actually serve this ip */
1296 if (can_node_serve_ip(ctdb, i, tmp_ip)) {
1297 /* no it couldnt so skip to the next node */
1301 num = node_ip_coverage(ctdb, i, all_ips);
1302 if (maxnode == -1) {
1311 if (minnode == -1) {
1321 if (maxnode == -1) {
1322 DEBUG(DEBUG_WARNING,(__location__ " Could not find maxnode. May not be able to serve ip '%s'\n",
1323 ctdb_addr_to_str(&tmp_ip->addr)));
1328 /* If we want deterministic IPs then dont try to reallocate
1329 them to spread out the load.
1331 if (1 == ctdb->tunable.deterministic_public_ips) {
1335 /* if the spread between the smallest and largest coverage by
1336 a node is >=2 we steal one of the ips from the node with
1337 most coverage to even things out a bit.
1338 try to do this at most 5 times since we dont want to spend
1339 too much time balancing the ip coverage.
1341 if ( (maxnum > minnum+1)
1343 struct ctdb_public_ip_list *tmp;
1345 /* mark one of maxnode's vnn's as unassigned and try
1348 for (tmp=all_ips;tmp;tmp=tmp->next) {
1349 if (tmp->pnn == maxnode) {
1359 /* finished distributing the public addresses, now just send the
1360 info out to the nodes
1364 /* at this point ->pnn is the node which will own each IP
1365 or -1 if there is no node that can cover this ip
1368 /* now tell all nodes to delete any alias that they should not
1369 have. This will be a NOOP on nodes that don't currently
1370 hold the given alias */
1371 async_data = talloc_zero(tmp_ctx, struct client_async_data);
1372 CTDB_NO_MEMORY_FATAL(ctdb, async_data);
1374 for (i=0;i<nodemap->num;i++) {
1375 /* don't talk to unconnected nodes, but do talk to banned nodes */
1376 if (nodemap->nodes[i].flags & NODE_FLAGS_DISCONNECTED) {
1380 for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
1381 if (tmp_ip->pnn == nodemap->nodes[i].pnn) {
1382 /* This node should be serving this
1383 vnn so dont tell it to release the ip
1387 if (tmp_ip->addr.sa.sa_family == AF_INET) {
1388 ipv4.pnn = tmp_ip->pnn;
1389 ipv4.sin = tmp_ip->addr.ip;
1391 timeout = TAKEOVER_TIMEOUT();
1392 data.dsize = sizeof(ipv4);
1393 data.dptr = (uint8_t *)&ipv4;
1394 state = ctdb_control_send(ctdb, nodemap->nodes[i].pnn,
1395 0, CTDB_CONTROL_RELEASE_IPv4, 0,
1399 ip.pnn = tmp_ip->pnn;
1400 ip.addr = tmp_ip->addr;
1402 timeout = TAKEOVER_TIMEOUT();
1403 data.dsize = sizeof(ip);
1404 data.dptr = (uint8_t *)&ip;
1405 state = ctdb_control_send(ctdb, nodemap->nodes[i].pnn,
1406 0, CTDB_CONTROL_RELEASE_IP, 0,
1411 if (state == NULL) {
1412 DEBUG(DEBUG_ERR,(__location__ " Failed to call async control CTDB_CONTROL_RELEASE_IP to node %u\n", nodemap->nodes[i].pnn));
1413 talloc_free(tmp_ctx);
1417 ctdb_client_async_add(async_data, state);
1420 if (ctdb_client_async_wait(ctdb, async_data) != 0) {
1421 DEBUG(DEBUG_ERR,(__location__ " Async control CTDB_CONTROL_RELEASE_IP failed\n"));
1422 talloc_free(tmp_ctx);
1425 talloc_free(async_data);
1428 /* tell all nodes to get their own IPs */
1429 async_data = talloc_zero(tmp_ctx, struct client_async_data);
1430 CTDB_NO_MEMORY_FATAL(ctdb, async_data);
1431 for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
1432 if (tmp_ip->pnn == -1) {
1433 /* this IP won't be taken over */
1437 if (tmp_ip->addr.sa.sa_family == AF_INET) {
1438 ipv4.pnn = tmp_ip->pnn;
1439 ipv4.sin = tmp_ip->addr.ip;
1441 timeout = TAKEOVER_TIMEOUT();
1442 data.dsize = sizeof(ipv4);
1443 data.dptr = (uint8_t *)&ipv4;
1444 state = ctdb_control_send(ctdb, tmp_ip->pnn,
1445 0, CTDB_CONTROL_TAKEOVER_IPv4, 0,
1449 ip.pnn = tmp_ip->pnn;
1450 ip.addr = tmp_ip->addr;
1452 timeout = TAKEOVER_TIMEOUT();
1453 data.dsize = sizeof(ip);
1454 data.dptr = (uint8_t *)&ip;
1455 state = ctdb_control_send(ctdb, tmp_ip->pnn,
1456 0, CTDB_CONTROL_TAKEOVER_IP, 0,
1460 if (state == NULL) {
1461 DEBUG(DEBUG_ERR,(__location__ " Failed to call async control CTDB_CONTROL_TAKEOVER_IP to node %u\n", tmp_ip->pnn));
1462 talloc_free(tmp_ctx);
1466 ctdb_client_async_add(async_data, state);
1468 if (ctdb_client_async_wait(ctdb, async_data) != 0) {
1469 DEBUG(DEBUG_ERR,(__location__ " Async control CTDB_CONTROL_TAKEOVER_IP failed\n"));
1470 talloc_free(tmp_ctx);
1474 talloc_free(tmp_ctx);
1480 destroy a ctdb_client_ip structure
1482 static int ctdb_client_ip_destructor(struct ctdb_client_ip *ip)
1484 DEBUG(DEBUG_DEBUG,("destroying client tcp for %s:%u (client_id %u)\n",
1485 ctdb_addr_to_str(&ip->addr),
1486 ntohs(ip->addr.ip.sin_port),
1489 DLIST_REMOVE(ip->ctdb->client_ip_list, ip);
1494 called by a client to inform us of a TCP connection that it is managing
1495 that should tickled with an ACK when IP takeover is done
1496 we handle both the old ipv4 style of packets as well as the new ipv4/6
1499 int32_t ctdb_control_tcp_client(struct ctdb_context *ctdb, uint32_t client_id,
1502 struct ctdb_client *client = ctdb_reqid_find(ctdb, client_id, struct ctdb_client);
1503 struct ctdb_control_tcp *old_addr = NULL;
1504 struct ctdb_control_tcp_addr new_addr;
1505 struct ctdb_control_tcp_addr *tcp_sock = NULL;
1506 struct ctdb_tcp_list *tcp;
1507 struct ctdb_control_tcp_vnn t;
1510 struct ctdb_client_ip *ip;
1511 struct ctdb_vnn *vnn;
1512 ctdb_sock_addr addr;
1514 switch (indata.dsize) {
1515 case sizeof(struct ctdb_control_tcp):
1516 old_addr = (struct ctdb_control_tcp *)indata.dptr;
1517 ZERO_STRUCT(new_addr);
1518 tcp_sock = &new_addr;
1519 tcp_sock->src.ip = old_addr->src;
1520 tcp_sock->dest.ip = old_addr->dest;
1522 case sizeof(struct ctdb_control_tcp_addr):
1523 tcp_sock = (struct ctdb_control_tcp_addr *)indata.dptr;
1526 DEBUG(DEBUG_ERR,(__location__ " Invalid data structure passed "
1527 "to ctdb_control_tcp_client. size was %d but "
1528 "only allowed sizes are %lu and %lu\n",
1530 (long unsigned)sizeof(struct ctdb_control_tcp),
1531 (long unsigned)sizeof(struct ctdb_control_tcp_addr)));
1535 addr = tcp_sock->src;
1536 ctdb_canonicalize_ip(&addr, &tcp_sock->src);
1537 addr = tcp_sock->dest;
1538 ctdb_canonicalize_ip(&addr, &tcp_sock->dest);
1541 memcpy(&addr, &tcp_sock->dest, sizeof(addr));
1542 vnn = find_public_ip_vnn(ctdb, &addr);
1544 switch (addr.sa.sa_family) {
1546 if (ntohl(addr.ip.sin_addr.s_addr) != INADDR_LOOPBACK) {
1547 DEBUG(DEBUG_ERR,("Could not add client IP %s. This is not a public address.\n",
1548 ctdb_addr_to_str(&addr)));
1552 DEBUG(DEBUG_ERR,("Could not add client IP %s. This is not a public ipv6 address.\n",
1553 ctdb_addr_to_str(&addr)));
1556 DEBUG(DEBUG_ERR,(__location__ " Unknown family type %d\n", addr.sa.sa_family));
1562 if (vnn->pnn != ctdb->pnn) {
1563 DEBUG(DEBUG_ERR,("Attempt to register tcp client for IP %s we don't hold - failing (client_id %u pid %u)\n",
1564 ctdb_addr_to_str(&addr),
1565 client_id, client->pid));
1566 /* failing this call will tell smbd to die */
1570 ip = talloc(client, struct ctdb_client_ip);
1571 CTDB_NO_MEMORY(ctdb, ip);
1575 ip->client_id = client_id;
1576 talloc_set_destructor(ip, ctdb_client_ip_destructor);
1577 DLIST_ADD(ctdb->client_ip_list, ip);
1579 tcp = talloc(client, struct ctdb_tcp_list);
1580 CTDB_NO_MEMORY(ctdb, tcp);
1582 tcp->connection.src_addr = tcp_sock->src;
1583 tcp->connection.dst_addr = tcp_sock->dest;
1585 DLIST_ADD(client->tcp_list, tcp);
1587 t.src = tcp_sock->src;
1588 t.dest = tcp_sock->dest;
1590 data.dptr = (uint8_t *)&t;
1591 data.dsize = sizeof(t);
1593 switch (addr.sa.sa_family) {
1595 DEBUG(DEBUG_INFO,("registered tcp client for %u->%s:%u (client_id %u pid %u)\n",
1596 (unsigned)ntohs(tcp_sock->dest.ip.sin_port),
1597 ctdb_addr_to_str(&tcp_sock->src),
1598 (unsigned)ntohs(tcp_sock->src.ip.sin_port), client_id, client->pid));
1601 DEBUG(DEBUG_INFO,("registered tcp client for %u->%s:%u (client_id %u pid %u)\n",
1602 (unsigned)ntohs(tcp_sock->dest.ip6.sin6_port),
1603 ctdb_addr_to_str(&tcp_sock->src),
1604 (unsigned)ntohs(tcp_sock->src.ip6.sin6_port), client_id, client->pid));
1607 DEBUG(DEBUG_ERR,(__location__ " Unknown family %d\n", addr.sa.sa_family));
1611 /* tell all nodes about this tcp connection */
1612 ret = ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_CONNECTED, 0,
1613 CTDB_CONTROL_TCP_ADD,
1614 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL);
1616 DEBUG(DEBUG_ERR,(__location__ " Failed to send CTDB_CONTROL_TCP_ADD\n"));
1624 find a tcp address on a list
1626 static struct ctdb_tcp_connection *ctdb_tcp_find(struct ctdb_tcp_array *array,
1627 struct ctdb_tcp_connection *tcp)
1631 if (array == NULL) {
1635 for (i=0;i<array->num;i++) {
1636 if (ctdb_same_sockaddr(&array->connections[i].src_addr, &tcp->src_addr) &&
1637 ctdb_same_sockaddr(&array->connections[i].dst_addr, &tcp->dst_addr)) {
1638 return &array->connections[i];
1645 called by a daemon to inform us of a TCP connection that one of its
1646 clients managing that should tickled with an ACK when IP takeover is
1649 int32_t ctdb_control_tcp_add(struct ctdb_context *ctdb, TDB_DATA indata)
1651 struct ctdb_control_tcp_vnn *p = (struct ctdb_control_tcp_vnn *)indata.dptr;
1652 struct ctdb_tcp_array *tcparray;
1653 struct ctdb_tcp_connection tcp;
1654 struct ctdb_vnn *vnn;
1656 vnn = find_public_ip_vnn(ctdb, &p->dest);
1658 DEBUG(DEBUG_INFO,(__location__ " got TCP_ADD control for an address which is not a public address '%s'\n",
1659 ctdb_addr_to_str(&p->dest)));
1665 tcparray = vnn->tcp_array;
1667 /* If this is the first tickle */
1668 if (tcparray == NULL) {
1669 tcparray = talloc_size(ctdb->nodes,
1670 offsetof(struct ctdb_tcp_array, connections) +
1671 sizeof(struct ctdb_tcp_connection) * 1);
1672 CTDB_NO_MEMORY(ctdb, tcparray);
1673 vnn->tcp_array = tcparray;
1676 tcparray->connections = talloc_size(tcparray, sizeof(struct ctdb_tcp_connection));
1677 CTDB_NO_MEMORY(ctdb, tcparray->connections);
1679 tcparray->connections[tcparray->num].src_addr = p->src;
1680 tcparray->connections[tcparray->num].dst_addr = p->dest;
1686 /* Do we already have this tickle ?*/
1687 tcp.src_addr = p->src;
1688 tcp.dst_addr = p->dest;
1689 if (ctdb_tcp_find(vnn->tcp_array, &tcp) != NULL) {
1690 DEBUG(DEBUG_DEBUG,("Already had tickle info for %s:%u for vnn:%u\n",
1691 ctdb_addr_to_str(&tcp.dst_addr),
1692 ntohs(tcp.dst_addr.ip.sin_port),
1697 /* A new tickle, we must add it to the array */
1698 tcparray->connections = talloc_realloc(tcparray, tcparray->connections,
1699 struct ctdb_tcp_connection,
1701 CTDB_NO_MEMORY(ctdb, tcparray->connections);
1703 vnn->tcp_array = tcparray;
1704 tcparray->connections[tcparray->num].src_addr = p->src;
1705 tcparray->connections[tcparray->num].dst_addr = p->dest;
1708 DEBUG(DEBUG_INFO,("Added tickle info for %s:%u from vnn %u\n",
1709 ctdb_addr_to_str(&tcp.dst_addr),
1710 ntohs(tcp.dst_addr.ip.sin_port),
1718 called by a daemon to inform us of a TCP connection that one of its
1719 clients managing that should tickled with an ACK when IP takeover is
1722 static void ctdb_remove_tcp_connection(struct ctdb_context *ctdb, struct ctdb_tcp_connection *conn)
1724 struct ctdb_tcp_connection *tcpp;
1725 struct ctdb_vnn *vnn = find_public_ip_vnn(ctdb, &conn->dst_addr);
1728 DEBUG(DEBUG_ERR,(__location__ " unable to find public address %s\n",
1729 ctdb_addr_to_str(&conn->dst_addr)));
1733 /* if the array is empty we cant remove it
1734 and we dont need to do anything
1736 if (vnn->tcp_array == NULL) {
1737 DEBUG(DEBUG_INFO,("Trying to remove tickle that doesnt exist (array is empty) %s:%u\n",
1738 ctdb_addr_to_str(&conn->dst_addr),
1739 ntohs(conn->dst_addr.ip.sin_port)));
1744 /* See if we know this connection
1745 if we dont know this connection then we dont need to do anything
1747 tcpp = ctdb_tcp_find(vnn->tcp_array, conn);
1749 DEBUG(DEBUG_INFO,("Trying to remove tickle that doesnt exist %s:%u\n",
1750 ctdb_addr_to_str(&conn->dst_addr),
1751 ntohs(conn->dst_addr.ip.sin_port)));
1756 /* We need to remove this entry from the array.
1757 Instead of allocating a new array and copying data to it
1758 we cheat and just copy the last entry in the existing array
1759 to the entry that is to be removed and just shring the
1762 *tcpp = vnn->tcp_array->connections[vnn->tcp_array->num - 1];
1763 vnn->tcp_array->num--;
1765 /* If we deleted the last entry we also need to remove the entire array
1767 if (vnn->tcp_array->num == 0) {
1768 talloc_free(vnn->tcp_array);
1769 vnn->tcp_array = NULL;
1772 vnn->tcp_update_needed = true;
1774 DEBUG(DEBUG_INFO,("Removed tickle info for %s:%u\n",
1775 ctdb_addr_to_str(&conn->src_addr),
1776 ntohs(conn->src_addr.ip.sin_port)));
1781 called when a daemon restarts - send all tickes for all public addresses
1782 we are serving immediately to the new node.
1784 int32_t ctdb_control_startup(struct ctdb_context *ctdb, uint32_t vnn)
1786 /*XXX here we should send all tickes we are serving to the new node */
1792 called when a client structure goes away - hook to remove
1793 elements from the tcp_list in all daemons
1795 void ctdb_takeover_client_destructor_hook(struct ctdb_client *client)
1797 while (client->tcp_list) {
1798 struct ctdb_tcp_list *tcp = client->tcp_list;
1799 DLIST_REMOVE(client->tcp_list, tcp);
1800 ctdb_remove_tcp_connection(client->ctdb, &tcp->connection);
1806 release all IPs on shutdown
1808 void ctdb_release_all_ips(struct ctdb_context *ctdb)
1810 struct ctdb_vnn *vnn;
1812 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
1813 if (!ctdb_sys_have_ip(&vnn->public_address)) {
1814 ctdb_vnn_unassign_iface(ctdb, vnn);
1820 ctdb_event_script_args(ctdb, CTDB_EVENT_RELEASE_IP, "%s %s %u",
1821 ctdb_vnn_iface_string(vnn),
1822 ctdb_addr_to_str(&vnn->public_address),
1823 vnn->public_netmask_bits);
1824 release_kill_clients(ctdb, &vnn->public_address);
1825 ctdb_vnn_unassign_iface(ctdb, vnn);
1831 get list of public IPs
1833 int32_t ctdb_control_get_public_ips(struct ctdb_context *ctdb,
1834 struct ctdb_req_control *c, TDB_DATA *outdata)
1837 struct ctdb_all_public_ips *ips;
1838 struct ctdb_vnn *vnn;
1839 bool only_available = false;
1841 if (c->flags & CTDB_PUBLIC_IP_FLAGS_ONLY_AVAILABLE) {
1842 only_available = true;
1845 /* count how many public ip structures we have */
1847 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
1851 len = offsetof(struct ctdb_all_public_ips, ips) +
1852 num*sizeof(struct ctdb_public_ip);
1853 ips = talloc_zero_size(outdata, len);
1854 CTDB_NO_MEMORY(ctdb, ips);
1857 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
1858 if (only_available && !ctdb_vnn_available(ctdb, vnn)) {
1861 ips->ips[i].pnn = vnn->pnn;
1862 ips->ips[i].addr = vnn->public_address;
1866 len = offsetof(struct ctdb_all_public_ips, ips) +
1867 i*sizeof(struct ctdb_public_ip);
1869 outdata->dsize = len;
1870 outdata->dptr = (uint8_t *)ips;
1877 get list of public IPs, old ipv4 style. only returns ipv4 addresses
1879 int32_t ctdb_control_get_public_ipsv4(struct ctdb_context *ctdb,
1880 struct ctdb_req_control *c, TDB_DATA *outdata)
1883 struct ctdb_all_public_ipsv4 *ips;
1884 struct ctdb_vnn *vnn;
1886 /* count how many public ip structures we have */
1888 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
1889 if (vnn->public_address.sa.sa_family != AF_INET) {
1895 len = offsetof(struct ctdb_all_public_ipsv4, ips) +
1896 num*sizeof(struct ctdb_public_ipv4);
1897 ips = talloc_zero_size(outdata, len);
1898 CTDB_NO_MEMORY(ctdb, ips);
1900 outdata->dsize = len;
1901 outdata->dptr = (uint8_t *)ips;
1905 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
1906 if (vnn->public_address.sa.sa_family != AF_INET) {
1909 ips->ips[i].pnn = vnn->pnn;
1910 ips->ips[i].sin = vnn->public_address.ip;
1917 int32_t ctdb_control_get_public_ip_info(struct ctdb_context *ctdb,
1918 struct ctdb_req_control *c,
1923 ctdb_sock_addr *addr;
1924 struct ctdb_control_public_ip_info *info;
1925 struct ctdb_vnn *vnn;
1927 addr = (ctdb_sock_addr *)indata.dptr;
1929 vnn = find_public_ip_vnn(ctdb, addr);
1931 /* if it is not a public ip it could be our 'single ip' */
1932 if (ctdb->single_ip_vnn) {
1933 if (ctdb_same_ip(&ctdb->single_ip_vnn->public_address, addr)) {
1934 vnn = ctdb->single_ip_vnn;
1939 DEBUG(DEBUG_ERR,(__location__ " Could not get public ip info, "
1940 "'%s'not a public address\n",
1941 ctdb_addr_to_str(addr)));
1945 /* count how many public ip structures we have */
1947 for (;vnn->ifaces[num];) {
1951 len = offsetof(struct ctdb_control_public_ip_info, ifaces) +
1952 num*sizeof(struct ctdb_control_iface_info);
1953 info = talloc_zero_size(outdata, len);
1954 CTDB_NO_MEMORY(ctdb, info);
1956 info->ip.addr = vnn->public_address;
1957 info->ip.pnn = vnn->pnn;
1958 info->active_idx = 0xFFFFFFFF;
1960 for (i=0; vnn->ifaces[i]; i++) {
1961 struct ctdb_iface *cur;
1963 cur = ctdb_find_iface(ctdb, vnn->ifaces[i]);
1965 DEBUG(DEBUG_CRIT, (__location__ " internal error iface[%s] unknown\n",
1969 if (vnn->iface == cur) {
1970 info->active_idx = i;
1972 strcpy(info->ifaces[i].name, cur->name);
1973 info->ifaces[i].link_state = cur->link_up;
1974 info->ifaces[i].references = cur->references;
1977 len = offsetof(struct ctdb_control_public_ip_info, ifaces) +
1978 i*sizeof(struct ctdb_control_iface_info);
1980 outdata->dsize = len;
1981 outdata->dptr = (uint8_t *)info;
1986 int32_t ctdb_control_get_ifaces(struct ctdb_context *ctdb,
1987 struct ctdb_req_control *c,
1991 struct ctdb_control_get_ifaces *ifaces;
1992 struct ctdb_iface *cur;
1994 /* count how many public ip structures we have */
1996 for (cur=ctdb->ifaces;cur;cur=cur->next) {
2000 len = offsetof(struct ctdb_control_get_ifaces, ifaces) +
2001 num*sizeof(struct ctdb_control_iface_info);
2002 ifaces = talloc_zero_size(outdata, len);
2003 CTDB_NO_MEMORY(ctdb, ifaces);
2006 for (cur=ctdb->ifaces;cur;cur=cur->next) {
2007 strcpy(ifaces->ifaces[i].name, cur->name);
2008 ifaces->ifaces[i].link_state = cur->link_up;
2009 ifaces->ifaces[i].references = cur->references;
2013 len = offsetof(struct ctdb_control_get_ifaces, ifaces) +
2014 i*sizeof(struct ctdb_control_iface_info);
2016 outdata->dsize = len;
2017 outdata->dptr = (uint8_t *)ifaces;
2022 int32_t ctdb_control_set_iface_link(struct ctdb_context *ctdb,
2023 struct ctdb_req_control *c,
2026 struct ctdb_control_iface_info *info;
2027 struct ctdb_iface *iface;
2028 bool link_up = false;
2030 info = (struct ctdb_control_iface_info *)indata.dptr;
2032 if (info->name[CTDB_IFACE_SIZE] != '\0') {
2033 int len = strnlen(info->name, CTDB_IFACE_SIZE);
2034 DEBUG(DEBUG_ERR, (__location__ " name[%*.*s] not terminated\n",
2035 len, len, info->name));
2039 switch (info->link_state) {
2047 DEBUG(DEBUG_ERR, (__location__ " link_state[%u] invalid\n",
2048 (unsigned int)info->link_state));
2052 if (info->references != 0) {
2053 DEBUG(DEBUG_ERR, (__location__ " references[%u] should be 0\n",
2054 (unsigned int)info->references));
2058 iface = ctdb_find_iface(ctdb, info->name);
2059 if (iface == NULL) {
2060 DEBUG(DEBUG_ERR, (__location__ "iface[%s] is unknown\n",
2065 if (link_up == iface->link_up) {
2069 DEBUG(iface->link_up?DEBUG_ERR:DEBUG_NOTICE,
2070 ("iface[%s] has changed it's link status %s => %s\n",
2072 iface->link_up?"up":"down",
2073 link_up?"up":"down"));
2075 iface->link_up = link_up;
2081 structure containing the listening socket and the list of tcp connections
2082 that the ctdb daemon is to kill
2084 struct ctdb_kill_tcp {
2085 struct ctdb_vnn *vnn;
2086 struct ctdb_context *ctdb;
2088 struct fd_event *fde;
2089 trbt_tree_t *connections;
2094 a tcp connection that is to be killed
2096 struct ctdb_killtcp_con {
2097 ctdb_sock_addr src_addr;
2098 ctdb_sock_addr dst_addr;
2100 struct ctdb_kill_tcp *killtcp;
2103 /* this function is used to create a key to represent this socketpair
2104 in the killtcp tree.
2105 this key is used to insert and lookup matching socketpairs that are
2106 to be tickled and RST
2108 #define KILLTCP_KEYLEN 10
2109 static uint32_t *killtcp_key(ctdb_sock_addr *src, ctdb_sock_addr *dst)
2111 static uint32_t key[KILLTCP_KEYLEN];
2113 bzero(key, sizeof(key));
2115 if (src->sa.sa_family != dst->sa.sa_family) {
2116 DEBUG(DEBUG_ERR, (__location__ " ERROR, different families passed :%u vs %u\n", src->sa.sa_family, dst->sa.sa_family));
2120 switch (src->sa.sa_family) {
2122 key[0] = dst->ip.sin_addr.s_addr;
2123 key[1] = src->ip.sin_addr.s_addr;
2124 key[2] = dst->ip.sin_port;
2125 key[3] = src->ip.sin_port;
2128 key[0] = dst->ip6.sin6_addr.s6_addr32[3];
2129 key[1] = src->ip6.sin6_addr.s6_addr32[3];
2130 key[2] = dst->ip6.sin6_addr.s6_addr32[2];
2131 key[3] = src->ip6.sin6_addr.s6_addr32[2];
2132 key[4] = dst->ip6.sin6_addr.s6_addr32[1];
2133 key[5] = src->ip6.sin6_addr.s6_addr32[1];
2134 key[6] = dst->ip6.sin6_addr.s6_addr32[0];
2135 key[7] = src->ip6.sin6_addr.s6_addr32[0];
2136 key[8] = dst->ip6.sin6_port;
2137 key[9] = src->ip6.sin6_port;
2140 DEBUG(DEBUG_ERR, (__location__ " ERROR, unknown family passed :%u\n", src->sa.sa_family));
2148 called when we get a read event on the raw socket
2150 static void capture_tcp_handler(struct event_context *ev, struct fd_event *fde,
2151 uint16_t flags, void *private_data)
2153 struct ctdb_kill_tcp *killtcp = talloc_get_type(private_data, struct ctdb_kill_tcp);
2154 struct ctdb_killtcp_con *con;
2155 ctdb_sock_addr src, dst;
2156 uint32_t ack_seq, seq;
2158 if (!(flags & EVENT_FD_READ)) {
2162 if (ctdb_sys_read_tcp_packet(killtcp->capture_fd,
2163 killtcp->private_data,
2165 &ack_seq, &seq) != 0) {
2166 /* probably a non-tcp ACK packet */
2170 /* check if we have this guy in our list of connections
2173 con = trbt_lookuparray32(killtcp->connections,
2174 KILLTCP_KEYLEN, killtcp_key(&src, &dst));
2176 /* no this was some other packet we can just ignore */
2180 /* This one has been tickled !
2181 now reset him and remove him from the list.
2183 DEBUG(DEBUG_INFO, ("sending a tcp reset to kill connection :%d -> %s:%d\n",
2184 ntohs(con->dst_addr.ip.sin_port),
2185 ctdb_addr_to_str(&con->src_addr),
2186 ntohs(con->src_addr.ip.sin_port)));
2188 ctdb_sys_send_tcp(&con->dst_addr, &con->src_addr, ack_seq, seq, 1);
2193 /* when traversing the list of all tcp connections to send tickle acks to
2194 (so that we can capture the ack coming back and kill the connection
2196 this callback is called for each connection we are currently trying to kill
2198 static void tickle_connection_traverse(void *param, void *data)
2200 struct ctdb_killtcp_con *con = talloc_get_type(data, struct ctdb_killtcp_con);
2202 /* have tried too many times, just give up */
2203 if (con->count >= 5) {
2208 /* othervise, try tickling it again */
2211 (ctdb_sock_addr *)&con->dst_addr,
2212 (ctdb_sock_addr *)&con->src_addr,
2218 called every second until all sentenced connections have been reset
2220 static void ctdb_tickle_sentenced_connections(struct event_context *ev, struct timed_event *te,
2221 struct timeval t, void *private_data)
2223 struct ctdb_kill_tcp *killtcp = talloc_get_type(private_data, struct ctdb_kill_tcp);
2226 /* loop over all connections sending tickle ACKs */
2227 trbt_traversearray32(killtcp->connections, KILLTCP_KEYLEN, tickle_connection_traverse, NULL);
2230 /* If there are no more connections to kill we can remove the
2231 entire killtcp structure
2233 if ( (killtcp->connections == NULL) ||
2234 (killtcp->connections->root == NULL) ) {
2235 talloc_free(killtcp);
2239 /* try tickling them again in a seconds time
2241 event_add_timed(killtcp->ctdb->ev, killtcp, timeval_current_ofs(1, 0),
2242 ctdb_tickle_sentenced_connections, killtcp);
2246 destroy the killtcp structure
2248 static int ctdb_killtcp_destructor(struct ctdb_kill_tcp *killtcp)
2250 killtcp->vnn->killtcp = NULL;
2255 /* nothing fancy here, just unconditionally replace any existing
2256 connection structure with the new one.
2258 dont even free the old one if it did exist, that one is talloc_stolen
2259 by the same node in the tree anyway and will be deleted when the new data
2262 static void *add_killtcp_callback(void *parm, void *data)
2268 add a tcp socket to the list of connections we want to RST
2270 static int ctdb_killtcp_add_connection(struct ctdb_context *ctdb,
2274 ctdb_sock_addr src, dst;
2275 struct ctdb_kill_tcp *killtcp;
2276 struct ctdb_killtcp_con *con;
2277 struct ctdb_vnn *vnn;
2279 ctdb_canonicalize_ip(s, &src);
2280 ctdb_canonicalize_ip(d, &dst);
2282 vnn = find_public_ip_vnn(ctdb, &dst);
2284 vnn = find_public_ip_vnn(ctdb, &src);
2287 /* if it is not a public ip it could be our 'single ip' */
2288 if (ctdb->single_ip_vnn) {
2289 if (ctdb_same_ip(&ctdb->single_ip_vnn->public_address, &dst)) {
2290 vnn = ctdb->single_ip_vnn;
2295 DEBUG(DEBUG_ERR,(__location__ " Could not killtcp, not a public address\n"));
2299 killtcp = vnn->killtcp;
2301 /* If this is the first connection to kill we must allocate
2304 if (killtcp == NULL) {
2305 killtcp = talloc_zero(ctdb, struct ctdb_kill_tcp);
2306 CTDB_NO_MEMORY(ctdb, killtcp);
2309 killtcp->ctdb = ctdb;
2310 killtcp->capture_fd = -1;
2311 killtcp->connections = trbt_create(killtcp, 0);
2313 vnn->killtcp = killtcp;
2314 talloc_set_destructor(killtcp, ctdb_killtcp_destructor);
2319 /* create a structure that describes this connection we want to
2320 RST and store it in killtcp->connections
2322 con = talloc(killtcp, struct ctdb_killtcp_con);
2323 CTDB_NO_MEMORY(ctdb, con);
2324 con->src_addr = src;
2325 con->dst_addr = dst;
2327 con->killtcp = killtcp;
2330 trbt_insertarray32_callback(killtcp->connections,
2331 KILLTCP_KEYLEN, killtcp_key(&con->dst_addr, &con->src_addr),
2332 add_killtcp_callback, con);
2335 If we dont have a socket to listen on yet we must create it
2337 if (killtcp->capture_fd == -1) {
2338 const char *iface = ctdb_vnn_iface_string(vnn);
2339 killtcp->capture_fd = ctdb_sys_open_capture_socket(iface, &killtcp->private_data);
2340 if (killtcp->capture_fd == -1) {
2341 DEBUG(DEBUG_CRIT,(__location__ " Failed to open capturing "
2342 "socket on iface '%s' for killtcp (%s)\n",
2343 iface, strerror(errno)));
2349 if (killtcp->fde == NULL) {
2350 killtcp->fde = event_add_fd(ctdb->ev, killtcp, killtcp->capture_fd,
2351 EVENT_FD_READ | EVENT_FD_AUTOCLOSE,
2352 capture_tcp_handler, killtcp);
2354 /* We also need to set up some events to tickle all these connections
2355 until they are all reset
2357 event_add_timed(ctdb->ev, killtcp, timeval_current_ofs(1, 0),
2358 ctdb_tickle_sentenced_connections, killtcp);
2361 /* tickle him once now */
2370 talloc_free(vnn->killtcp);
2371 vnn->killtcp = NULL;
2376 kill a TCP connection.
2378 int32_t ctdb_control_kill_tcp(struct ctdb_context *ctdb, TDB_DATA indata)
2380 struct ctdb_control_killtcp *killtcp = (struct ctdb_control_killtcp *)indata.dptr;
2382 return ctdb_killtcp_add_connection(ctdb, &killtcp->src_addr, &killtcp->dst_addr);
2386 called by a daemon to inform us of the entire list of TCP tickles for
2387 a particular public address.
2388 this control should only be sent by the node that is currently serving
2389 that public address.
2391 int32_t ctdb_control_set_tcp_tickle_list(struct ctdb_context *ctdb, TDB_DATA indata)
2393 struct ctdb_control_tcp_tickle_list *list = (struct ctdb_control_tcp_tickle_list *)indata.dptr;
2394 struct ctdb_tcp_array *tcparray;
2395 struct ctdb_vnn *vnn;
2397 /* We must at least have tickles.num or else we cant verify the size
2398 of the received data blob
2400 if (indata.dsize < offsetof(struct ctdb_control_tcp_tickle_list,
2401 tickles.connections)) {
2402 DEBUG(DEBUG_ERR,("Bad indata in ctdb_control_set_tcp_tickle_list. Not enough data for the tickle.num field\n"));
2406 /* verify that the size of data matches what we expect */
2407 if (indata.dsize < offsetof(struct ctdb_control_tcp_tickle_list,
2408 tickles.connections)
2409 + sizeof(struct ctdb_tcp_connection)
2410 * list->tickles.num) {
2411 DEBUG(DEBUG_ERR,("Bad indata in ctdb_control_set_tcp_tickle_list\n"));
2415 vnn = find_public_ip_vnn(ctdb, &list->addr);
2417 DEBUG(DEBUG_INFO,(__location__ " Could not set tcp tickle list, '%s' is not a public address\n",
2418 ctdb_addr_to_str(&list->addr)));
2423 /* remove any old ticklelist we might have */
2424 talloc_free(vnn->tcp_array);
2425 vnn->tcp_array = NULL;
2427 tcparray = talloc(ctdb->nodes, struct ctdb_tcp_array);
2428 CTDB_NO_MEMORY(ctdb, tcparray);
2430 tcparray->num = list->tickles.num;
2432 tcparray->connections = talloc_array(tcparray, struct ctdb_tcp_connection, tcparray->num);
2433 CTDB_NO_MEMORY(ctdb, tcparray->connections);
2435 memcpy(tcparray->connections, &list->tickles.connections[0],
2436 sizeof(struct ctdb_tcp_connection)*tcparray->num);
2438 /* We now have a new fresh tickle list array for this vnn */
2439 vnn->tcp_array = talloc_steal(vnn, tcparray);
2445 called to return the full list of tickles for the puclic address associated
2446 with the provided vnn
2448 int32_t ctdb_control_get_tcp_tickle_list(struct ctdb_context *ctdb, TDB_DATA indata, TDB_DATA *outdata)
2450 ctdb_sock_addr *addr = (ctdb_sock_addr *)indata.dptr;
2451 struct ctdb_control_tcp_tickle_list *list;
2452 struct ctdb_tcp_array *tcparray;
2454 struct ctdb_vnn *vnn;
2456 vnn = find_public_ip_vnn(ctdb, addr);
2458 DEBUG(DEBUG_ERR,(__location__ " Could not get tcp tickle list, '%s' is not a public address\n",
2459 ctdb_addr_to_str(addr)));
2464 tcparray = vnn->tcp_array;
2466 num = tcparray->num;
2471 outdata->dsize = offsetof(struct ctdb_control_tcp_tickle_list,
2472 tickles.connections)
2473 + sizeof(struct ctdb_tcp_connection) * num;
2475 outdata->dptr = talloc_size(outdata, outdata->dsize);
2476 CTDB_NO_MEMORY(ctdb, outdata->dptr);
2477 list = (struct ctdb_control_tcp_tickle_list *)outdata->dptr;
2480 list->tickles.num = num;
2482 memcpy(&list->tickles.connections[0], tcparray->connections,
2483 sizeof(struct ctdb_tcp_connection) * num);
2491 set the list of all tcp tickles for a public address
2493 static int ctdb_ctrl_set_tcp_tickles(struct ctdb_context *ctdb,
2494 struct timeval timeout, uint32_t destnode,
2495 ctdb_sock_addr *addr,
2496 struct ctdb_tcp_array *tcparray)
2500 struct ctdb_control_tcp_tickle_list *list;
2503 num = tcparray->num;
2508 data.dsize = offsetof(struct ctdb_control_tcp_tickle_list,
2509 tickles.connections) +
2510 sizeof(struct ctdb_tcp_connection) * num;
2511 data.dptr = talloc_size(ctdb, data.dsize);
2512 CTDB_NO_MEMORY(ctdb, data.dptr);
2514 list = (struct ctdb_control_tcp_tickle_list *)data.dptr;
2516 list->tickles.num = num;
2518 memcpy(&list->tickles.connections[0], tcparray->connections, sizeof(struct ctdb_tcp_connection) * num);
2521 ret = ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_CONNECTED, 0,
2522 CTDB_CONTROL_SET_TCP_TICKLE_LIST,
2523 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL);
2525 DEBUG(DEBUG_ERR,(__location__ " ctdb_control for set tcp tickles failed\n"));
2529 talloc_free(data.dptr);
2536 perform tickle updates if required
2538 static void ctdb_update_tcp_tickles(struct event_context *ev,
2539 struct timed_event *te,
2540 struct timeval t, void *private_data)
2542 struct ctdb_context *ctdb = talloc_get_type(private_data, struct ctdb_context);
2544 struct ctdb_vnn *vnn;
2546 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
2547 /* we only send out updates for public addresses that
2550 if (ctdb->pnn != vnn->pnn) {
2553 /* We only send out the updates if we need to */
2554 if (!vnn->tcp_update_needed) {
2557 ret = ctdb_ctrl_set_tcp_tickles(ctdb,
2559 CTDB_BROADCAST_CONNECTED,
2560 &vnn->public_address,
2563 DEBUG(DEBUG_ERR,("Failed to send the tickle update for public address %s\n",
2564 ctdb_addr_to_str(&vnn->public_address)));
2568 event_add_timed(ctdb->ev, ctdb->tickle_update_context,
2569 timeval_current_ofs(ctdb->tunable.tickle_update_interval, 0),
2570 ctdb_update_tcp_tickles, ctdb);
2575 start periodic update of tcp tickles
2577 void ctdb_start_tcp_tickle_update(struct ctdb_context *ctdb)
2579 ctdb->tickle_update_context = talloc_new(ctdb);
2581 event_add_timed(ctdb->ev, ctdb->tickle_update_context,
2582 timeval_current_ofs(ctdb->tunable.tickle_update_interval, 0),
2583 ctdb_update_tcp_tickles, ctdb);
2589 struct control_gratious_arp {
2590 struct ctdb_context *ctdb;
2591 ctdb_sock_addr addr;
2597 send a control_gratuitous arp
2599 static void send_gratious_arp(struct event_context *ev, struct timed_event *te,
2600 struct timeval t, void *private_data)
2603 struct control_gratious_arp *arp = talloc_get_type(private_data,
2604 struct control_gratious_arp);
2606 ret = ctdb_sys_send_arp(&arp->addr, arp->iface);
2608 DEBUG(DEBUG_ERR,(__location__ " sending of gratious arp on iface '%s' failed (%s)\n",
2609 arp->iface, strerror(errno)));
2614 if (arp->count == CTDB_ARP_REPEAT) {
2619 event_add_timed(arp->ctdb->ev, arp,
2620 timeval_current_ofs(CTDB_ARP_INTERVAL, 0),
2621 send_gratious_arp, arp);
2628 int32_t ctdb_control_send_gratious_arp(struct ctdb_context *ctdb, TDB_DATA indata)
2630 struct ctdb_control_gratious_arp *gratious_arp = (struct ctdb_control_gratious_arp *)indata.dptr;
2631 struct control_gratious_arp *arp;
2633 /* verify the size of indata */
2634 if (indata.dsize < offsetof(struct ctdb_control_gratious_arp, iface)) {
2635 DEBUG(DEBUG_ERR,(__location__ " Too small indata to hold a ctdb_control_gratious_arp structure. Got %u require %u bytes\n",
2636 (unsigned)indata.dsize,
2637 (unsigned)offsetof(struct ctdb_control_gratious_arp, iface)));
2641 ( offsetof(struct ctdb_control_gratious_arp, iface)
2642 + gratious_arp->len ) ){
2644 DEBUG(DEBUG_ERR,(__location__ " Wrong size of indata. Was %u bytes "
2645 "but should be %u bytes\n",
2646 (unsigned)indata.dsize,
2647 (unsigned)(offsetof(struct ctdb_control_gratious_arp, iface)+gratious_arp->len)));
2652 arp = talloc(ctdb, struct control_gratious_arp);
2653 CTDB_NO_MEMORY(ctdb, arp);
2656 arp->addr = gratious_arp->addr;
2657 arp->iface = talloc_strdup(arp, gratious_arp->iface);
2658 CTDB_NO_MEMORY(ctdb, arp->iface);
2661 event_add_timed(arp->ctdb->ev, arp,
2662 timeval_zero(), send_gratious_arp, arp);
2667 int32_t ctdb_control_add_public_address(struct ctdb_context *ctdb, TDB_DATA indata)
2669 struct ctdb_control_ip_iface *pub = (struct ctdb_control_ip_iface *)indata.dptr;
2672 /* verify the size of indata */
2673 if (indata.dsize < offsetof(struct ctdb_control_ip_iface, iface)) {
2674 DEBUG(DEBUG_ERR,(__location__ " Too small indata to hold a ctdb_control_ip_iface structure\n"));
2678 ( offsetof(struct ctdb_control_ip_iface, iface)
2681 DEBUG(DEBUG_ERR,(__location__ " Wrong size of indata. Was %u bytes "
2682 "but should be %u bytes\n",
2683 (unsigned)indata.dsize,
2684 (unsigned)(offsetof(struct ctdb_control_ip_iface, iface)+pub->len)));
2688 ret = ctdb_add_public_address(ctdb, &pub->addr, pub->mask, &pub->iface[0]);
2691 DEBUG(DEBUG_ERR,(__location__ " Failed to add public address\n"));
2699 called when releaseip event finishes for del_public_address
2701 static void delete_ip_callback(struct ctdb_context *ctdb, int status,
2704 talloc_free(private_data);
2707 int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, TDB_DATA indata)
2709 struct ctdb_control_ip_iface *pub = (struct ctdb_control_ip_iface *)indata.dptr;
2710 struct ctdb_vnn *vnn;
2713 /* verify the size of indata */
2714 if (indata.dsize < offsetof(struct ctdb_control_ip_iface, iface)) {
2715 DEBUG(DEBUG_ERR,(__location__ " Too small indata to hold a ctdb_control_ip_iface structure\n"));
2719 ( offsetof(struct ctdb_control_ip_iface, iface)
2722 DEBUG(DEBUG_ERR,(__location__ " Wrong size of indata. Was %u bytes "
2723 "but should be %u bytes\n",
2724 (unsigned)indata.dsize,
2725 (unsigned)(offsetof(struct ctdb_control_ip_iface, iface)+pub->len)));
2729 /* walk over all public addresses until we find a match */
2730 for (vnn=ctdb->vnn;vnn;vnn=vnn->next) {
2731 if (ctdb_same_ip(&vnn->public_address, &pub->addr)) {
2732 TALLOC_CTX *mem_ctx;
2734 DLIST_REMOVE(ctdb->vnn, vnn);
2735 if (vnn->iface == NULL) {
2740 mem_ctx = talloc_new(ctdb);
2741 ret = ctdb_event_script_callback(ctdb,
2742 mem_ctx, delete_ip_callback, mem_ctx,
2744 CTDB_EVENT_RELEASE_IP,
2746 ctdb_vnn_iface_string(vnn),
2747 ctdb_addr_to_str(&vnn->public_address),
2748 vnn->public_netmask_bits);
2749 ctdb_vnn_unassign_iface(ctdb, vnn);