From c6948ab9b30d851e5117c19768e8f21f9ad204c6 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Thu, 14 Jun 2018 16:17:09 +1000 Subject: [PATCH 1/5] ctdb-client: Fix typo where CTDB_BROADCAST_ALL is repeated Surely this is meant to be CTDB_BROADCAST_CONNECTED? BUG: https://bugzilla.samba.org/show_bug.cgi?id=13499 Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs (cherry picked from commit 77db0b15b56f9921961bd753c210e6fdbaf97f6d) --- ctdb/client/client_tunnel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctdb/client/client_tunnel.c b/ctdb/client/client_tunnel.c index 17b65469ae9..3ef78621712 100644 --- a/ctdb/client/client_tunnel.c +++ b/ctdb/client/client_tunnel.c @@ -432,7 +432,7 @@ struct tevent_req *ctdb_tunnel_request_send(TALLOC_CTX *mem_ctx, if (destnode == CTDB_BROADCAST_ALL || destnode == CTDB_BROADCAST_VNNMAP || - destnode == CTDB_BROADCAST_ALL) { + destnode == CTDB_BROADCAST_CONNECTED) { state->wait_for_reply = false; } if (! state->wait_for_reply) { -- 2.18.0 From 48de9965092da78fe7e19d141cfc92eaa523f005 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Fri, 15 Jun 2018 05:51:17 +1000 Subject: [PATCH 2/5] ctdb-tests: Add check for non-lmaster node status in integration tests BUG: https://bugzilla.samba.org/show_bug.cgi?id=13499 Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs (cherry picked from commit 4b008556d6b1f07fd5057af845526bf941497f18) --- ctdb/tests/scripts/integration.bash | 1 + 1 file changed, 1 insertion(+) diff --git a/ctdb/tests/scripts/integration.bash b/ctdb/tests/scripts/integration.bash index 91d4020b22d..5e68a2c60dc 100644 --- a/ctdb/tests/scripts/integration.bash +++ b/ctdb/tests/scripts/integration.bash @@ -336,6 +336,7 @@ node_has_status () (frozen) fpat='^[[:space:]]+frozen[[:space:]]+1$' ;; (unfrozen) fpat='^[[:space:]]+frozen[[:space:]]+0$' ;; (recovered) rpat='^Recovery mode:RECOVERY \(1\)$' ;; + (notlmaster) rpat="^hash:.* lmaster:${pnn}\$" ;; *) echo "node_has_status: unknown status \"$status\"" return 1 -- 2.18.0 From 9fa0764ef55d1c1efd1c306097c2bd55d6cdddc3 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Fri, 15 Jun 2018 05:51:45 +1000 Subject: [PATCH 3/5] ctdb-tests: Add a simple test for database traverses This tests that volatile databases traverse correctly, including the case where a record was updated on a non-lmaster node. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13499 Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs (cherry picked from commit ec72fadecd5233234947633360fe46a3a4053c07) --- ctdb/tests/simple/79_volatile_db_traverse.sh | 94 ++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 ctdb/tests/simple/79_volatile_db_traverse.sh diff --git a/ctdb/tests/simple/79_volatile_db_traverse.sh b/ctdb/tests/simple/79_volatile_db_traverse.sh new file mode 100755 index 00000000000..50732cab330 --- /dev/null +++ b/ctdb/tests/simple/79_volatile_db_traverse.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +test_info() +{ + cat < Date: Fri, 15 Jun 2018 06:01:52 +1000 Subject: [PATCH 4/5] ctdb-server: Rename CTDB_BROADCAST_VNNMAP -> CTDB_BROADCAST_ACTIVE This broadcast is misnamed. Both places where this type of broadcast is used expect the broadcast to go to all active nodes. Make the corresponding change to the semantics in the daemon by sending to all active nodes. There is a mismatch between the ideas of VNN map and active nodes. A node that is not in the VNN map but is active can still host database records. These were the same until the LMASTER capability was introduced and then the logic was not updated. The only place where the VNN map is relevant is when finding the location master of a record in the migration code. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13499 Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs (cherry picked from commit 36938bfdd075a174daecb466085702adfe6a6c09) --- ctdb/client/client_tunnel.c | 2 +- ctdb/protocol/protocol.h | 2 +- ctdb/protocol/protocol_debug.c | 4 ++-- ctdb/server/ctdb_control.c | 4 ++-- ctdb/server/ctdb_ltdb_server.c | 12 +++++++++--- ctdb/server/ctdb_server.c | 16 ++++++++++------ ctdb/server/ctdb_traverse.c | 4 ++-- 7 files changed, 27 insertions(+), 17 deletions(-) diff --git a/ctdb/client/client_tunnel.c b/ctdb/client/client_tunnel.c index 3ef78621712..f3b1a009231 100644 --- a/ctdb/client/client_tunnel.c +++ b/ctdb/client/client_tunnel.c @@ -431,7 +431,7 @@ struct tevent_req *ctdb_tunnel_request_send(TALLOC_CTX *mem_ctx, }; if (destnode == CTDB_BROADCAST_ALL || - destnode == CTDB_BROADCAST_VNNMAP || + destnode == CTDB_BROADCAST_ACTIVE || destnode == CTDB_BROADCAST_CONNECTED) { state->wait_for_reply = false; } diff --git a/ctdb/protocol/protocol.h b/ctdb/protocol/protocol.h index cb807e3b939..7189fab43f0 100644 --- a/ctdb/protocol/protocol.h +++ b/ctdb/protocol/protocol.h @@ -44,7 +44,7 @@ enum ctdb_operation { /* send a broadcast to all nodes in the cluster, active or not */ #define CTDB_BROADCAST_ALL 0xF0000002 /* send a broadcast to all nodes in the current vnn map */ -#define CTDB_BROADCAST_VNNMAP 0xF0000003 +#define CTDB_BROADCAST_ACTIVE 0xF0000003 /* send a broadcast to all connected nodes */ #define CTDB_BROADCAST_CONNECTED 0xF0000004 /* send a broadcast to selected connected nodes */ diff --git a/ctdb/protocol/protocol_debug.c b/ctdb/protocol/protocol_debug.c index 4e156639118..a34f5a86947 100644 --- a/ctdb/protocol/protocol_debug.c +++ b/ctdb/protocol/protocol_debug.c @@ -264,8 +264,8 @@ static void ctdb_pnn_print(uint32_t pnn, FILE *fp) fprintf(fp, "CURRENT"); } else if (pnn == CTDB_BROADCAST_ALL) { fprintf(fp, "ALL"); - } else if (pnn == CTDB_BROADCAST_VNNMAP) { - fprintf(fp, "VNNMAP"); + } else if (pnn == CTDB_BROADCAST_ACTIVE) { + fprintf(fp, "ACTIVE"); } else if (pnn == CTDB_BROADCAST_CONNECTED) { fprintf(fp, "CONNECTED"); } else if (pnn == CTDB_MULTICAST) { diff --git a/ctdb/server/ctdb_control.c b/ctdb/server/ctdb_control.c index b537cd1aefa..b812980ddf9 100644 --- a/ctdb/server/ctdb_control.c +++ b/ctdb/server/ctdb_control.c @@ -860,7 +860,7 @@ int ctdb_daemon_send_control(struct ctdb_context *ctdb, uint32_t destnode, return -1; } - if (((destnode == CTDB_BROADCAST_VNNMAP) || + if (((destnode == CTDB_BROADCAST_ACTIVE) || (destnode == CTDB_BROADCAST_ALL) || (destnode == CTDB_BROADCAST_CONNECTED)) && !(flags & CTDB_CTRL_FLAG_NOREPLY)) { @@ -868,7 +868,7 @@ int ctdb_daemon_send_control(struct ctdb_context *ctdb, uint32_t destnode, return -1; } - if (destnode != CTDB_BROADCAST_VNNMAP && + if (destnode != CTDB_BROADCAST_ACTIVE && destnode != CTDB_BROADCAST_ALL && destnode != CTDB_BROADCAST_CONNECTED && (!ctdb_validate_pnn(ctdb, destnode) || diff --git a/ctdb/server/ctdb_ltdb_server.c b/ctdb/server/ctdb_ltdb_server.c index c199aac2d1d..1962f854683 100644 --- a/ctdb/server/ctdb_ltdb_server.c +++ b/ctdb/server/ctdb_ltdb_server.c @@ -1535,9 +1535,15 @@ static void ctdb_ltdb_seqnum_check(struct tevent_context *ev, TDB_DATA data; data.dptr = (uint8_t *)&ctdb_db->db_id; data.dsize = sizeof(uint32_t); - ctdb_daemon_send_control(ctdb, CTDB_BROADCAST_VNNMAP, 0, - CTDB_CONTROL_UPDATE_SEQNUM, 0, CTDB_CTRL_FLAG_NOREPLY, - data, NULL, NULL); + ctdb_daemon_send_control(ctdb, + CTDB_BROADCAST_ACTIVE, + 0, + CTDB_CONTROL_UPDATE_SEQNUM, + 0, + CTDB_CTRL_FLAG_NOREPLY, + data, + NULL, + NULL); } ctdb_db->seqnum = new_seqnum; diff --git a/ctdb/server/ctdb_server.c b/ctdb/server/ctdb_server.c index 8e31038cc95..c991b85d99b 100644 --- a/ctdb/server/ctdb_server.c +++ b/ctdb/server/ctdb_server.c @@ -394,14 +394,18 @@ static void ctdb_broadcast_packet_all(struct ctdb_context *ctdb, } /* - broadcast a packet to all nodes in the current vnnmap + broadcast a packet to all active nodes */ -static void ctdb_broadcast_packet_vnnmap(struct ctdb_context *ctdb, +static void ctdb_broadcast_packet_active(struct ctdb_context *ctdb, struct ctdb_req_header *hdr) { int i; - for (i=0;ivnn_map->size;i++) { - hdr->destnode = ctdb->vnn_map->map[i]; + for (i = 0; i < ctdb->num_nodes; i++) { + if (ctdb->nodes[i]->flags & NODE_FLAGS_INACTIVE) { + continue; + } + + hdr->destnode = ctdb->nodes[i]->pnn; ctdb_queue_packet(ctdb, hdr); } } @@ -435,8 +439,8 @@ void ctdb_queue_packet(struct ctdb_context *ctdb, struct ctdb_req_header *hdr) case CTDB_BROADCAST_ALL: ctdb_broadcast_packet_all(ctdb, hdr); return; - case CTDB_BROADCAST_VNNMAP: - ctdb_broadcast_packet_vnnmap(ctdb, hdr); + case CTDB_BROADCAST_ACTIVE: + ctdb_broadcast_packet_active(ctdb, hdr); return; case CTDB_BROADCAST_CONNECTED: ctdb_broadcast_packet_connected(ctdb, hdr); diff --git a/ctdb/server/ctdb_traverse.c b/ctdb/server/ctdb_traverse.c index 04a41138a72..5ea19709599 100644 --- a/ctdb/server/ctdb_traverse.c +++ b/ctdb/server/ctdb_traverse.c @@ -387,8 +387,8 @@ static struct ctdb_traverse_all_handle *ctdb_daemon_traverse_all(struct ctdb_db_ } if (ctdb_db_volatile(ctdb_db)) { - /* normal database, traverse all nodes */ - destination = CTDB_BROADCAST_VNNMAP; + /* volatile database, traverse all active nodes */ + destination = CTDB_BROADCAST_ACTIVE; } else { int i; /* persistent database, traverse one node, preferably -- 2.18.0 From 4f960d7e74c275d0cda3873833d0c508bbbdd9f2 Mon Sep 17 00:00:00 2001 From: Martin Schwenke Date: Fri, 15 Jun 2018 06:07:54 +1000 Subject: [PATCH 5/5] ctdb-docs: Fix the documentation for VNN map It is incorrectly says that nodes not in the VNN map can not be DMASTER. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13499 Signed-off-by: Martin Schwenke Reviewed-by: Amitay Isaacs (cherry picked from commit af446d5209e37a38363911e5f339869b73d87963) --- ctdb/doc/ctdb.1.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/ctdb/doc/ctdb.1.xml b/ctdb/doc/ctdb.1.xml index 8dfca3b1a49..b7362a45171 100644 --- a/ctdb/doc/ctdb.1.xml +++ b/ctdb/doc/ctdb.1.xml @@ -292,10 +292,9 @@ Virtual Node Number (VNN) map Consists of the number of virtual nodes and mapping from - virtual node numbers to physical node numbers. Virtual - nodes host CTDB databases. Only nodes that are - participating in the VNN map can become lmaster or dmaster - for database records. + virtual node numbers to physical node numbers. Only nodes + that are participating in the VNN map can become lmaster for + database records. -- 2.18.0