ctdb-takeover: Use the takeover_run_fail_callback() in more cases
authorMartin Schwenke <martin@meltin.net>
Tue, 3 May 2016 02:52:36 +0000 (12:52 +1000)
committerAmitay Isaacs <amitay@samba.org>
Fri, 13 May 2016 11:47:17 +0000 (13:47 +0200)
Probably due to oversight, this is currently only used for the
"takeip" step.

This does consistent error handling and provides a layer of
indirection to the passed callback, so use it for "releaseip" and
"ipreallocated" steps too.

The callback data now needs to be initialised before the first
possible jump to "ipreallocated".

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

index 46a08c81e83f2db41305ff6181de5ca54d9809a3..ac10384e6b1cafe3ec44fccb300fa4e535a91026 100644 (file)
@@ -1653,6 +1653,19 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodem
        struct takeover_callback_data *takeover_data;
        bool can_host_ips;
 
+       /* Initialise fail callback data to be used with
+        * takeover_run_fail_callback().  A failure in any of the
+        * following steps will cause an early return, so this can be
+        * reused for each of those steps without re-initialising. */
+       takeover_data = takeover_callback_data_init(tmp_ctx,
+                                                   nodemap->num,
+                                                   fail_callback,
+                                                   callback_data);
+       if (takeover_data == NULL) {
+               talloc_free(tmp_ctx);
+               return -1;
+       }
+
        /*
         * ip failover is completely disabled, just send out the 
         * ipreallocated event.
@@ -1712,15 +1725,6 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodem
         * host.  This will be a NOOP on nodes that don't currently
         * hold the given IP.
         */
-       takeover_data = takeover_callback_data_init(tmp_ctx,
-                                                   nodemap->num,
-                                                   fail_callback,
-                                                   callback_data);
-       if (takeover_data == NULL) {
-               talloc_free(tmp_ctx);
-               return -1;
-       }
-
        async_data = talloc_zero(tmp_ctx, struct client_async_data);
        CTDB_NO_MEMORY_FATAL(ctdb, async_data);
 
@@ -1782,8 +1786,8 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map_old *nodem
        async_data = talloc_zero(tmp_ctx, struct client_async_data);
        CTDB_NO_MEMORY_FATAL(ctdb, async_data);
 
-       async_data->fail_callback = fail_callback;
-       async_data->callback_data = callback_data;
+       async_data->fail_callback = takeover_run_fail_callback;
+       async_data->callback_data = takeover_data;
 
        for (tmp_ip=all_ips;tmp_ip;tmp_ip=tmp_ip->next) {
                if (tmp_ip->pnn == -1) {
@@ -1826,8 +1830,8 @@ ipreallocated:
        ret = ctdb_client_async_control(ctdb, CTDB_CONTROL_IPREALLOCATED,
                                        nodes, 0, TAKEOVER_TIMEOUT(),
                                        false, tdb_null,
-                                       NULL, fail_callback,
-                                       &callback_data);
+                                       NULL, takeover_run_fail_callback,
+                                       takeover_data);
        if (ret != 0) {
                DEBUG(DEBUG_ERR,
                      ("Async CTDB_CONTROL_IPREALLOCATED control failed\n"));