]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ctdb-daemon: Avoid spurious error sending ARPs for released IP
authorMartin Schwenke <martin@meltin.net>
Thu, 23 Jun 2022 04:30:34 +0000 (14:30 +1000)
committerAmitay Isaacs <amitay@samba.org>
Fri, 22 Jul 2022 16:09:31 +0000 (16:09 +0000)
A public IP address can be released in between (and probably before)
attempts to send ARPs.  One situation when this can occur is when a
cluster is shutting down: node A shuts down first, public IPs from
node A are taken over by node B, node B is shutdown.

Notice this when it occurs and cancel further attempts to send ARPs.

Signed-off-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Amitay Isaacs <amitay@gmail.com>
ctdb/server/ctdb_takeover.c

index 99efb0af356b69c583633872108652b6072d7ecb..81c733a9c486032dcfc04ce416d51efd007b8033 100644 (file)
@@ -373,8 +373,17 @@ static void ctdb_control_send_arp(struct tevent_context *ev,
                                                        struct ctdb_takeover_arp);
        int ret;
        struct ctdb_tcp_array *tcparray;
-       const char *iface = ctdb_vnn_iface_string(arp->vnn);
+       const char *iface;
+
+       /* IP address might have been released between sends */
+       if (arp->vnn->iface == NULL) {
+               DBG_INFO("Cancelling ARP send for released IP %s\n",
+                        ctdb_addr_to_str(&arp->vnn->public_address));
+               talloc_free(arp);
+               return;
+       }
 
+       iface = ctdb_vnn_iface_string(arp->vnn);
        ret = ctdb_sys_send_arp(&arp->addr, iface);
        if (ret != 0) {
                DBG_ERR("Failed to send ARP on interface %s: %s\n",