]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
call kill_clients when releasing all IPs, as well as for individual IPs
authorAndrew Tridgell <tridge@samba.org>
Sun, 8 Jul 2007 10:45:12 +0000 (20:45 +1000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 8 Jul 2007 10:45:12 +0000 (20:45 +1000)
(This used to be ctdb commit ad68904720eb69757601589b06726190321685ac)

ctdb/server/ctdb_takeover.c

index 71a0b3dd1d8ef036fd42c622bf5d3d8e6ffa7522..0b5d9d6b8916138c20f003d95f1cf3bb3ab7155f 100644 (file)
@@ -224,19 +224,19 @@ int32_t ctdb_control_takeover_ip(struct ctdb_context *ctdb,
 /*
   kill any clients that are registered with a IP that is being released
  */
-static void release_kill_clients(struct ctdb_context *ctdb, struct sockaddr_in *sin)
+static void release_kill_clients(struct ctdb_context *ctdb, struct in_addr in)
 {
        struct ctdb_client_ip *ip;
 
        for (ip=ctdb->client_ip_list; ip; ip=ip->next) {
-               if (ip->ip.sin_addr.s_addr == sin->sin_addr.s_addr) {
+               if (ip->ip.sin_addr.s_addr == in.s_addr) {
                        struct ctdb_client *client = ctdb_reqid_find(ctdb, 
                                                                     ip->client_id, 
                                                                     struct ctdb_client);
                        if (client->pid != 0) {
                                DEBUG(0,(__location__ " Killing client pid %u for IP %s on client_id %u\n",
-                                        (unsigned)client->pid, inet_ntoa(sin->sin_addr),
-                                             ip->client_id));
+                                        (unsigned)client->pid, inet_ntoa(in),
+                                        ip->client_id));
                                kill(client->pid, SIGKILL);
                        }
                }
@@ -266,7 +266,7 @@ static void release_ip_callback(struct ctdb_context *ctdb, int status,
        ctdb_daemon_send_message(ctdb, ctdb->vnn, CTDB_SRVID_RELEASE_IP, data);
 
        /* kill clients that have registered with this IP */
-       release_kill_clients(ctdb, state->sin);
+       release_kill_clients(ctdb, state->sin->sin_addr);
        
 
        /* tell other nodes about any tcp connections we were holding with this IP */
@@ -780,10 +780,14 @@ void ctdb_release_all_ips(struct ctdb_context *ctdb)
        for (i=0;i<ctdb->num_nodes;i++) {
                struct ctdb_node *node = ctdb->nodes[i];
                if (ctdb_sys_have_ip(node->public_address)) {
+                       struct in_addr in;
                        ctdb_event_script(ctdb, "releaseip %s %s %u",
                                          ctdb->takeover.interface, 
                                          node->public_address,
                                          node->public_netmask_bits);
+                       if (inet_aton(node->public_address, &in) == 0) {
+                               release_kill_clients(ctdb, in);
+                       }
                }
        }
 }