The branch, master has been updated via 20c7196 ctdb/daemon: Optimise deletion of IPs via 9b90753 ctdb/daemon: Make delete IP wait until the IP is released via bafb915 ctdb-tests: Improve tickle tests via 058e14c ctdb-eventscripts: Fix regression in IP add/delete functions via ecafbce ctdb-daemon: Do not disable monitoring when running eventscripts via 87d58fd ctdb-eventscripts: Attach to persistent ctdb.tdb in "startup" event via 4f79fa6 ctdb-daemon: Fix tickle updates to recently started nodes via 441e099 ctdb-tools-ctdb: Parse IP addresses when reading a list from a file via fad2b6b ctdb-tools-ctdb: Remove redundant filtering of trailing empty lines via 555aa06 ctdb-tools-ctdb: Use DLIST_ADD_END() to avoid reversing the list via 91895b3 ctdb-tools-ctdb: Factor out function read_pnn_node_file() via 79d2800 ctdb-tests: Add "ctdb listnodes" and "ctdb xpnn" stub tests via 9bede49 ctdb-tools-ctdb: Read NAT gateway nodes from a separate function via ba69742 ctdb-tools-ctdb: Add and use function filter_nodemap_by_natgw_nodes() via e728a35 ctdb-tools-ctdb: Update LVS commands to use filter_nodemap_by_flags() via 26c9a59 ctdb-tools-ctdb: Update LVS commands to use filter_nodemap_by_capabilities() via 5fb7e38 ctdb-tools-ctdb: Fixes for "lvs" and "lvsmaster" commands via 33b1fcb ctdb-tools-ctdb: Generalise find_natgw() -> filter_nodemap_by_flags() via 798bd58 ctdb-tools-ctdb: Update natgwlist to filter nodes by NATGW capability via 7710053 ctdb-tests: New natgwlist tests where nodes capability not set via 75cf99b ctdb-tests: Update ctdb stub LVS tests and add some new ones via 3af858e ctdb-tests: Support fake capabilities in CTDB tool stub via 263e5ea ctdb-tests: Remove old, unused copy of a CTDB tool unit test via a947cf6 ctdb-tools-ctdb: Don't close stderr when running without_daemon commands from 7fdb21c ctdb/pmda: Fix metric identifiers
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 20c719677a28afa1d1b912b9fadbf384e9e65de7 Author: Martin Schwenke <mar...@meltin.net> Date: Wed Jan 22 17:01:19 2014 +1100 ctdb/daemon: Optimise deletion of IPs Previous commits maintained the ordering between ctdb_remove_orphaned_ifaces() and ctdb_vnn_unassign_iface(). This meant that ctdb_remove_orphaned_ifaces() needed to steal the orphaned interfaces and they would be freed later. Unassign the interface first and things get simpler. ctdb_remove_orphaned_ifaces() is now self-contained. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Sun Mar 23 06:20:43 CET 2014 on sn-devel-104 commit 9b907536fb657fa15c02858caf0ffff633ecd478 Author: Martin Schwenke <mar...@meltin.net> Date: Wed Jan 22 13:30:47 2014 +1100 ctdb/daemon: Make delete IP wait until the IP is released reloadips really expects deleted IPs to be released before completing. Otherwise the recovery daemon starts failing the local IP check. The races that follow can cause a node to be banned. To make the error handling simple, do the actual deletion in release_ip_callback(). Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit bafb9151ccb5722df36f9ba168716f4f4fa01cdc Author: Martin Schwenke <mar...@meltin.net> Date: Fri Feb 28 15:54:05 2014 +1100 ctdb-tests: Improve tickle tests It is hard to diagnose failures in the NFS tickle test because there's no way of telling if the test node doesn't have the tickle or if it didn't get propagated. Factor out check_tickles() into local.bash and give it some parameters. Have the NFS test call it first to ensure the tickle has been registered. Then use new function check_tickles_all() to ensure the tickle has been propagated to all nodes. Give this a bit of extra time (double the timeout) just in case we're racing with the update. Add a useful comment to the CIFS test so that I stop asking myself how the test could ever have worked reliably. :-) Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Pair-programmed-with: Amitay Isaacs <ami...@gmail.com> commit 058e14cdb0b6eb2e999dca599961ae6734105f99 Author: Martin Schwenke <mar...@meltin.net> Date: Fri Mar 14 13:14:18 2014 +1100 ctdb-eventscripts: Fix regression in IP add/delete functions Commit 176ae6c704528c021fcc34a41878584f43a00119 caused these functions to exit on failure. This is incorrect and broke NAT gateway. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit ecafbce1b1cf53ae8c3de9eb5201192f7fe1f67d Author: Martin Schwenke <mar...@meltin.net> Date: Tue Mar 4 15:06:11 2014 +1100 ctdb-daemon: Do not disable monitoring when running eventscripts This is racy and cbffbb7c2f406fc1d8ebad3c531cc2757232690e makes it unnecessary. The eventscript code still knows that monitor events are special compared to other events. However, the general concept of monitoring is no longer tangled up with running scripts. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 87d58fd07b1294688b8fc6dbdf3dbb6cb12d3a80 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 05:50:14 2014 +1100 ctdb-eventscripts: Attach to persistent ctdb.tdb in "startup" event "statd-callout notify" currently complains until an add-client or del-client is done. Given that we might use ctdb.tdb for something else in the future it makes sense attach to it in the "startup" event. This could be done in the background but it should be so lightweight that a timeout will indicate serious problems. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 4f79fa6c7c843502fcdaa2dead534ea3719b9f69 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Mar 13 16:53:15 2014 +1100 ctdb-daemon: Fix tickle updates to recently started nodes Commit 0723fedcedd4a97870f7b1224945f1587363c9bf added a cheap implemention of ctdb_control_startup() that simply flags the recipient node as needing to send updates for each IP when the tickle update loop next fires. Commit 026996550d726836091ff5ebd1ebf925bf237bb0 ensures that a node only sends tickle updates once being flagged to do so. CTDB_CONTROL_STARTUP is broadcast to all nodes, so this is a good start. However, the tickle updates are only broadcast to connected nodes. A recently started node may not yet be considered to be connected because the keepalive monitoring loop may not yet have marked the node as connected. This means that the tickle update loop races with the keepalive monitoring loop. If the tickle update loop wins then updates will not be sent to the recently started node. The simplest improvement is to stop the tickle update from depending on whether a node is connected or not. So instead of broadcasting tickle updates to connected nodes, they are broadcast to all nodes. Since no reply is expected, this should work just fine. While looking at this code, ctdb_ctrl_set_tcp_tickles() is named like a client function. It isn't a client function. Also, 2 of the arguments are ignored. So rename this function to ctdb_send_set_tcp_tickles_for_ip() and remove the ignored arguments. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Pair-programmed-with: Amitay Isaacs <ami...@gmail.com> commit 441e0998370bfd7b0de5dd9aed7e2abbcf64cf73 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 13:20:06 2014 +1100 ctdb-tools-ctdb: Parse IP addresses when reading a list from a file This way this logic is centralised. It also means that the IP address comparisons in the NAT gateway code are IPv6 safe. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit fad2b6b074495eb1dc036cce293456857985f8f5 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 16:23:42 2014 +1100 ctdb-tools-ctdb: Remove redundant filtering of trailing empty lines There is a check for empty lines in the loop just below. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 555aa06c41e7f77bf241e04ccf771009645e9c27 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 13:04:25 2014 +1100 ctdb-tools-ctdb: Use DLIST_ADD_END() to avoid reversing the list Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 91895b33c52c0a81904c3ea36042d4574422f5fd Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 12:57:30 2014 +1100 ctdb-tools-ctdb: Factor out function read_pnn_node_file() Factor it from read_nodes_file(). Use it there and in read_natgw_nodes_file(). Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 79d28000043bd463beecaeac47855d3a4970eaf2 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 17 13:42:35 2014 +1100 ctdb-tests: Add "ctdb listnodes" and "ctdb xpnn" stub tests Tests for xpnn need to implement a stub for ctdb_sys_have_ip(). The cheapest way of doing this is to read a fake nodemap using the existing code and check if the IP of the "current" node is the one being asked about. However, the fake state initialisation isn't currently available to without_daemon commands because it is meant to represent daemon state. However, it can be made available by moving the relevant code into a new stub for tevent_context_init(). The stub still needs to initialise a tevent context - this can be done by calling a lower level function. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 9bede494743f0ce13493fe718ed8f0c3c5f2959c Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 12:45:23 2014 +1100 ctdb-tools-ctdb: Read NAT gateway nodes from a separate function Now it gets easier to refactor. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit ba69742ccd822562ca2135d2466e09bf1216644b Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 3 11:41:32 2014 +1100 ctdb-tools-ctdb: Add and use function filter_nodemap_by_natgw_nodes() Add another filter function, like the ones for capabilities and flags to, for filtering by NAT gateway nodes. This makes the main natgw_list function more readable. Note that this drops the early filtering of disconnected nodes, so they will now be listed in a NAT gateway group. This makes sense. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit e728a35dc19c397cb17e1bf434401df25c35f337 Author: Martin Schwenke <mar...@meltin.net> Date: Wed Feb 19 18:45:18 2014 +1100 ctdb-tools-ctdb: Update LVS commands to use filter_nodemap_by_flags() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 26c9a591e539e33dd0896ec1e2958192b3e4efd4 Author: Martin Schwenke <mar...@meltin.net> Date: Wed Feb 19 17:12:08 2014 +1100 ctdb-tools-ctdb: Update LVS commands to use filter_nodemap_by_capabilities() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 5fb7e386ac4452786512d077a00b4907ef39cb51 Author: Martin Schwenke <mar...@meltin.net> Date: Fri Feb 28 20:16:34 2014 +1100 ctdb-tools-ctdb: Fixes for "lvs" and "lvsmaster" commands The index of the nodes array in nodemap isn't the PNN. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 33b1fcbd7083668cfd58b1cfb1172b6134cd07ca Author: Martin Schwenke <mar...@meltin.net> Date: Tue Feb 18 17:11:53 2014 +1100 ctdb-tools-ctdb: Generalise find_natgw() -> filter_nodemap_by_flags() Instead of just finding the first node that doesn't have any flags in flag_mask set, change it into a function that filters a nodemap to exclude nodes with the given flags. This makes the NATGW code simpler but also provides a function that can be used in other code. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 798bd58370f6ea7bc70db96edd23ae86caf6bf79 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Feb 18 15:52:37 2014 +1100 ctdb-tools-ctdb: Update natgwlist to filter nodes by NATGW capability Check capabilities once to build a filtered node list instead of repeatedly checking capabilities Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 771005386403acf15a81be5de2a3798384a37d8a Author: Martin Schwenke <mar...@meltin.net> Date: Tue Feb 18 12:29:44 2014 +1100 ctdb-tests: New natgwlist tests where nodes capability not set Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 75cf99b9da1677fa83197d111d757e14041dae05 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Feb 18 12:12:06 2014 +1100 ctdb-tests: Update ctdb stub LVS tests and add some new ones Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 3af858e6f4990599c23b54d05c42187400fd1426 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Feb 18 11:34:11 2014 +1100 ctdb-tests: Support fake capabilities in CTDB tool stub ... and add a test to make sure it works. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 263e5eabf8d55c7f53db597b8fcede831c211e45 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Feb 18 11:02:49 2014 +1100 ctdb-tests: Remove old, unused copy of a CTDB tool unit test This looks to have got left behind a long time ago when things got moved around... Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit a947cf6c0c3e1453ec833033dcd2edaa9490a55b Author: Martin Schwenke <mar...@meltin.net> Date: Mon Mar 17 13:28:14 2014 +1100 ctdb-tools-ctdb: Don't close stderr when running without_daemon commands It looks like the original without_daemon code still tried to establish a client connection to the daemon. Closing stderr looks to be a cheap way of hiding the errors when this failed. However, later cleanups avoid the client connection altogether, so do not close stderr. Now debug output from without_daemon commands actually appears. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: ctdb/config/events.d/00.ctdb | 3 +- ctdb/config/functions | 12 +- ctdb/include/ctdb_private.h | 9 +- ctdb/server/ctdb_control.c | 3 +- ctdb/server/ctdb_takeover.c | 150 ++++-- ctdb/server/eventscript.c | 5 - ctdb/tests/complex/31_nfs_tickle.sh | 24 +- ctdb/tests/complex/32_cifs_tickle.sh | 12 +- ctdb/tests/complex/scripts/local.bash | 29 ++ ctdb/tests/src/ctdb_test.c | 8 + ctdb/tests/src/ctdb_test_stubs.c | 60 +++- ctdb/tests/tool/scripts/local.sh | 11 + ctdb/tests/tool/stubby.getcapabilities.004.sh | 57 +++ ctdb/tests/tool/stubby.listnodes.001.sh | 20 + ctdb/tests/tool/stubby.listnodes.002.sh | 20 + ctdb/tests/tool/stubby.lvs.001.sh | 3 +- ctdb/tests/tool/stubby.lvs.002.sh | 29 ++ ctdb/tests/tool/stubby.lvs.003.sh | 28 ++ ctdb/tests/tool/stubby.lvsmaster.001.sh | 3 +- ctdb/tests/tool/stubby.lvsmaster.002.sh | 1 - ctdb/tests/tool/stubby.lvsmaster.003.sh | 27 ++ ctdb/tests/tool/stubby.lvsmaster.004.sh | 27 ++ ctdb/tests/tool/stubby.lvsmaster.005.sh | 27 ++ ctdb/tests/tool/stubby.lvsmaster.006.sh | 27 ++ ctdb/tests/tool/stubby.lvsmaster.007.sh | 27 ++ ctdb/tests/tool/stubby.natgwlist.006.sh | 37 ++ ctdb/tests/tool/stubby.natgwlist.007.sh | 37 ++ ctdb/tests/tool/stubby.xpnn.001.sh | 20 + ctdb/tests/tool/stubby.xpnn.002.sh | 20 + ctdb/tests/tool/stubby.xpnn.003.sh | 24 + ctdb/tests/tool/testcases/stubby.nodestatus.005.sh | 34 -- ctdb/tools/ctdb.c | 493 ++++++++++---------- 32 files changed, 916 insertions(+), 371 deletions(-) create mode 100755 ctdb/tests/tool/stubby.getcapabilities.004.sh create mode 100755 ctdb/tests/tool/stubby.listnodes.001.sh create mode 100755 ctdb/tests/tool/stubby.listnodes.002.sh create mode 100755 ctdb/tests/tool/stubby.lvs.002.sh create mode 100755 ctdb/tests/tool/stubby.lvs.003.sh create mode 100755 ctdb/tests/tool/stubby.lvsmaster.003.sh create mode 100755 ctdb/tests/tool/stubby.lvsmaster.004.sh create mode 100755 ctdb/tests/tool/stubby.lvsmaster.005.sh create mode 100755 ctdb/tests/tool/stubby.lvsmaster.006.sh create mode 100755 ctdb/tests/tool/stubby.lvsmaster.007.sh create mode 100755 ctdb/tests/tool/stubby.natgwlist.006.sh create mode 100755 ctdb/tests/tool/stubby.natgwlist.007.sh create mode 100755 ctdb/tests/tool/stubby.xpnn.001.sh create mode 100755 ctdb/tests/tool/stubby.xpnn.002.sh create mode 100755 ctdb/tests/tool/stubby.xpnn.003.sh delete mode 100755 ctdb/tests/tool/testcases/stubby.nodestatus.005.sh Changeset truncated at 500 lines: diff --git a/ctdb/config/events.d/00.ctdb b/ctdb/config/events.d/00.ctdb index 719bee8..a0f4102 100755 --- a/ctdb/config/events.d/00.ctdb +++ b/ctdb/config/events.d/00.ctdb @@ -196,12 +196,13 @@ case "$1" in fi ;; - setup) + setup) # Set any tunables from the config file set_ctdb_variables || die "Failed to set CTDB tunables" ;; startup) + ctdb attach ctdb.tdb persistent update_config_from_tdb & ;; monitor) diff --git a/ctdb/config/functions b/ctdb/config/functions index 6efe60f..6bc0312 100755 --- a/ctdb/config/functions +++ b/ctdb/config/functions @@ -832,8 +832,10 @@ add_ip_to_iface () ip link set "$_iface" up || \ die "Failed to bringup interface $_iface" - ip addr add "$_ip/$_maskbits" brd + dev "$_iface" || \ - die "Failed to add $_ip/$_maskbits on dev $_iface" + ip addr add "$_ip/$_maskbits" brd + dev "$_iface" || { + echo "Failed to add $_ip/$_maskbits on dev $_iface" + return 1 + } } delete_ip_from_iface() @@ -849,8 +851,10 @@ delete_ip_from_iface() # remembering and re-adding secondaries. set_proc "sys/net/ipv4/conf/${_iface}/promote_secondaries" 1 - ip addr del "$_ip/$_maskbits" dev "$_iface" || \ - die "Failed to del $_ip on dev $_iface" + ip addr del "$_ip/$_maskbits" dev "$_iface" || { + echo "Failed to del $_ip on dev $_iface" + return 1 + } } # If the given IP is hosted then print 2 items: maskbits and iface diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index b95b2c7..8ed867d 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -212,6 +212,11 @@ struct ctdb_vnn { /* Set to true any time an update to this VNN is in flight. This helps to avoid races. */ bool update_in_flight; + + /* If CTDB_CONTROL_DEL_PUBLIC_IP is received for this IP + * address then this flag is set. It will be deleted in the + * release IP callback. */ + bool delete_pending; }; /* @@ -1264,7 +1269,9 @@ int32_t ctdb_control_list_tunables(struct ctdb_context *ctdb, TDB_DATA *outdata) int32_t ctdb_control_try_delete_records(struct ctdb_context *ctdb, TDB_DATA indata, TDB_DATA *outdata); int32_t ctdb_control_receive_records(struct ctdb_context *ctdb, TDB_DATA indata, TDB_DATA *outdata); int32_t ctdb_control_add_public_address(struct ctdb_context *ctdb, TDB_DATA indata); -int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, TDB_DATA indata); +int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, + struct ctdb_req_control *c, + TDB_DATA recdata, bool *async_reply); void ctdb_tunables_set_defaults(struct ctdb_context *ctdb); diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c index 581c478..b407a1f 100644 --- a/ctdb/server/ctdb_control.c +++ b/ctdb/server/ctdb_control.c @@ -481,7 +481,8 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, return ctdb_control_add_public_address(ctdb, indata); case CTDB_CONTROL_DEL_PUBLIC_IP: - return ctdb_control_del_public_address(ctdb, indata); + return ctdb_control_del_public_address(ctdb, c, indata, + async_reply); case CTDB_CONTROL_GET_CAPABILITIES: return ctdb_control_get_capabilities(ctdb, outdata); diff --git a/ctdb/server/ctdb_takeover.c b/ctdb/server/ctdb_takeover.c index 34b210e..bbb0226 100644 --- a/ctdb/server/ctdb_takeover.c +++ b/ctdb/server/ctdb_takeover.c @@ -118,19 +118,20 @@ static bool vnn_has_interface_with_name(struct ctdb_vnn *vnn, * causes problems... :-) */ static void ctdb_remove_orphaned_ifaces(struct ctdb_context *ctdb, - struct ctdb_vnn *vnn, - TALLOC_CTX *mem_ctx) + struct ctdb_vnn *vnn) { struct ctdb_iface *i; /* For each interface, check if there's an IP using it. */ - for(i=ctdb->ifaces; i; i=i->next) { + i = ctdb->ifaces; + while (i != NULL) { struct ctdb_vnn *tv; bool found; + struct ctdb_iface *next = i->next; /* Only consider interfaces named in the given VNN. */ if (!vnn_has_interface_with_name(vnn, i->name)) { - continue; + goto next; } /* Is the "single IP" on this interface? */ @@ -138,7 +139,7 @@ static void ctdb_remove_orphaned_ifaces(struct ctdb_context *ctdb, (ctdb->single_ip_vnn->ifaces[0] != NULL) && (strcmp(i->name, ctdb->single_ip_vnn->ifaces[0]) == 0)) { /* Found, next interface please... */ - continue; + goto next; } /* Search for a vnn with this interface. */ found = false; @@ -152,9 +153,11 @@ static void ctdb_remove_orphaned_ifaces(struct ctdb_context *ctdb, if (!found) { /* None of the VNNs are using this interface. */ DLIST_REMOVE(ctdb->ifaces, i); - /* Caller will free mem_ctx when convenient. */ - talloc_steal(mem_ctx, i); + talloc_free(i); } + + next: + i = next; } } @@ -260,6 +263,10 @@ static bool ctdb_vnn_available(struct ctdb_context *ctdb, { int i; + if (vnn->delete_pending) { + return false; + } + if (vnn->iface && vnn->iface->link_up) { return true; } @@ -865,6 +872,14 @@ static void release_kill_clients(struct ctdb_context *ctdb, ctdb_sock_addr *addr } } +static void do_delete_ip(struct ctdb_context *ctdb, struct ctdb_vnn *vnn) +{ + DLIST_REMOVE(ctdb->vnn, vnn); + ctdb_vnn_unassign_iface(ctdb, vnn); + ctdb_remove_orphaned_ifaces(ctdb, vnn); + talloc_free(vnn); +} + /* called when releaseip event finishes */ @@ -903,6 +918,12 @@ static void release_ip_callback(struct ctdb_context *ctdb, int status, ctdb_vnn_unassign_iface(ctdb, state->vnn); + /* Process the IP if it has been marked for deletion */ + if (state->vnn->delete_pending) { + do_delete_ip(ctdb, state->vnn); + state->vnn = NULL; + } + /* the control succeeded */ ctdb_request_control_reply(ctdb, state->c, NULL, 0, NULL); talloc_free(state); @@ -910,7 +931,9 @@ static void release_ip_callback(struct ctdb_context *ctdb, int status, static int ctdb_releaseip_destructor(struct takeover_callback_state *state) { - state->vnn->update_in_flight = false; + if (state->vnn != NULL) { + state->vnn->update_in_flight = false; + } return 0; } @@ -3959,10 +3982,9 @@ int32_t ctdb_control_get_tcp_tickle_list(struct ctdb_context *ctdb, TDB_DATA ind /* set the list of all tcp tickles for a public address */ -static int ctdb_ctrl_set_tcp_tickles(struct ctdb_context *ctdb, - struct timeval timeout, uint32_t destnode, - ctdb_sock_addr *addr, - struct ctdb_tcp_array *tcparray) +static int ctdb_send_set_tcp_tickles_for_ip(struct ctdb_context *ctdb, + ctdb_sock_addr *addr, + struct ctdb_tcp_array *tcparray) { int ret, num; TDB_DATA data; @@ -3987,7 +4009,7 @@ static int ctdb_ctrl_set_tcp_tickles(struct ctdb_context *ctdb, memcpy(&list->tickles.connections[0], tcparray->connections, sizeof(struct ctdb_tcp_connection) * num); } - ret = ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_CONNECTED, 0, + ret = ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_ALL, 0, CTDB_CONTROL_SET_TCP_TICKLE_LIST, 0, CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL); if (ret != 0) { @@ -4023,11 +4045,9 @@ static void ctdb_update_tcp_tickles(struct event_context *ev, if (!vnn->tcp_update_needed) { continue; } - ret = ctdb_ctrl_set_tcp_tickles(ctdb, - TAKEOVER_TIMEOUT(), - CTDB_BROADCAST_CONNECTED, - &vnn->public_address, - vnn->tcp_array); + ret = ctdb_send_set_tcp_tickles_for_ip(ctdb, + &vnn->public_address, + vnn->tcp_array); if (ret != 0) { DEBUG(DEBUG_ERR,("Failed to send the tickle update for public address %s\n", ctdb_addr_to_str(&vnn->public_address))); @@ -4168,20 +4188,32 @@ int32_t ctdb_control_add_public_address(struct ctdb_context *ctdb, TDB_DATA inda return 0; } +struct delete_ip_callback_state { + struct ctdb_req_control *c; +}; + /* called when releaseip event finishes for del_public_address */ -static void delete_ip_callback(struct ctdb_context *ctdb, int status, - void *private_data) +static void delete_ip_callback(struct ctdb_context *ctdb, + int32_t status, TDB_DATA data, + const char *errormsg, + void *private_data) { + struct delete_ip_callback_state *state = + talloc_get_type(private_data, struct delete_ip_callback_state); + + /* If release failed then fail. */ + ctdb_request_control_reply(ctdb, state->c, NULL, status, errormsg); talloc_free(private_data); } -int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, TDB_DATA indata) +int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, + struct ctdb_req_control *c, + TDB_DATA indata, bool *async_reply) { struct ctdb_control_ip_iface *pub = (struct ctdb_control_ip_iface *)indata.dptr; struct ctdb_vnn *vnn; - int ret; /* verify the size of indata */ if (indata.dsize < offsetof(struct ctdb_control_ip_iface, iface)) { @@ -4204,37 +4236,63 @@ int32_t ctdb_control_del_public_address(struct ctdb_context *ctdb, TDB_DATA inda /* walk over all public addresses until we find a match */ for (vnn=ctdb->vnn;vnn;vnn=vnn->next) { if (ctdb_same_ip(&vnn->public_address, &pub->addr)) { - TALLOC_CTX *mem_ctx = talloc_new(ctdb); - - DLIST_REMOVE(ctdb->vnn, vnn); - talloc_steal(mem_ctx, vnn); - ctdb_remove_orphaned_ifaces(ctdb, vnn, mem_ctx); - if (vnn->pnn != ctdb->pnn) { - if (vnn->iface != NULL) { - ctdb_vnn_unassign_iface(ctdb, vnn); + if (vnn->pnn == ctdb->pnn) { + struct delete_ip_callback_state *state; + struct ctdb_public_ip *ip; + TDB_DATA data; + int ret; + + vnn->delete_pending = true; + + state = talloc(ctdb, + struct delete_ip_callback_state); + CTDB_NO_MEMORY(ctdb, state); + state->c = c; + + ip = talloc(state, struct ctdb_public_ip); + if (ip == NULL) { + DEBUG(DEBUG_ERR, + (__location__ " Out of memory\n")); + talloc_free(state); + return -1; + } + ip->pnn = -1; + ip->addr = pub->addr; + + data.dsize = sizeof(struct ctdb_public_ip); + data.dptr = (unsigned char *)ip; + + ret = ctdb_daemon_send_control(ctdb, + ctdb_get_pnn(ctdb), + 0, + CTDB_CONTROL_RELEASE_IP, + 0, 0, + data, + delete_ip_callback, + state); + if (ret == -1) { + DEBUG(DEBUG_ERR, + (__location__ "Unable to send " + "CTDB_CONTROL_RELEASE_IP\n")); + talloc_free(state); + return -1; } - talloc_free(mem_ctx); - return 0; - } - vnn->pnn = -1; - ret = ctdb_event_script_callback(ctdb, - mem_ctx, delete_ip_callback, mem_ctx, - CTDB_EVENT_RELEASE_IP, - "%s %s %u", - ctdb_vnn_iface_string(vnn), - ctdb_addr_to_str(&vnn->public_address), - vnn->public_netmask_bits); - if (vnn->iface != NULL) { - ctdb_vnn_unassign_iface(ctdb, vnn); - } - if (ret != 0) { - return -1; + state->c = talloc_steal(state, c); + *async_reply = true; + } else { + /* This IP is not hosted on the + * current node so just delete it + * now. */ + do_delete_ip(ctdb, vnn); } + return 0; } } + DEBUG(DEBUG_ERR,("Delete IP of unknown public IP address %s\n", + ctdb_addr_to_str(&pub->addr))); return -1; } diff --git a/ctdb/server/eventscript.c b/ctdb/server/eventscript.c index ed20124..bf95b21 100644 --- a/ctdb/server/eventscript.c +++ b/ctdb/server/eventscript.c @@ -901,8 +901,6 @@ static void run_eventscripts_callback(struct ctdb_context *ctdb, int status, struct eventscript_callback_state *state = talloc_get_type(private_data, struct eventscript_callback_state); - ctdb_enable_monitoring(ctdb); - if (status != 0) { DEBUG(DEBUG_ERR,(__location__ " Failed to run eventscripts\n")); } @@ -966,14 +964,11 @@ int32_t ctdb_run_eventscripts(struct ctdb_context *ctdb, DEBUG(DEBUG_NOTICE,("Running eventscripts with arguments %s\n", indata.dptr)); - ctdb_disable_monitoring(ctdb); - ret = ctdb_event_script_callback(ctdb, state, run_eventscripts_callback, state, call, "%s", options); if (ret != 0) { - ctdb_enable_monitoring(ctdb); DEBUG(DEBUG_ERR,(__location__ " Failed to run eventscripts with arguments %s\n", indata.dptr)); talloc_free(state); return -1; diff --git a/ctdb/tests/complex/31_nfs_tickle.sh b/ctdb/tests/complex/31_nfs_tickle.sh index b5ed47e..5aeb870 100755 --- a/ctdb/tests/complex/31_nfs_tickle.sh +++ b/ctdb/tests/complex/31_nfs_tickle.sh @@ -34,8 +34,8 @@ Steps: Expected results: -* CTDB should correctly record the socket in the nfs-tickles directory - and should send a reset packet when the node is disabled. +* CTDB should correctly record the socket and should send a reset + packet when the node is disabled. EOF } @@ -58,6 +58,8 @@ monitor_interval="${out#*= }" #echo "Monitor interval on node $test_node is $monitor_interval seconds." select_test_node_and_ips +try_command_on_node $test_node "$CTDB listnodes | wc -l" +numnodes="$out" test_port=2049 @@ -73,18 +75,16 @@ echo "Source socket is $src_socket" wait_for_monitor_event $test_node -echo "Sleeping until tickles are synchronised across nodes..." -try_command_on_node $test_node $CTDB getvar TickleUpdateInterval -sleep_for "${out#*= }" +echo "Wait until NFS connection is tracked by CTDB on test node ..." +wait_until 10 check_tickles $test_node $test_ip $test_port $src_socket -try_command_on_node -v any "ctdb -Y gettickles $test_ip $test_port" +echo "Getting TicklesUpdateInterval..." +try_command_on_node $test_node $CTDB getvar TickleUpdateInterval +update_interval="$out" -if [ "${out/${src_socket}/}" != "$out" ] ; then - echo "GOOD: NFS connection tracked OK." -else - echo "BAD: Socket not tracked in NFS tickles." - testfailures=1 -fi +echo "Wait until NFS connection is tracked by CTDB on all nodes..." +wait_until $(($update_interval * 2)) \ + check_tickles_all $numnodes $test_ip $test_port $src_socket tcptickle_sniff_start $src_socket "${test_ip}:${test_port}" diff --git a/ctdb/tests/complex/32_cifs_tickle.sh b/ctdb/tests/complex/32_cifs_tickle.sh index 93634e7..70ce93f 100755 --- a/ctdb/tests/complex/32_cifs_tickle.sh +++ b/ctdb/tests/complex/32_cifs_tickle.sh @@ -72,15 +72,8 @@ echo "Source socket is $src_socket" # This should happen as soon as connection is up... but unless we wait # we sometimes beat the registration. -check_tickles () -{ - try_command_on_node 0 ctdb gettickles $test_ip -n $test_node - # SRC: 10.0.2.45:49091 DST: 10.0.2.143:445 - [ "${out/SRC: ${src_socket} /}" != "$out" ] -} - echo "Checking if CIFS connection is tracked by CTDB..." -wait_until 10 check_tickles +wait_until 10 check_tickles $test_node $test_ip $test_port $src_socket echo "$out" if [ "${out/SRC: ${src_socket} /}" != "$out" ] ; then @@ -92,6 +85,9 @@ fi tcptickle_sniff_start $src_socket "${test_ip}:${test_port}" +# The test node is only being disabled so the tickling is done from +# the test node. We don't need to wait until the tickles are +# transferred to another node. echo "Disabling node $test_node" try_command_on_node 1 $CTDB disable -n $test_node wait_until_node_has_status $test_node disabled diff --git a/ctdb/tests/complex/scripts/local.bash b/ctdb/tests/complex/scripts/local.bash index eb4c41c..6fbc1ae 100644 --- a/ctdb/tests/complex/scripts/local.bash +++ b/ctdb/tests/complex/scripts/local.bash @@ -29,6 +29,35 @@ wait_until_get_src_socket () ####################################### +check_tickles () +{ + local node="$1" + local test_ip="$2" + local test_port="$3" + local src_socket="$4" + try_command_on_node $node ctdb gettickles $test_ip $test_port + # SRC: 10.0.2.45:49091 DST: 10.0.2.143:445 + [ "${out/SRC: ${src_socket} /}" != "$out" ] +} + +check_tickles_all () +{ + local numnodes="$1" + local test_ip="$2" + local test_port="$3" + local src_socket="$4" + + try_command_on_node all ctdb gettickles $test_ip $test_port + # SRC: 10.0.2.45:49091 DST: 10.0.2.143:445 + local t="${src_socket//./\\.}" + local count=$(grep -E -c "SRC: ${t} " <<<"$out" || true) + [ $count -eq $numnodes ] +} + + + -- Samba Shared Repository