recoverd: Rebalancing should be done regardless tunable
authorMartin Schwenke <martin@meltin.net>
Wed, 30 Oct 2013 01:17:37 +0000 (12:17 +1100)
committerMartin Schwenke <martin@meltin.net>
Wed, 30 Oct 2013 01:19:49 +0000 (12:19 +1100)
Rebalance target nodes should be set even if a deferred rebalance is
not configured.  The user can explicitly cause a takeover run.

Signed-off-by: Martin Schwenke <martin@meltin.net>
server/ctdb_recoverd.c

index 1d2244a6623f7baca20da4697b5b72661a4f1933..5caf7c05eaa5129f4e56bab2b45012ed2a936a2c 100644 (file)
@@ -2377,6 +2377,7 @@ static void recd_node_rebalance_handler(struct ctdb_context *ctdb,
        uint32_t pnn;
        uint32_t *t;
        int len;
+       uint32_t deferred_rebalance;
        struct ctdb_recoverd *rec = talloc_get_type(private_data, struct ctdb_recoverd);
 
        if (rec->recmaster != ctdb_get_pnn(ctdb)) {
@@ -2388,10 +2389,6 @@ static void recd_node_rebalance_handler(struct ctdb_context *ctdb,
                return;
        }
 
-       if (ctdb->tunable.deferred_rebalance_on_node_add == 0) {
-               return;
-       }
-
        pnn = *(uint32_t *)&data.dptr[0];
 
        DEBUG(DEBUG_NOTICE,("Setting up rebalance of IPs to node %u\n", pnn));
@@ -2420,9 +2417,19 @@ static void recd_node_rebalance_handler(struct ctdb_context *ctdb,
        talloc_free(rec->force_rebalance_nodes);
 
        rec->force_rebalance_nodes = t;
-       event_add_timed(ctdb->ev, rec->force_rebalance_nodes,
-                       timeval_current_ofs(ctdb->tunable.deferred_rebalance_on_node_add, 0),
-                       ctdb_rebalance_timeout, rec);
+
+       /* If configured, setup a deferred takeover run to make sure
+        * that certain nodes get IPs rebalanced to them.  This will
+        * be cancelled if a successful takeover run happens before
+        * the timeout.  Assign tunable value to variable for
+        * readability.
+        */
+       deferred_rebalance = ctdb->tunable.deferred_rebalance_on_node_add;
+       if (deferred_rebalance != 0) {
+               event_add_timed(ctdb->ev, rec->force_rebalance_nodes,
+                               timeval_current_ofs(deferred_rebalance, 0),
+                               ctdb_rebalance_timeout, rec);
+       }
 }