[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Sun Aug 21 20:46:03 UTC 2016


The branch, master has been updated
       via  6dc75c7 ctdb-daemon: When releasing an IP, update PNN in callback
       via  976a50a ctdb-daemon: Rename takeover_callback_state -> release_ip_callback_state
      from  6910d3a lib: Implement poll_timeout

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6dc75c7d24325d2070eb7feab5399dbfda50da96
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Aug 19 16:38:50 2016 +1000

    ctdb-daemon: When releasing an IP, update PNN in callback
    
    When an error occurs so an IP address is not released then the PNN in
    the VNN is currently incorrectly updated.
    
    Instead, update the PNN in the callback when the release is
    successful.  Also, explicitly update the PNN on redundant releases.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12158
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    
    Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
    Autobuild-Date(master): Sun Aug 21 22:45:33 CEST 2016 on sn-devel-144

commit 976a50af6f045765c7bf1961e26efc3cba17f3ba
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Aug 19 16:30:46 2016 +1000

    ctdb-daemon: Rename takeover_callback_state -> release_ip_callback_state
    
    Many years ago takeover_callback_state was used for both IP takeover
    and release.  Now it is only used when releasing an IP so rename it to
    improve clarity.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12158
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

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

Summary of changes:
 ctdb/server/ctdb_takeover.c | 43 ++++++++++++++++++++++++++-----------------
 1 file changed, 26 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c
index ee4dbe1..ff096ce 100644
--- a/ctdb/server/ctdb_takeover.c
+++ b/ctdb/server/ctdb_takeover.c
@@ -434,12 +434,6 @@ static int32_t ctdb_announce_vnn_iface(struct ctdb_context *ctdb,
 	return 0;
 }
 
-struct takeover_callback_state {
-	struct ctdb_req_control_old *c;
-	ctdb_sock_addr *addr;
-	struct ctdb_vnn *vnn;
-};
-
 struct ctdb_do_takeip_state {
 	struct ctdb_req_control_old *c;
 	struct ctdb_vnn *vnn;
@@ -872,14 +866,21 @@ static struct ctdb_vnn *release_ip_post(struct ctdb_context *ctdb,
 	return vnn;
 }
 
+struct release_ip_callback_state {
+	struct ctdb_req_control_old *c;
+	ctdb_sock_addr *addr;
+	struct ctdb_vnn *vnn;
+	uint32_t target_pnn;
+};
+
 /*
   called when releaseip event finishes
  */
-static void release_ip_callback(struct ctdb_context *ctdb, int status, 
+static void release_ip_callback(struct ctdb_context *ctdb, int status,
 				void *private_data)
 {
-	struct takeover_callback_state *state = 
-		talloc_get_type(private_data, struct takeover_callback_state);
+	struct release_ip_callback_state *state =
+		talloc_get_type(private_data, struct release_ip_callback_state);
 
 	if (status == -ETIME) {
 		ctdb_ban_self(ctdb);
@@ -897,6 +898,7 @@ static void release_ip_callback(struct ctdb_context *ctdb, int status,
 		}
 	}
 
+	state->vnn->pnn = state->target_pnn;
 	state->vnn = release_ip_post(ctdb, state->vnn, state->addr);
 
 	/* the control succeeded */
@@ -904,7 +906,7 @@ static void release_ip_callback(struct ctdb_context *ctdb, int status,
 	talloc_free(state);
 }
 
-static int ctdb_releaseip_destructor(struct takeover_callback_state *state)
+static int ctdb_releaseip_destructor(struct release_ip_callback_state *state)
 {
 	if (state->vnn != NULL) {
 		state->vnn->update_in_flight = false;
@@ -921,7 +923,7 @@ int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
 				bool *async_reply)
 {
 	int ret;
-	struct takeover_callback_state *state;
+	struct release_ip_callback_state *state;
 	struct ctdb_public_ip *pip = (struct ctdb_public_ip *)indata.dptr;
 	struct ctdb_vnn *vnn;
 	char *iface;
@@ -933,16 +935,20 @@ int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
 			ctdb_addr_to_str(&pip->addr)));
 		return 0;
 	}
-	vnn->pnn = pip->pnn;
 
 	/* stop any previous arps */
 	talloc_free(vnn->takeover_ctx);
 	vnn->takeover_ctx = NULL;
 
-	/* Some ctdb tool commands (e.g. moveip) send
-	 * lazy multicast to drop an IP from any node that isn't the
-	 * intended new node.  The following causes makes ctdbd ignore
-	 * a release for any address it doesn't host.
+	/* RELEASE_IP controls are sent to all nodes that should not
+	 * be hosting a particular IP.  This serves 2 purposes.  The
+	 * first is to help resolve any inconsistencies.  If a node
+	 * does unexpectly host an IP then it will be released.  The
+	 * 2nd is to use a "redundant release" to tell non-takeover
+	 * nodes where an IP is moving to.  This is how "ctdb ip" can
+	 * report the (likely) location of an IP by only asking the
+	 * local node.  Redundant releases need to update the PNN but
+	 * are otherwise ignored.
 	 */
 	if (ctdb->tunable.disable_ip_failover == 0 && ctdb->do_checkpublicip) {
 		if (!ctdb_sys_have_ip(&pip->addr)) {
@@ -950,6 +956,7 @@ int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
 				ctdb_addr_to_str(&pip->addr),
 				vnn->public_netmask_bits,
 				ctdb_vnn_iface_string(vnn)));
+			vnn->pnn = pip->pnn;
 			ctdb_vnn_unassign_iface(ctdb, vnn);
 			return 0;
 		}
@@ -958,6 +965,7 @@ int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
 			DEBUG(DEBUG_DEBUG,("Redundant release of IP %s/%u (ip not held)\n",
 					   ctdb_addr_to_str(&pip->addr),
 					   vnn->public_netmask_bits));
+			vnn->pnn = pip->pnn;
 			return 0;
 		}
 	}
@@ -983,7 +991,7 @@ int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
 		iface,
 		pip->pnn));
 
-	state = talloc(ctdb, struct takeover_callback_state);
+	state = talloc(ctdb, struct release_ip_callback_state);
 	if (state == NULL) {
 		ctdb_set_error(ctdb, "Out of memory at %s:%d",
 			       __FILE__, __LINE__);
@@ -1001,6 +1009,7 @@ int32_t ctdb_control_release_ip(struct ctdb_context *ctdb,
 		return -1;
 	}
 	*state->addr = pip->addr;
+	state->target_pnn = pip->pnn;
 	state->vnn   = vnn;
 
 	vnn->update_in_flight = true;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list