The branch, master has been updated
       via  2a52336ec021dfe8d56ba72726feb7b2dbd41f68 (commit)
       via  d350c631850377c09968d2978ef57d2bd0d50116 (commit)
       via  0ca28d7336463ecd2ff65620d8dbcbb496991531 (commit)
       via  6318ea13464e2fe630084c40802d8e697c2cb999 (commit)
       via  4d5d22e64270cfb31be6acd71f4f97ec43df5b2c (commit)
      from  7eb137aa4c24c69bd93b98fb3c7108e5f3288ebd (commit)

http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2a52336ec021dfe8d56ba72726feb7b2dbd41f68
Author: Ronnie Sahlberg <[email protected]>
Date:   Tue Jun 9 10:58:46 2009 +1000

    remove unused variable

commit d350c631850377c09968d2978ef57d2bd0d50116
Author: Ronnie Sahlberg <[email protected]>
Date:   Tue Jun 9 10:57:46 2009 +1000

    dont require particular values for NoIPFailback and DeterministicIPs when
    using ctdb moveip

commit 0ca28d7336463ecd2ff65620d8dbcbb496991531
Author: Ronnie Sahlberg <[email protected]>
Date:   Tue Jun 9 10:56:50 2009 +1000

    improve ctdb moveip so that it does not always trigger a recovery.

commit 6318ea13464e2fe630084c40802d8e697c2cb999
Author: Ronnie Sahlberg <[email protected]>
Date:   Fri Jun 5 17:57:14 2009 +1000

    try avoiding to cause a recovery when deleting a public ip from a node

commit 4d5d22e64270cfb31be6acd71f4f97ec43df5b2c
Author: Ronnie Sahlberg <[email protected]>
Date:   Fri Jun 5 17:00:47 2009 +1000

    when adding an ip, try manually adding and takingover the ip instead of 
triggering a full recovery to do the same thing

-----------------------------------------------------------------------

Summary of changes:
 server/ctdb_takeover.c |   11 +++-
 tools/ctdb.c           |  138 ++++++++++++++++++++++++------------------------
 2 files changed, 78 insertions(+), 71 deletions(-)


Changeset truncated at 500 lines:

diff --git a/server/ctdb_takeover.c b/server/ctdb_takeover.c
index 21f7dc8..5cd711d 100644
--- a/server/ctdb_takeover.c
+++ b/server/ctdb_takeover.c
@@ -2021,7 +2021,7 @@ int32_t ctdb_control_send_gratious_arp(struct 
ctdb_context *ctdb, TDB_DATA indat
 int32_t ctdb_control_add_public_address(struct ctdb_context *ctdb, TDB_DATA 
indata)
 {
        struct ctdb_control_ip_iface *pub = (struct ctdb_control_ip_iface 
*)indata.dptr;
-
+       int ret;
 
        /* verify the size of indata */
        if (indata.dsize < offsetof(struct ctdb_control_ip_iface, iface)) {
@@ -2039,7 +2039,14 @@ int32_t ctdb_control_add_public_address(struct 
ctdb_context *ctdb, TDB_DATA inda
                return -1;
        }
 
-       return ctdb_add_public_address(ctdb, &pub->addr, pub->mask, 
&pub->iface[0]);
+       ret = ctdb_add_public_address(ctdb, &pub->addr, pub->mask, 
&pub->iface[0]);
+
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR,(__location__ " Failed to add public 
address\n"));
+               return -1;
+       }
+
+       return 0;
 }
 
 /*
diff --git a/tools/ctdb.c b/tools/ctdb.c
index 52eed0a..589533b 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -791,39 +791,6 @@ static int control_get_tickles(struct ctdb_context *ctdb, 
int argc, const char *
        return 0;
 }
 
-/* send a release ip to all nodes */
-static int control_send_release(struct ctdb_context *ctdb, uint32_t pnn,
-ctdb_sock_addr *addr)
-{
-       int ret;
-       struct ctdb_public_ip pip;
-       TDB_DATA data;
-       struct ctdb_node_map *nodemap=NULL;
-
-       ret = ctdb_ctrl_getnodemap(ctdb, TIMELIMIT(), CTDB_CURRENT_NODE, ctdb, 
&nodemap);
-       if (ret != 0) {
-               DEBUG(DEBUG_ERR, ("Unable to get nodemap from local node\n"));
-               return ret;
-       }
-
-       /* send a moveip message to the recovery master */
-       pip.pnn    = pnn;
-       pip.addr   = *addr;
-       data.dsize = sizeof(pip);
-       data.dptr  = (unsigned char *)&pip;
-
-
-       /* send release ip to all nodes */
-       if (ctdb_client_async_control(ctdb, CTDB_CONTROL_RELEASE_IP,
-                       list_of_active_nodes(ctdb, nodemap, ctdb, true),
-                       TIMELIMIT(), false, data,
-                       NULL, NULL, NULL) != 0) {
-               DEBUG(DEBUG_ERR, (__location__ " Unable to send 'ReleaseIP' to 
all nodes.\n"));
-               return -1;
-       }
-
-       return 0;
-}
 
 /*
   move/failover an ip address to a specific node
@@ -832,49 +799,39 @@ static int control_moveip(struct ctdb_context *ctdb, int 
argc, const char **argv
 {
        uint32_t pnn;
        ctdb_sock_addr addr;
-       uint32_t value;
        struct ctdb_all_public_ips *ips;
+       struct ctdb_public_ip ip;
+       uint32_t *nodes;
        int i, ret;
+       TDB_DATA data;
+       struct ctdb_node_map *nodemap=NULL;
+       TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
 
        if (argc < 2) {
                usage();
+               talloc_free(tmp_ctx);
+               return -1;
        }
 
        if (parse_ip(argv[0], NULL, 0, &addr) == 0) {
                DEBUG(DEBUG_ERR,("Wrongly formed ip address '%s'\n", argv[0]));
+               talloc_free(tmp_ctx);
                return -1;
        }
 
 
        if (sscanf(argv[1], "%u", &pnn) != 1) {
                DEBUG(DEBUG_ERR, ("Badly formed pnn\n"));
+               talloc_free(tmp_ctx);
                return -1;
        }
 
-       ret = ctdb_ctrl_get_tunable(ctdb, TIMELIMIT(), CTDB_CURRENT_NODE, 
"DeterministicIPs", &value);
-       if (ret == -1) {
-               DEBUG(DEBUG_ERR, ("Unable to get tunable variable 
'DeterministicIPs' from local node\n"));
-               return -1;
-       }
-       if (value != 0) {
-               DEBUG(DEBUG_ERR, ("The tunable 'DeterministicIPs' is set. You 
can only move ip addresses when this feature is disabled\n"));
-               return -1;
-       }
-
-       ret = ctdb_ctrl_get_tunable(ctdb, TIMELIMIT(), CTDB_CURRENT_NODE, 
"NoIPFailback", &value);
-       if (ret == -1) {
-               DEBUG(DEBUG_ERR, ("Unable to get tunable variable 
'NoIPFailback' from local node\n"));
-               return -1;
-       }
-       if (value == 0) {
-               DEBUG(DEBUG_ERR, ("The tunable 'NoIPFailback' is NOT set. You 
can only move ip addresses when this feature is enabled\n"));
-               return -1;
-       }
 
        /* read the public ip list from the node */
        ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), pnn, ctdb, &ips);
        if (ret != 0) {
                DEBUG(DEBUG_ERR, ("Unable to get public ip list from node 
%u\n", pnn));
+               talloc_free(tmp_ctx);
                return -1;
        }
 
@@ -886,20 +843,49 @@ static int control_moveip(struct ctdb_context *ctdb, int 
argc, const char **argv
        if (i==ips->num) {
                DEBUG(DEBUG_ERR, ("Node %u can not host ip address '%s'\n",
                        pnn, ctdb_addr_to_str(&addr)));
+               talloc_free(tmp_ctx);
                return -1;
        }
        if (ips->ips[i].pnn == pnn) {
                DEBUG(DEBUG_ERR, ("Host %u is already hosting '%s'\n",
                        pnn, ctdb_addr_to_str(&ips->ips[i].addr)));
+               talloc_free(tmp_ctx);
+               return -1;
+       }
+
+       ip.pnn  = pnn;
+       ip.addr = addr;
+
+       data.dptr  = (uint8_t *)&ip;
+       data.dsize = sizeof(ip);
+
+       ret = ctdb_ctrl_getnodemap(ctdb, TIMELIMIT(), options.pnn, tmp_ctx, 
&nodemap);
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR, ("Unable to get nodemap from node %u\n", 
options.pnn));
+               talloc_free(tmp_ctx);
+               return ret;
+       }
+
+               nodes = list_of_active_nodes(ctdb, nodemap, tmp_ctx, true);
+       ret = ctdb_client_async_control(ctdb, CTDB_CONTROL_RELEASE_IP,
+                                       nodes, TIMELIMIT(),
+                                       false, data,
+                                       NULL, NULL,
+                                       NULL);
+       if (ret != 0) {
+               DEBUG(DEBUG_ERR,("Failed to release IP on nodes\n"));
+               talloc_free(tmp_ctx);
                return -1;
        }
 
-       ret = control_send_release(ctdb, pnn, &ips->ips[i].addr);
+       ret = ctdb_ctrl_takeover_ip(ctdb, TIMELIMIT(), pnn, &ip);
        if (ret != 0) {
-               DEBUG(DEBUG_ERR, ("Failed to send 'change ip' to all 
nodes\n"));;
+               DEBUG(DEBUG_ERR,("Failed to take over IP on node %d\n", pnn));
+               talloc_free(tmp_ctx);
                return -1;
        }
 
+       talloc_free(tmp_ctx);
        return 0;
 }
 
@@ -1092,6 +1078,15 @@ static int control_addip(struct ctdb_context *ctdb, int 
argc, const char **argv)
        }
 
 
+       /* check if some other node is already serving this ip, if not,
+        * we will claim it
+        */
+       for (i=0;i<ips->num;i++) {
+               if (ctdb_same_ip(&addr, &ips->ips[i].addr)) {
+                       break;
+               }
+       }
+
        len = offsetof(struct ctdb_control_ip_iface, iface) + strlen(argv[1]) + 
1;
        pub = talloc_size(tmp_ctx, len); 
        CTDB_NO_MEMORY(ctdb, pub);
@@ -1108,22 +1103,21 @@ static int control_addip(struct ctdb_context *ctdb, int 
argc, const char **argv)
                return ret;
        }
 
-
-       /* check if some other node is already serving this ip, if not,
-        * we will claim it
-        */
-       for (i=0;i<ips->num;i++) {
-               if (ctdb_same_ip(&addr, &ips->ips[i].addr)) {
-                       break;
-               }
-       }
        /* no one has this ip so we claim it */
        if (i == ips->num) {
-               ret = control_send_release(ctdb, options.pnn, &addr);
-       } else {
-               ret = control_send_release(ctdb, ips->ips[i].pnn, &addr);
+               struct ctdb_public_ip ip;
+
+               ip.pnn  = options.pnn;
+               ip.addr = addr;
+
+               ret = ctdb_ctrl_takeover_ip(ctdb, TIMELIMIT(), options.pnn, 
&ip);
+               if (ret != 0) {
+                       DEBUG(DEBUG_ERR,("Failed to take over IP on node %d\n", 
options.pnn));
+                       return -1;
+               }
        }
 
+
        if (ret != 0) {
                DEBUG(DEBUG_ERR, ("Failed to send 'change ip' to all nodes\n"));
                return -1;
@@ -1255,9 +1249,15 @@ static int control_delip(struct ctdb_context *ctdb, int 
argc, const char **argv)
        if (ips->ips[i].pnn == options.pnn) {
                ret = find_other_host_for_public_ip(ctdb, &addr);
                if (ret != -1) {
-                       ret = control_send_release(ctdb, ret, &addr);
+                       struct ctdb_public_ip ip;
+
+                       ip.pnn  = ret;
+                       ip.addr = addr;
+
+                       ret = ctdb_ctrl_takeover_ip(ctdb, TIMELIMIT(), ret, 
&ip);
                        if (ret != 0) {
-                               DEBUG(DEBUG_ERR, ("Failed to migrate this ip to 
another node. Use moveip of recover to reassign this address to a node\n"));
+                               DEBUG(DEBUG_ERR,("Failed to take over IP on 
node %d\n", options.pnn));
+                               return -1;
                        }
                }
        }


-- 
CTDB repository

Reply via email to