[SCM] Samba Shared Repository - branch v4-5-test updated

Karolin Seeger kseeger at samba.org
Wed Jan 25 22:48:03 UTC 2017


The branch, v4-5-test has been updated
       via  b8ae9cd vfs_default: unlock the right file in copy chunk
       via  4426d43 ctdb-tests: Add "13.per_ip_routing shutdown" test
       via  88ef026 ctdb-scripts: Fix regression when cleaning up routing table IDs
       via  5650e20 ctdb-scripts: Fix remaining uses of "ctdb gratiousarp"
       via  3d55b17 ctdb-tests: Add robust mutex test
       via  8fe2fc0 ctdb-locking: Explicitly unlock record/db in lock helper
       via  727f5d4 ctdb-locking: Remove support for locking multiple databases
      from  430cad1 VERSION: Bump version up to 4.5.5...

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-5-test


- Log -----------------------------------------------------------------
commit b8ae9cd9b5401c4ca973ded5453801d438e6ff64
Author: Björn Jacke <bj at sernet.de>
Date:   Thu Jan 19 21:51:41 2017 +0100

    vfs_default: unlock the right file in copy chunk
    
    Signed-off-by: Bjoern Jacke <bj at sernet.de>
    Reviewed-by: David Disseldorp <ddiss at samba.org>
    
    Autobuild-User(master): Björn Jacke <bj at sernet.de>
    Autobuild-Date(master): Sat Jan 21 17:00:54 CET 2017 on sn-devel-144
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12535
    
    (cherry picked from commit 5059c8e2e3a6159bc2917ddd80d09fab35b39e66)
    
    Autobuild-User(v4-5-test): Karolin Seeger <kseeger at samba.org>
    Autobuild-Date(v4-5-test): Wed Jan 25 23:47:29 CET 2017 on sn-devel-144

commit 4426d4343710dded806e02b3d763614f3393dfb3
Author: Martin Schwenke <martin at meltin.net>
Date:   Mon Jan 16 11:08:51 2017 +1100

    ctdb-tests: Add "13.per_ip_routing shutdown" test
    
    Ensure that it doesn't mangle the rt_tables file.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12516
    
    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): Tue Jan 17 06:02:23 CET 2017 on sn-devel-144
    
    (cherry picked from commit eaa508b82650197a7d473a24b3362e9e9c329937)

commit 88ef026ec67c06e2c0a36aaa128c7be54f0cc5f2
Author: Martin Schwenke <martin at meltin.net>
Date:   Mon Jan 16 07:24:15 2017 +1100

    ctdb-scripts: Fix regression when cleaning up routing table IDs
    
    Commit 0ca00267cd2620a14968961738bcd2a69b597e95 removed explicit
    continuations in strings for awk programs.  In one case this causes a
    disconnect between condition and action, where an implicit
    continuation does not work.  This results in duplicate lines in the
    rt_tables file.
    
    Move the opening brace for the action to make the implicit
    continuation work as expected.
    
    An alternative would be to revert the removal of the explicit
    continuations and add shellcheck tags.  However, that doesn't mean
    that an author of future code will necessarily use explicit
    continuations, so the same mistake might still be make in the future.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12516
    
    Reported-by: Barry Evans <bevans at pixitmedia.com>
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit f9368f8e129cb32ee30cb6501a6fe728db37e1d5)

commit 5650e208de9177ac166e56ff2b7767baad8e014d
Author: Martin Schwenke <martin at meltin.net>
Date:   Mon Jan 16 13:38:50 2017 +1100

    ctdb-scripts: Fix remaining uses of "ctdb gratiousarp"
    
    This changed to "ctdb gratarp" some time ago but the scripts were
    never updated.
    
    Fix the documentation for the ctdb tool too.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12512
    
    Reported-by: Ralph Böhme <slow at samba.org>
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    (cherry picked from commit 5e00a6b346325f52e35b9785eaffd72239aebcf5)

commit 3d55b17d28724cb5ddb5a6fb7b6a7b5cd28bdc65
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Fri Dec 2 15:11:20 2016 +1100

    ctdb-tests: Add robust mutex test
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12469
    
    This demonstrates robust mutex bug on linux/glibc system.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    
    Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
    Autobuild-Date(master): Thu Jan 12 07:59:34 CET 2017 on sn-devel-144
    
    (cherry picked from commit 7794497bc909fa7b02da9d9ce1fc496a8fa2a9ae)

commit 8fe2fc0b9e6be7166062f6802e0af1740fbb2f5a
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Nov 29 17:20:45 2016 +1100

    ctdb-locking: Explicitly unlock record/db in lock helper
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12469
    
    Instead of killing lock helper processes with SIGKILL, send SIGTERM so
    lock helper processes can explicitly unlock record/db.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    (cherry picked from commit 3a56a16b06cf6d1cce613ec29f5ea46630902072)

commit 727f5d48512fe91d59fbdf7d0caa96d0f156e003
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Tue Nov 29 17:13:41 2016 +1100

    ctdb-locking: Remove support for locking multiple databases
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=12469
    
    The code to lock multiple databases has been dropped from ctdb_lock.c.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    (cherry picked from commit 5b1076dc61f5e3f006c1b8cef98e7d2d3cc1bfba)

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

Summary of changes:
 ctdb/config/events.d/10.interface                |   4 +-
 ctdb/config/events.d/13.per_ip_routing           |   8 +-
 ctdb/config/events.d/91.lvs                      |   2 +-
 ctdb/doc/ctdb.1.xml                              |   4 +-
 ctdb/server/ctdb_lock.c                          |   6 +-
 ctdb/server/ctdb_lock_helper.c                   | 201 ++++++++++++++---
 ctdb/tests/eventscripts/13.per_ip_routing.024.sh |  31 +++
 ctdb/tests/eventscripts/stubs/ctdb               |   2 +-
 ctdb/tests/src/test_mutex_raw.c                  | 261 +++++++++++++++++++++++
 ctdb/wscript                                     |   8 +-
 source3/modules/vfs_default.c                    |   2 +-
 11 files changed, 482 insertions(+), 47 deletions(-)
 create mode 100755 ctdb/tests/eventscripts/13.per_ip_routing.024.sh
 create mode 100644 ctdb/tests/src/test_mutex_raw.c


Changeset truncated at 500 lines:

diff --git a/ctdb/config/events.d/10.interface b/ctdb/config/events.d/10.interface
index 51abc44..e41596d 100755
--- a/ctdb/config/events.d/10.interface
+++ b/ctdb/config/events.d/10.interface
@@ -215,7 +215,7 @@ updateip)
 	# 2) remove the IP from the old interface (and new interface, to be sure)
 	# 3) add the IP to the new interface
 	# 4) remove the firewall rule
-	# 5) use ctdb gratiousarp to propagate the new mac address
+	# 5) use ctdb gratarp to propagate the new mac address
 	# 6) use netstat -tn to find existing connections, and tickle them
 	_oiface=$2
 	niface=$3
@@ -240,7 +240,7 @@ updateip)
 	flush_route_cache
 
 	# propagate the new mac address
-	$CTDB gratiousarp "$ip" "$niface"
+	$CTDB gratarp "$ip" "$niface"
 
 	# tickle all existing connections, so that dropped packets
 	# are retransmited and the tcp streams work
diff --git a/ctdb/config/events.d/13.per_ip_routing b/ctdb/config/events.d/13.per_ip_routing
index f0e4609..41724bb 100755
--- a/ctdb/config/events.d/13.per_ip_routing
+++ b/ctdb/config/events.d/13.per_ip_routing
@@ -184,8 +184,8 @@ clean_up_table_ids ()
 	    -v pre="$table_id_prefix" \
 	    '/^#/ ||
 	     !(min <= $1 && $1 <= max) &&
-	     !(index($2, pre) == 1)
-	     { print $0 }' "$rt_tables" >"$_tmp"
+	     !(index($2, pre) == 1) {
+		print $0 }' "$rt_tables" >"$_tmp"
 
 	mv "$_tmp" "$rt_tables"
     ) 9>"$rt_tables_lock"
@@ -398,7 +398,7 @@ takeip)
 	# flush our route cache
 	set_proc sys/net/ipv4/route/flush 1
 
-	$CTDB gratiousarp "$ip" "$iface"
+	$CTDB gratarp "$ip" "$iface"
 	;;
 
 updateip)
@@ -416,7 +416,7 @@ updateip)
 	# flush our route cache
 	set_proc sys/net/ipv4/route/flush 1
 
-	$CTDB gratiousarp "$ip" "$niface"
+	$CTDB gratarp "$ip" "$niface"
 	tickle_tcp_connections "$ip"
 	;;
 
diff --git a/ctdb/config/events.d/91.lvs b/ctdb/config/events.d/91.lvs
index 052b509..9725ee8 100755
--- a/ctdb/config/events.d/91.lvs
+++ b/ctdb/config/events.d/91.lvs
@@ -110,7 +110,7 @@ ipreallocated)
 	ipvsadm -a -t "$CTDB_LVS_PUBLIC_IP" -r 127.0.0.1
 	ipvsadm -a -u "$CTDB_LVS_PUBLIC_IP" -r 127.0.0.1
 
-	$CTDB gratiousarp \
+	$CTDB gratarp \
 	     "$CTDB_LVS_PUBLIC_IP" "$CTDB_LVS_PUBLIC_IFACE" >/dev/null 2>&1
 
 	flush_route_cache
diff --git a/ctdb/doc/ctdb.1.xml b/ctdb/doc/ctdb.1.xml
index d295213..71af0a5 100644
--- a/ctdb/doc/ctdb.1.xml
+++ b/ctdb/doc/ctdb.1.xml
@@ -1353,9 +1353,9 @@ dbid:0xb775fff6 name:secrets.tdb path:/usr/local/var/lib/ctdb/persistent/secrets
     </refsect2>
 
     <refsect2>
-      <title>gratiousarp <parameter>IPADDR</parameter> <parameter>INTERFACE</parameter></title>
+      <title>gratarp <parameter>IPADDR</parameter> <parameter>INTERFACE</parameter></title>
       <para>
-	Send out a gratious ARP for the specified interface through
+	Send out a gratuitous ARP for the specified interface through
 	the specified interface. This command is mainly used by the
 	ctdb eventscripts.
       </para>
diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c
index 405a29e..5ecf454e 100644
--- a/ctdb/server/ctdb_lock.c
+++ b/ctdb/server/ctdb_lock.c
@@ -192,7 +192,7 @@ static int ctdb_lock_context_destructor(struct lock_context *lock_ctx)
 		lock_ctx->request->lctx = NULL;
 	}
 	if (lock_ctx->child > 0) {
-		ctdb_kill(lock_ctx->ctdb, lock_ctx->child, SIGKILL);
+		ctdb_kill(lock_ctx->ctdb, lock_ctx->child, SIGTERM);
 		if (lock_ctx->type == LOCK_RECORD) {
 			DLIST_REMOVE(lock_ctx->ctdb_db->lock_current, lock_ctx);
 		} else {
@@ -672,7 +672,7 @@ static void ctdb_lock_schedule(struct ctdb_context *ctdb)
 					    ctdb_lock_timeout_handler,
 					    (void *)lock_ctx);
 	if (lock_ctx->ttimer == NULL) {
-		ctdb_kill(ctdb, lock_ctx->child, SIGKILL);
+		ctdb_kill(ctdb, lock_ctx->child, SIGTERM);
 		lock_ctx->child = -1;
 		close(lock_ctx->fd[0]);
 		return;
@@ -687,7 +687,7 @@ static void ctdb_lock_schedule(struct ctdb_context *ctdb)
 				      (void *)lock_ctx);
 	if (lock_ctx->tfd == NULL) {
 		TALLOC_FREE(lock_ctx->ttimer);
-		ctdb_kill(ctdb, lock_ctx->child, SIGKILL);
+		ctdb_kill(ctdb, lock_ctx->child, SIGTERM);
 		lock_ctx->child = -1;
 		close(lock_ctx->fd[0]);
 		return;
diff --git a/ctdb/server/ctdb_lock_helper.c b/ctdb/server/ctdb_lock_helper.c
index 8aa0870..c4f628f 100644
--- a/ctdb/server/ctdb_lock_helper.c
+++ b/ctdb/server/ctdb_lock_helper.c
@@ -20,8 +20,12 @@
 #include "replace.h"
 #include "system/filesys.h"
 #include "system/network.h"
+#include "system/wait.h"
 
 #include <talloc.h>
+#include <tevent.h>
+
+#include "lib/util/tevent_unix.h"
 
 #include "ctdb_private.h"
 
@@ -30,6 +34,11 @@
 static char *progname = NULL;
 static bool realtime = true;
 
+struct lock_state {
+	struct tdb_context *tdb;
+	TDB_DATA key;
+};
+
 static void set_priority(void)
 {
 	const char *ptr;
@@ -72,7 +81,7 @@ static void usage(void)
 	fprintf(stderr, "\n");
 	fprintf(stderr, "Usage: %s <log-fd> <ctdbd-pid> <output-fd> RECORD <db-path> <db-flags> <db-key>\n",
 		progname);
-	fprintf(stderr, "       %s <log-fd> <ctdbd-pid> <output-fd> DB <db1-path> <db1-flags> [<db2-path> <db2-flags>...]\n",
+	fprintf(stderr, "       %s <log-fd> <ctdbd-pid> <output-fd> DB <db1-path> <db1-flags>\n",
 		progname);
 }
 
@@ -93,10 +102,9 @@ static uint8_t *hex_decode_talloc(TALLOC_CTX *mem_ctx,
 	return buffer;
 }
 
-static int lock_record(const char *dbpath, const char *dbflags, const char *dbkey)
+static int lock_record(const char *dbpath, const char *dbflags,
+		       const char *dbkey, struct lock_state *state)
 {
-	TDB_DATA key;
-	struct tdb_context *tdb;
 	int tdb_flags;
 
 	/* No error checking since CTDB always passes sane values */
@@ -104,23 +112,25 @@ static int lock_record(const char *dbpath, const char *dbflags, const char *dbke
 
 	/* Convert hex key to key */
 	if (strcmp(dbkey, "NULL") == 0) {
-		key.dptr = NULL;
-		key.dsize = 0;
+		state->key.dptr = NULL;
+		state->key.dsize = 0;
 	} else {
-		key.dptr = hex_decode_talloc(NULL, dbkey, &key.dsize);
+		state->key.dptr = hex_decode_talloc(NULL, dbkey,
+						    &state->key.dsize);
 	}
 
-	tdb = tdb_open(dbpath, 0, tdb_flags, O_RDWR, 0600);
-	if (tdb == NULL) {
-		fprintf(stderr, "%s: Error opening database %s\n", progname, dbpath);
+	state->tdb = tdb_open(dbpath, 0, tdb_flags, O_RDWR, 0600);
+	if (state->tdb == NULL) {
+		fprintf(stderr, "%s: Error opening database %s\n",
+			progname, dbpath);
 		return 1;
 	}
 
 	set_priority();
 
-	if (tdb_chainlock(tdb, key) < 0) {
+	if (tdb_chainlock(state->tdb, state->key) < 0) {
 		fprintf(stderr, "%s: Error getting record lock (%s)\n",
-			progname, tdb_errorstr(tdb));
+			progname, tdb_errorstr(state->tdb));
 		return 1;
 	}
 
@@ -130,26 +140,26 @@ static int lock_record(const char *dbpath, const char *dbflags, const char *dbke
 
 }
 
-
-static int lock_db(const char *dbpath, const char *dbflags)
+static int lock_db(const char *dbpath, const char *dbflags,
+		   struct lock_state *state)
 {
-	struct tdb_context *tdb;
 	int tdb_flags;
 
 	/* No error checking since CTDB always passes sane values */
 	tdb_flags = strtol(dbflags, NULL, 0);
 
-	tdb = tdb_open(dbpath, 0, tdb_flags, O_RDWR, 0600);
-	if (tdb == NULL) {
-		fprintf(stderr, "%s: Error opening database %s\n", progname, dbpath);
+	state->tdb = tdb_open(dbpath, 0, tdb_flags, O_RDWR, 0600);
+	if (state->tdb == NULL) {
+		fprintf(stderr, "%s: Error opening database %s\n",
+			progname, dbpath);
 		return 1;
 	}
 
 	set_priority();
 
-	if (tdb_lockall(tdb) < 0) {
+	if (tdb_lockall(state->tdb) < 0) {
 		fprintf(stderr, "%s: Error getting db lock (%s)\n",
-			progname, tdb_errorstr(tdb));
+			progname, tdb_errorstr(state->tdb));
 		return 1;
 	}
 
@@ -158,13 +168,114 @@ static int lock_db(const char *dbpath, const char *dbflags)
 	return 0;
 }
 
+struct wait_for_parent_state {
+	struct tevent_context *ev;
+	pid_t ppid;
+};
+
+static void wait_for_parent_check(struct tevent_req *subreq);
+
+static struct tevent_req *wait_for_parent_send(TALLOC_CTX *mem_ctx,
+					       struct tevent_context *ev,
+					       pid_t ppid)
+{
+	struct tevent_req *req, *subreq;
+	struct wait_for_parent_state *state;
+
+	req = tevent_req_create(mem_ctx, &state, struct wait_for_parent_state);
+	if (req == NULL) {
+		return NULL;
+	}
+
+	state->ev = ev;
+	state->ppid = ppid;
+
+	if (ppid == 1) {
+		tevent_req_done(req);
+		return tevent_req_post(req, ev);
+	}
+
+	subreq = tevent_wakeup_send(state, ev,
+				    tevent_timeval_current_ofs(5,0));
+	if (tevent_req_nomem(subreq, req)) {
+		return tevent_req_post(req, ev);
+	}
+	tevent_req_set_callback(subreq, wait_for_parent_check, req);
+
+	return req;
+}
+
+static void wait_for_parent_check(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct wait_for_parent_state *state = tevent_req_data(
+		req, struct wait_for_parent_state);
+	bool status;
+
+	status = tevent_wakeup_recv(subreq);
+	TALLOC_FREE(subreq);
+	if (! status) {
+		/* Ignore error */
+		fprintf(stderr, "locking: tevent_wakeup_recv() failed\n");
+	}
+
+	if (kill(state->ppid, 0) == -1 && errno == ESRCH) {
+		tevent_req_done(req);
+		return;
+	}
+
+	subreq = tevent_wakeup_send(state, state->ev,
+				    tevent_timeval_current_ofs(5,0));
+	if (tevent_req_nomem(subreq, req)) {
+		return;
+	}
+	tevent_req_set_callback(subreq, wait_for_parent_check, req);
+}
+
+static bool wait_for_parent_recv(struct tevent_req *req)
+{
+	if (tevent_req_is_unix_error(req, NULL)) {
+		return false;
+	}
+
+	return true;
+}
+
+static void cleanup(struct lock_state *state)
+{
+	if (state->tdb != NULL) {
+		if (state->key.dsize == 0) {
+			tdb_unlockall(state->tdb);
+		} else {
+			tdb_chainunlock(state->tdb, state->key);
+		}
+		tdb_close(state->tdb);
+	}
+}
+
+static void signal_handler(struct tevent_context *ev,
+			   struct tevent_signal *se,
+			   int signum, int count, void *siginfo,
+			   void *private_data)
+{
+	struct lock_state *state = (struct lock_state *)private_data;
+
+	cleanup(state);
+	exit(0);
+}
 
 int main(int argc, char *argv[])
 {
+	struct tevent_context *ev;
+	struct tevent_signal *se;
+	struct tevent_req *req;
+	struct lock_state state = { 0 };
 	int write_fd, log_fd;
 	char result = 0;
 	int ppid;
 	const char *lock_type;
+	bool status;
 
 	reset_scheduler();
 
@@ -186,6 +297,20 @@ int main(int argc, char *argv[])
 	write_fd = atoi(argv[3]);
 	lock_type = argv[4];
 
+	ev = tevent_context_init(NULL);
+	if (ev == NULL) {
+		fprintf(stderr, "locking: tevent_context_init() failed\n");
+		exit(1);
+	}
+
+	se = tevent_add_signal(ev, ev, SIGTERM, 0,
+			       signal_handler, &state);
+	if (se == NULL) {
+		fprintf(stderr, "locking: tevent_add_signal() failed\n");
+		talloc_free(ev);
+		exit(1);
+	}
+
 	if (strcmp(lock_type, "RECORD") == 0) {
 		if (argc != 8) {
 			fprintf(stderr, "%s: Invalid number of arguments (%d)\n",
@@ -193,20 +318,17 @@ int main(int argc, char *argv[])
 			usage();
 			exit(1);
 		}
-		result = lock_record(argv[5], argv[6], argv[7]);
+		result = lock_record(argv[5], argv[6], argv[7], &state);
 
 	} else if (strcmp(lock_type, "DB") == 0) {
-		int n;
-
-		/* If there are no databases specified, no need for lock */
-		if (argc > 5) {
-			for (n=5; n+1<argc; n+=2) {
-				result = lock_db(argv[n], argv[n+1]);
-				if (result != 0) {
-					break;
-				}
-			}
+		if (argc != 7) {
+			fprintf(stderr,
+				"locking: Invalid number of arguments (%d)\n",
+				argc);
+			usage();
+			exit(1);
 		}
+		result = lock_db(argv[5], argv[6], &state);
 
 	} else {
 		fprintf(stderr, "%s: Invalid lock-type '%s'\n", progname, lock_type);
@@ -216,6 +338,21 @@ int main(int argc, char *argv[])
 
 	send_result(write_fd, result);
 
-	ctdb_wait_for_process_to_exit(ppid);
+	req = wait_for_parent_send(ev, ev, ppid);
+	if (req == NULL) {
+		fprintf(stderr, "locking: wait_for_parent_send() failed\n");
+		cleanup(&state);
+		exit(1);
+	}
+
+	tevent_req_poll(req, ev);
+
+	status = wait_for_parent_recv(req);
+	if (! status) {
+		fprintf(stderr, "locking: wait_for_parent_recv() failed\n");
+	}
+
+	talloc_free(ev);
+	cleanup(&state);
 	return 0;
 }
diff --git a/ctdb/tests/eventscripts/13.per_ip_routing.024.sh b/ctdb/tests/eventscripts/13.per_ip_routing.024.sh
new file mode 100755
index 0000000..7daacbb
--- /dev/null
+++ b/ctdb/tests/eventscripts/13.per_ip_routing.024.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "Single IP, restores original rt_tables"
+
+setup_ctdb
+setup_ctdb_policy_routing
+
+create_policy_routing_config 1 default
+
+_rt_tables="$CTDB_SYS_ETCDIR/iproute2/rt_tables"
+_rt_orig=$(mktemp --tmpdir="$EVENTSCRIPTS_TESTS_VAR_DIR")
+cp "$_rt_tables" "$_rt_orig"
+
+ctdb_get_1_public_address | {
+	read dev ip bits
+
+	ok_null
+	simple_test_event "takeip" $dev $ip $bits
+
+	ok <<EOF
+Removing ip rule for public address ${ip} for routing table ctdb.${ip}
+EOF
+	simple_test_event "shutdown"
+}
+
+ok_null
+simple_test_command diff -u "$_rt_orig" "$_rt_tables"
+
+check_routes 0
diff --git a/ctdb/tests/eventscripts/stubs/ctdb b/ctdb/tests/eventscripts/stubs/ctdb
index a1cba70..28868d1 100755
--- a/ctdb/tests/eventscripts/stubs/ctdb
+++ b/ctdb/tests/eventscripts/stubs/ctdb
@@ -445,7 +445,7 @@ case "$1" in
 	    echo "|${2:-monitor}|${_b}|${_code}|${_status}|${_d1}|${_d2}|${_err_out}|"
 	done
 	;;
-    gratiousarp) : ;;  # Do nothing for now
+    gratarp) : ;;  # Do nothing for now
     ip)            ctdb_ip "$@" ;;
     pnn|xpnn)      ctdb_pnn ;;
     enable)        ctdb_enable "$@";;
diff --git a/ctdb/tests/src/test_mutex_raw.c b/ctdb/tests/src/test_mutex_raw.c
new file mode 100644
index 0000000..8e3cae3
--- /dev/null
+++ b/ctdb/tests/src/test_mutex_raw.c
@@ -0,0 +1,261 @@
+/*
+   Robust mutex test
+
+   Copyright (C) Amitay Isaacs  2016
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * Run this test as follows:


-- 
Samba Shared Repository



More information about the samba-cvs mailing list