diff options
author | Harald Musum <musum@yahooinc.com> | 2022-09-05 09:39:27 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2022-09-05 09:39:27 +0200 |
commit | 6bce84a6c373670fc923624096524f9892f9b165 (patch) | |
tree | 6ff5115af9ef0c5af3e7311355690540fa2ac7ca /clustercontroller-core | |
parent | d2b97d2d8a546476d51ce8a6351c1bb1accb4716 (diff) |
Remove support for 'setsystemstate2' RPC method in cluster controller
Diffstat (limited to 'clustercontroller-core')
16 files changed, 65 insertions, 291 deletions
diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeInfo.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeInfo.java index 746432f1d38..3f1a7ab5d7b 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeInfo.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/NodeInfo.java @@ -98,9 +98,6 @@ abstract public class NodeInfo implements Comparable<NodeInfo> { private int prematureCrashCount = 0; - /** Remember last time we adjusted version, such that if we had multiple requests pending when we did, we can avoid printing error right after. */ - private long adjustedVersionTime = 0; - private HostInfo hostInfo = HostInfo.createHostInfo("{}"); private Group group; @@ -382,29 +379,6 @@ abstract public class NodeInfo implements Comparable<NodeInfo> { return nextAttemptTime; } - /** @return True if we demoted communication version so this can be valid error. */ - public boolean notifyNoSuchMethodError(String methodName, Timer timer) { - if (methodName.equals(RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_METHOD_NAME)) { - if (version == RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_VERSION) { - downgradeToRpcVersion(RPCCommunicator.LEGACY_SET_SYSTEM_STATE2_RPC_VERSION, methodName, timer); - return true; - } else if (timer.getCurrentTimeInMillis() - 2000 < adjustedVersionTime) { - log.log(Level.FINE, () -> "Node " + toString() + " does not support " + methodName + " call. Version already downgraded, so ignoring it."); - return true; - } - } - log.log(Level.WARNING, "Node " + toString() + " does not support " + methodName + " which it should."); - return false; - } - - private void downgradeToRpcVersion(int newVersion, String methodName, Timer timer) { - log.log(Level.FINE, () -> String.format("Node %s does not support %s call. Downgrading to version %d.", - toString(), methodName, newVersion)); - version = newVersion; - nextAttemptTime = 0; - adjustedVersionTime = timer.getCurrentTimeInMillis(); - } - public Target getConnection() { return connection; } diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicator.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicator.java index 3738a17f4b6..58bbd03044f 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicator.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicator.java @@ -37,15 +37,18 @@ public class RPCCommunicator implements Communicator { public static final Logger log = Logger.getLogger(RPCCommunicator.class.getName()); + // Rpc method versions and Vespa versions which supports each version: + // 0 - 4.1 + // 1 - 4.2-5.0.10 + // 2 - 5.0.11-8.48.3 + // 3 - 6.220+ + // 4 - 7.24+ public static final int ACTIVATE_CLUSTER_STATE_VERSION_RPC_VERSION = 4; public static final String ACTIVATE_CLUSTER_STATE_VERSION_RPC_METHOD_NAME = "activate_cluster_state_version"; public static final int SET_DISTRIBUTION_STATES_RPC_VERSION = 3; public static final String SET_DISTRIBUTION_STATES_RPC_METHOD_NAME = "setdistributionstates"; - public static final int LEGACY_SET_SYSTEM_STATE2_RPC_VERSION = 2; - public static final String LEGACY_SET_SYSTEM_STATE2_RPC_METHOD_NAME = "setsystemstate2"; - private final Timer timer; private final Supervisor supervisor; private Duration nodeStateRequestTimeoutIntervalMax; @@ -121,7 +124,7 @@ public class RPCCommunicator implements Communicator { req.parameters().add(new Int32Value(fleetControllerIndex)); RPCGetNodeStateRequest stateRequest = new RPCGetNodeStateRequest(node, req); - RPCGetNodeStateWaiter waiter = new RPCGetNodeStateWaiter(stateRequest, externalWaiter, timer); + RPCGetNodeStateWaiter waiter = new RPCGetNodeStateWaiter(stateRequest, externalWaiter); Duration requestTimeout = nodeStateRequestTimeoutIntervalMax.plus(nodeStateRequestRoundTripTimeMax); @@ -140,20 +143,13 @@ public class RPCCommunicator implements Communicator { log.log(Level.FINE, () -> String.format("Connection to '%s' could not be created.", node.getRpcAddress())); return; } - int nodeVersion = node.getVersion(); - Request req; - if (nodeVersion <= 2) { - req = new Request(LEGACY_SET_SYSTEM_STATE2_RPC_METHOD_NAME); - req.parameters().add(new StringValue(baselineState.toString(false))); - } else { - req = new Request(SET_DISTRIBUTION_STATES_RPC_METHOD_NAME); - SlimeClusterStateBundleCodec codec = new SlimeClusterStateBundleCodec(); - EncodedClusterStateBundle encodedBundle = codec.encode(stateBundle); - Values v = req.parameters(); - v.add(new Int8Value(encodedBundle.getCompression().type().getCode())); - v.add(new Int32Value(encodedBundle.getCompression().uncompressedSize())); - v.add(new DataValue(encodedBundle.getCompression().data())); - } + Request req = new Request(SET_DISTRIBUTION_STATES_RPC_METHOD_NAME); + SlimeClusterStateBundleCodec codec = new SlimeClusterStateBundleCodec(); + EncodedClusterStateBundle encodedBundle = codec.encode(stateBundle); + Values v = req.parameters(); + v.add(new Int8Value(encodedBundle.getCompression().type().getCode())); + v.add(new Int32Value(encodedBundle.getCompression().uncompressedSize())); + v.add(new DataValue(encodedBundle.getCompression().data())); log.log(Level.FINE, () -> String.format("Sending '%s' RPC to %s for state version %d", req.methodName(), node.getRpcAddress(), stateBundle.getVersion())); diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCGetNodeStateWaiter.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCGetNodeStateWaiter.java index 5f77e831918..74ce1668b2b 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCGetNodeStateWaiter.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCGetNodeStateWaiter.java @@ -6,7 +6,6 @@ import com.yahoo.jrt.Request; import com.yahoo.jrt.RequestWaiter; import com.yahoo.vespa.clustercontroller.core.Communicator; import com.yahoo.vespa.clustercontroller.core.GetNodeStateRequest; -import com.yahoo.vespa.clustercontroller.core.Timer; /** * Handles the reply to a get node state request to a node. @@ -15,23 +14,13 @@ public class RPCGetNodeStateWaiter implements RequestWaiter { private final RPCGetNodeStateRequest request; private final Communicator.Waiter<GetNodeStateRequest> waiter; - private final Timer timer; - public RPCGetNodeStateWaiter(RPCGetNodeStateRequest request, - Communicator.Waiter<GetNodeStateRequest> waiter, Timer timer) { + public RPCGetNodeStateWaiter(RPCGetNodeStateRequest request, Communicator.Waiter<GetNodeStateRequest> waiter) { this.request = request; this.waiter = waiter; - this.timer = timer; } private GetNodeStateRequest.Reply convertToReply(Request req) { - if (req.errorCode() == ErrorCode.NO_SUCH_METHOD) { - // If we get no such method error, and we downgrade version, we must retry. May be ok that it doesn't exist - if (request.getNodeInfo().notifyNoSuchMethodError(req.methodName(), timer)) { - return new GetNodeStateRequest.Reply(Communicator.TRANSIENT_ERROR, "Downgrading version"); - } - } - if (req.isError()) { return new GetNodeStateRequest.Reply(req.errorCode(), req.errorMessage()); } diff --git a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCSetClusterStateWaiter.java b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCSetClusterStateWaiter.java index 89f37173701..41fc7f67fbb 100644 --- a/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCSetClusterStateWaiter.java +++ b/clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCSetClusterStateWaiter.java @@ -30,13 +30,7 @@ public class RPCSetClusterStateWaiter implements RequestWaiter { public SetClusterStateRequest.Reply getReply(Request req) { NodeInfo info = request.getNodeInfo(); - if (req.methodName().equals(RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_METHOD_NAME) - || req.methodName().equals(RPCCommunicator.LEGACY_SET_SYSTEM_STATE2_RPC_METHOD_NAME)) { - if (req.isError() && req.errorCode() == ErrorCode.NO_SUCH_METHOD) { - if (info.notifyNoSuchMethodError(req.methodName(), timer)) { - return new SetClusterStateRequest.Reply(Communicator.TRANSIENT_ERROR, "Trying lower version"); - } - } + if (req.methodName().equals(RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_METHOD_NAME)) { if (req.isError()) { return new SetClusterStateRequest.Reply(req.errorCode(), req.errorMessage()); } else if (!req.checkReturnTypes("")) { diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DistributionBitCountTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DistributionBitCountTest.java index 0f2e2e23492..f7e376c419d 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DistributionBitCountTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DistributionBitCountTest.java @@ -26,7 +26,7 @@ public class DistributionBitCountTest extends FleetControllerTest { builder.setDistributionBits(17); setUpFleetController(false, builder); startingTest(testName); - List<DummyVdsNode> nodes = setUpVdsNodes(false, new DummyVdsNodeOptions(), true, configuredNodes); + List<DummyVdsNode> nodes = setUpVdsNodes(false, true, configuredNodes); for (DummyVdsNode node : nodes) { node.setNodeState(new NodeState(node.getType(), State.UP).setMinUsedBits(20)); node.connect(); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNode.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNode.java index fbaf41fdd47..5981c2a1cf6 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNode.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNode.java @@ -33,8 +33,6 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import static ai.vespa.validation.Validation.requireAtLeast; - /** * * Used to fake a node in VDS, such that we can test the fleetcontroller without dummy interface for talking to @@ -53,8 +51,6 @@ public class DummyVdsNode { private Supervisor supervisor; private Acceptor acceptor; private Register register; - private final int stateCommunicationVersion; - private boolean negotiatedHandle = false; private final Timer timer; private boolean failSetSystemStateRequests = false; private boolean resetTimestampOnReconnect = false; @@ -120,7 +116,7 @@ public class DummyVdsNode { } }; - public DummyVdsNode(Timer timer, DummyVdsNodeOptions options, String[] slobrokConnectionSpecs, String clusterName, + public DummyVdsNode(Timer timer, String[] slobrokConnectionSpecs, String clusterName, NodeType nodeType, int index) throws Exception { this.timer = timer; this.slobrokConnectionSpecs = slobrokConnectionSpecs; @@ -128,7 +124,6 @@ public class DummyVdsNode { type = nodeType; this.index = index; this.nodeState = new NodeState(type, State.UP); - this.stateCommunicationVersion = requireAtLeast(options.stateCommunicationVersion, "state communication version cannot be less than 2", 2); messageResponder.start(); nodeState.setStartTimestamp(timer.getCurrentTimeInMillis() / 1000); } @@ -154,7 +149,6 @@ public class DummyVdsNode { slist.setup(slobrokConnectionSpecs); register = new Register(supervisor, slist, new Spec("localhost", acceptor.port()), new BackOff()); registerSlobrok(); - negotiatedHandle = false; return acceptor.port(); } @@ -197,8 +191,6 @@ public class DummyVdsNode { return new Node(type, index); } - public int getStateCommunicationVersion() { return stateCommunicationVersion; } - void waitForSystemStateVersion(int version, Duration timeout) { try { Instant endTime = Instant.now().plus(timeout); @@ -302,58 +294,32 @@ public class DummyVdsNode { m.returnDesc(0, "returnCode", "Returncode of request. Should be 0 = OK"); supervisor.addMethod(m); - m = new Method("setsystemstate", "s", "is", this::rpc_setSystemState); - m.methodDesc("Set system state of entire system"); - m.paramDesc(0, "systemState", "new systemstate"); - m.returnDesc(0, "returnCode", "Returncode of request. Should be 1 = OK"); - m.returnDesc(1, "returnMessage", "Textual error message if returncode is not ok."); + m = new Method("getnodestate3", "sii", "ss", this::rpc_getNodeState2); + m.methodDesc("Get nodeState of a node, answer when state changes from given state."); + m.paramDesc(0, "nodeStateIn", "The node state of the given node"); + m.paramDesc(1, "timeout", "Time timeout in milliseconds set by the state requester."); + m.returnDesc(0, "nodeStateOut", "The node state of the given node"); + m.returnDesc(1, "hostinfo", "Information on the host node is running on"); supervisor.addMethod(m); - if (stateCommunicationVersion > 0) { - m = new Method("getnodestate2", "si", "s", this::rpc_getNodeState2); - m.methodDesc("Get nodeState of a node, answer when state changes from given state."); - m.paramDesc(0, "nodeStateIn", "The node state of the given node"); - m.paramDesc(1, "timeout", "Time timeout in milliseconds set by the state requester."); - m.returnDesc(0, "nodeStateOut", "The node state of the given node"); - supervisor.addMethod(m); - - m = new Method("setsystemstate2", "s", "", this::rpc_setSystemState2); - m.methodDesc("Set system state of entire system"); - m.paramDesc(0, "systemState", "new systemstate"); - supervisor.addMethod(m); - - if (stateCommunicationVersion > 1) { - m = new Method("getnodestate3", "sii", "ss", this::rpc_getNodeState2); - m.methodDesc("Get nodeState of a node, answer when state changes from given state."); - m.paramDesc(0, "nodeStateIn", "The node state of the given node"); - m.paramDesc(1, "timeout", "Time timeout in milliseconds set by the state requester."); - m.returnDesc(0, "nodeStateOut", "The node state of the given node"); - m.returnDesc(1, "hostinfo", "Information on the host node is running on"); - supervisor.addMethod(m); - } - } - if (stateCommunicationVersion >= RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_VERSION) { - m = new Method(RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_METHOD_NAME, "bix", "", this::rpc_setDistributionStates); - m.methodDesc("Set distribution states for cluster and bucket spaces"); - m.paramDesc(0, "compressionType", "Compression type for payload"); - m.paramDesc(1, "uncompressedSize", "Uncompressed size of payload"); - m.paramDesc(2, "payload", "Slime format payload"); - supervisor.addMethod(m); - } - if (stateCommunicationVersion >= RPCCommunicator.ACTIVATE_CLUSTER_STATE_VERSION_RPC_VERSION) { - m = new Method(RPCCommunicator.ACTIVATE_CLUSTER_STATE_VERSION_RPC_METHOD_NAME, "i", "i", this::rpc_activateClusterStateVersion); - m.methodDesc("Activate a given cluster state version"); - m.paramDesc(0, "stateVersion", "Cluster state version to activate"); - m.returnDesc(0, "actualVersion", "Actual cluster state version on node"); - supervisor.addMethod(m); - } + m = new Method(RPCCommunicator.SET_DISTRIBUTION_STATES_RPC_METHOD_NAME, "bix", "", this::rpc_setDistributionStates); + m.methodDesc("Set distribution states for cluster and bucket spaces"); + m.paramDesc(0, "compressionType", "Compression type for payload"); + m.paramDesc(1, "uncompressedSize", "Uncompressed size of payload"); + m.paramDesc(2, "payload", "Slime format payload"); + supervisor.addMethod(m); + + m = new Method(RPCCommunicator.ACTIVATE_CLUSTER_STATE_VERSION_RPC_METHOD_NAME, "i", "i", this::rpc_activateClusterStateVersion); + m.methodDesc("Activate a given cluster state version"); + m.paramDesc(0, "stateVersion", "Cluster state version to activate"); + m.returnDesc(0, "actualVersion", "Actual cluster state version on node"); + supervisor.addMethod(m); } private void rpc_storageConnect(Request req) { synchronized(timer) { log.log(Level.FINEST, () -> "Dummy node " + this + " got old type handle connect message."); req.returnValues().add(new Int32Value(0)); - negotiatedHandle = true; } } @@ -437,56 +403,6 @@ public class DummyVdsNode { } } - private void rpc_setSystemState(Request req) { - try{ - if (shouldFailSetSystemStateRequests()) { - req.setError(ErrorCode.GENERAL_ERROR, "Dummy node configured to fail setSystemState() calls"); - return; - } - if (!negotiatedHandle) { - req.setError(75000, "Connection not bound to a handle"); - return; - } - ClusterState newState = new ClusterState(req.parameters().get(0).asString()); - synchronized(timer) { - updateStartTimestamps(newState); - clusterStateBundles.add(0, ClusterStateBundle.ofBaselineOnly(AnnotatedClusterState.withoutAnnotations(newState))); - timer.notifyAll(); - } - req.returnValues().add(new Int32Value(1)); - req.returnValues().add(new StringValue("OK")); - log.log(Level.FINE, () -> "Dummy node " + this + ": Got new system state (through old setsystemstate call) " + newState); - } catch (Exception e) { - log.log(Level.SEVERE, "Dummy node " + this + ": An error occurred when answering setsystemstate request: " + e.getMessage()); - e.printStackTrace(System.err); - req.returnValues().add(new Int32Value(ErrorCode.METHOD_FAILED)); - req.returnValues().add(new StringValue(e.getMessage())); - } - } - - private void rpc_setSystemState2(Request req) { - try{ - if (shouldFailSetSystemStateRequests()) { - req.setError(ErrorCode.GENERAL_ERROR, "Dummy node configured to fail setSystemState2() calls"); - return; - } - ClusterState newState = new ClusterState(req.parameters().get(0).asString()); - synchronized(timer) { - updateStartTimestamps(newState); - clusterStateBundles.add(0, ClusterStateBundle.ofBaselineOnly(AnnotatedClusterState.withoutAnnotations(newState))); - if (stateCommunicationVersion < RPCCommunicator.ACTIVATE_CLUSTER_STATE_VERSION_RPC_VERSION) { - activatedClusterStateVersion = newState.getVersion(); // Simulate node that does not know of activation - } - timer.notifyAll(); - } - log.log(Level.FINE, () -> "Dummy node " + this + ": Got new system state " + newState); - } catch (Exception e) { - log.log(Level.SEVERE, "Dummy node " + this + ": An error occurred when answering setsystemstate request: " + e.getMessage()); - e.printStackTrace(System.err); - req.setError(ErrorCode.METHOD_FAILED, e.getMessage()); - } - } - private void rpc_setDistributionStates(Request req) { try { if (shouldFailSetSystemStateRequests()) { @@ -497,9 +413,6 @@ public class DummyVdsNode { synchronized(timer) { updateStartTimestamps(stateBundle.getBaselineClusterState()); clusterStateBundles.add(0, stateBundle); - if (stateCommunicationVersion < RPCCommunicator.ACTIVATE_CLUSTER_STATE_VERSION_RPC_VERSION) { - activatedClusterStateVersion = stateBundle.getVersion(); // Simulate node that does not know of activation - } timer.notifyAll(); } log.log(Level.FINE, () -> "Dummy node " + this + ": Got new cluster state " + stateBundle); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNodeOptions.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNodeOptions.java deleted file mode 100644 index d6b5e7fa5d2..00000000000 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyVdsNodeOptions.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.clustercontroller.core; - -import com.yahoo.vespa.clustercontroller.core.rpc.RPCCommunicator; - -/** - * Options for simulated content nodes that are registered in Slobrok and communicate - * over regular RPC. - */ -public class DummyVdsNodeOptions { - // Rpc method versions and which Vespa versions supports each version: - // 0 - 4.1 - // 1 - 4.2-5.0.10 - // 2 - 5.0.11+ - // 3 - 6.220+ - // 4 - 7.24+ - int stateCommunicationVersion = RPCCommunicator.ACTIVATE_CLUSTER_STATE_VERSION_RPC_VERSION; -} diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/FleetControllerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/FleetControllerTest.java index bf06474a3af..2a77b4c7636 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/FleetControllerTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/FleetControllerTest.java @@ -173,28 +173,28 @@ public abstract class FleetControllerTest implements Waiter { } protected void setUpVdsNodes(boolean useFakeTimer) throws Exception { - setUpVdsNodes(useFakeTimer, new DummyVdsNodeOptions(), false); + setUpVdsNodes(useFakeTimer, false); } - protected void setUpVdsNodes(boolean useFakeTimer, DummyVdsNodeOptions options, boolean startDisconnected) throws Exception { - setUpVdsNodes(useFakeTimer, options, startDisconnected, DEFAULT_NODE_COUNT); + protected void setUpVdsNodes(boolean useFakeTimer, boolean startDisconnected) throws Exception { + setUpVdsNodes(useFakeTimer, startDisconnected, DEFAULT_NODE_COUNT); } - protected void setUpVdsNodes(boolean useFakeTimer, DummyVdsNodeOptions options, boolean startDisconnected, int nodeCount) throws Exception { + protected void setUpVdsNodes(boolean useFakeTimer, boolean startDisconnected, int nodeCount) throws Exception { TreeSet<Integer> nodeIndexes = new TreeSet<>(); for (int i = 0; i < nodeCount; ++i) nodeIndexes.add(this.nodes.size()/2 + i); // divide by 2 because there are 2 nodes (storage and distributor) per index - setUpVdsNodes(useFakeTimer, options, startDisconnected, nodeIndexes); + setUpVdsNodes(useFakeTimer, startDisconnected, nodeIndexes); } - protected void setUpVdsNodes(boolean useFakeTimer, DummyVdsNodeOptions nodeOptions, boolean startDisconnected, Set<Integer> nodeIndexes) throws Exception { + protected void setUpVdsNodes(boolean useFakeTimer, boolean startDisconnected, Set<Integer> nodeIndexes) throws Exception { for (int nodeIndex : nodeIndexes) { - nodes.add(createNode(useFakeTimer, nodeOptions, startDisconnected, DISTRIBUTOR, nodeIndex)); - nodes.add(createNode(useFakeTimer, nodeOptions, startDisconnected, STORAGE, nodeIndex)); + nodes.add(createNode(useFakeTimer, startDisconnected, DISTRIBUTOR, nodeIndex)); + nodes.add(createNode(useFakeTimer, startDisconnected, STORAGE, nodeIndex)); } } - private DummyVdsNode createNode(boolean useFakeTimer, DummyVdsNodeOptions nodeOptions, boolean startDisconnected, + private DummyVdsNode createNode(boolean useFakeTimer, boolean startDisconnected, NodeType nodeType, int nodeIndex) throws Exception { String[] connectionSpecs = getSlobrokConnectionSpecs(slobrok); - DummyVdsNode node = new DummyVdsNode(useFakeTimer ? timer : new RealTimer(), nodeOptions, connectionSpecs, + DummyVdsNode node = new DummyVdsNode(useFakeTimer ? timer : new RealTimer(), connectionSpecs, options.clusterName(), nodeType, nodeIndex); if ( ! startDisconnected) node.connect(); @@ -208,11 +208,11 @@ public abstract class FleetControllerTest implements Waiter { * As two dummy nodes are created for each configured node - one distributor and one storage node - * the returned list is twice as large as configuredNodes. */ - protected List<DummyVdsNode> setUpVdsNodes(boolean useFakeTimer, DummyVdsNodeOptions options, boolean startDisconnected, List<ConfiguredNode> configuredNodes) throws Exception { + protected List<DummyVdsNode> setUpVdsNodes(boolean useFakeTimer, boolean startDisconnected, List<ConfiguredNode> configuredNodes) throws Exception { nodes = new ArrayList<>(); for (ConfiguredNode configuredNode : configuredNodes) { - nodes.add(createNode(useFakeTimer, options, startDisconnected, DISTRIBUTOR, configuredNode.index())); - nodes.add(createNode(useFakeTimer, options, startDisconnected, STORAGE, configuredNode.index())); + nodes.add(createNode(useFakeTimer, startDisconnected, DISTRIBUTOR, configuredNode.index())); + nodes.add(createNode(useFakeTimer, startDisconnected, STORAGE, configuredNode.index())); } return nodes; } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownLiveConfigTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownLiveConfigTest.java index 9a5be27da94..036d3edd2a8 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownLiveConfigTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownLiveConfigTest.java @@ -42,7 +42,7 @@ public class GroupAutoTakedownLiveConfigTest extends FleetControllerTest { private FleetControllerOptions setUp3x3ClusterWithMinNodeRatio(double minNodeRatio) throws Exception { FleetControllerOptions.Builder options = createOptions(DistributionBuilder.withGroups(3).eachWithNodeCount(3), minNodeRatio); setUpFleetController(true, options); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, 9); + setUpVdsNodes(true, false, 9); waitForState("version:\\d+ distributor:9 storage:9"); return options.build(); } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/NodeSlobrokConfigurationMembershipTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/NodeSlobrokConfigurationMembershipTest.java index 9acaf46b144..a760adf3cf2 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/NodeSlobrokConfigurationMembershipTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/NodeSlobrokConfigurationMembershipTest.java @@ -24,7 +24,7 @@ public class NodeSlobrokConfigurationMembershipTest extends FleetControllerTest setUpFleetController(true, options); Set<Integer> nodesWithStranger = new TreeSet<>(validIndices); nodesWithStranger.add(foreignNodeIndex); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, nodesWithStranger); + setUpVdsNodes(true, false, nodesWithStranger); return options.build(); } @@ -64,7 +64,7 @@ public class NodeSlobrokConfigurationMembershipTest extends FleetControllerTest Set<ConfiguredNode> configuredNodes = asConfiguredNodes(nodeIndices); FleetControllerOptions.Builder builder = optionsForConfiguredNodes(configuredNodes); options = setUpFleetController(true, builder); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, nodeIndices); + setUpVdsNodes(true, false, nodeIndices); waitForState("version:\\d+ distributor:4 storage:4"); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java index 63505bbd251..4b4cb348968 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcServerTest.java @@ -263,7 +263,7 @@ public class RpcServerTest extends FleetControllerTest { .setMaxInitProgressTime(30000) .setStableStateTimePeriod(60000); setUpFleetController(true, builder); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, configuredNodes); + setUpVdsNodes(true, false, configuredNodes); waitForState("version:\\d+ distributor:5 storage:5 .4.s:r"); setWantedNodeState(State.DOWN, NodeType.DISTRIBUTOR, 2); @@ -297,7 +297,7 @@ public class RpcServerTest extends FleetControllerTest { .setMaxInitProgressTime(30000) .setStableStateTimePeriod(60000); setUpFleetController(true, builder); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, configuredNodes); + setUpVdsNodes(true, false, configuredNodes); waitForState("version:\\d+ distributor:5 storage:5"); } @@ -311,7 +311,7 @@ public class RpcServerTest extends FleetControllerTest { } { // Configuration change: Add 2 new nodes and retire the 5 existing ones - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, 2); + setUpVdsNodes(true, false, 2); Set<ConfiguredNode> configuredNodes = new TreeSet<>(); for (int i = 0; i < 5; i++) configuredNodes.add(new ConfiguredNode(i, true)); @@ -379,7 +379,7 @@ public class RpcServerTest extends FleetControllerTest { .setStableStateTimePeriod(60000); options = builder.build(); setUpFleetController(true, builder); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, configuredNodes); + setUpVdsNodes(true, false, configuredNodes); waitForState("version:\\d+ distributor:5 storage:5"); } @@ -396,7 +396,7 @@ public class RpcServerTest extends FleetControllerTest { } { // Configuration change: Add 2 new nodes and retire the 5 existing ones - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, 2); + setUpVdsNodes(true, false, 2); Set<ConfiguredNode> configuredNodes = new TreeSet<>(); for (int i = 0; i < 5; i++) configuredNodes.add(new ConfiguredNode(i, true)); @@ -453,7 +453,7 @@ public class RpcServerTest extends FleetControllerTest { FleetControllerOptions.Builder options = defaultOptions("mycluster", configuredNodes); //options.setStorageDistribution(new Distribution(getDistConfig(nodeIndexes))); setUpFleetController(true, options); - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, nodeIndexes); + setUpVdsNodes(true, false, nodeIndexes); waitForState("version:\\d+ distributor:26 .0.s:d .1.s:d .2.s:d .3.s:d .5.s:d .7.s:d .8.s:d .11.s:d .12.s:d .13.s:d .15.s:d .17.s:d .18.s:d .19.s:d .20.s:d .24.s:d storage:26 .0.s:d .1.s:d .2.s:d .3.s:d .5.s:d .7.s:d .8.s:d .11.s:d .12.s:d .13.s:d .15.s:d .17.s:d .18.s:d .19.s:d .20.s:d .24.s:d"); int rpcPort = fleetController.getRpcPort(); @@ -541,7 +541,7 @@ public class RpcServerTest extends FleetControllerTest { startingTest("RpcServerTest::testGetNodeList"); setUpFleetController(true, defaultOptions("mycluster", 5)); final int nodeCount = 5; - setUpVdsNodes(true, new DummyVdsNodeOptions(), false, nodeCount); + setUpVdsNodes(true, false, nodeCount); waitForStableSystem(); assertTrue(nodes.get(0).isDistributor()); @@ -573,7 +573,7 @@ public class RpcServerTest extends FleetControllerTest { continue; } assertNotEquals("", rpc[i]); - Request req2 = new Request("getnodestate2"); + Request req2 = new Request("getnodestate3"); req2.parameters().add(new StringValue("unknown")); Target connection2 = supervisor.connect(new Spec(rpc[i])); connection2.invokeSync(req2, timeout()); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcVersionAutoDowngradeTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcVersionAutoDowngradeTest.java deleted file mode 100644 index 3740c6de491..00000000000 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/RpcVersionAutoDowngradeTest.java +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.clustercontroller.core; - -import com.yahoo.vdslib.distribution.ConfiguredNode; -import com.yahoo.vdslib.state.NodeState; -import com.yahoo.vdslib.state.State; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import java.util.ArrayList; -import java.util.List; - -@ExtendWith(CleanupZookeeperLogsOnSuccess.class) -public class RpcVersionAutoDowngradeTest extends FleetControllerTest { - - private void setUpFakeCluster(int nodeRpcVersion) throws Exception { - List<ConfiguredNode> configuredNodes = new ArrayList<>(); - for (int i = 0 ; i < 10; i++) { - configuredNodes.add(new ConfiguredNode(i, false)); - } - FleetControllerOptions.Builder options = defaultOptions("mycluster", configuredNodes); - setUpFleetController(false, options); - DummyVdsNodeOptions nodeOptions = new DummyVdsNodeOptions(); - nodeOptions.stateCommunicationVersion = nodeRpcVersion; - List<DummyVdsNode> nodes = setUpVdsNodes(false, nodeOptions, true, configuredNodes); - for (DummyVdsNode node : nodes) { - node.setNodeState(new NodeState(node.getType(), State.UP).setMinUsedBits(20)); - node.connect(); - } - } - - @Test - void cluster_state_rpc_version_is_auto_downgraded_and_retried_for_older_nodes() throws Exception { - setUpFakeCluster(2); // HEAD is at v4 - waitForState("version:\\d+ distributor:10 storage:10"); - } - - @Test - void implicit_activation_for_nodes_that_return_not_found_for_version_activation_rpc() throws Exception { - setUpFakeCluster(3); // HEAD is at v4 - waitForState("version:\\d+ distributor:10 storage:10"); - } - - // TODO partial version setup for simulating upgrades - -} diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java index 7db8f47ce5b..5256c952d15 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeTest.java @@ -958,7 +958,7 @@ public class StateChangeTest extends FleetControllerTest { builder.setMinTimeBeforeFirstSystemStateBroadcast(3 * 60 * 1000); setUpSystem(builder); boolean useFakeTimer = true; - setUpVdsNodes(useFakeTimer, new DummyVdsNodeOptions(), true); + setUpVdsNodes(useFakeTimer, true); // Leave one node down to avoid sending cluster state due to having seen all node states. for (int i = 0; i < nodes.size(); ++i) { if (i != 3) { @@ -1006,7 +1006,7 @@ public class StateChangeTest extends FleetControllerTest { boolean useFakeTimer = true; setUpSystem(builder); - setUpVdsNodes(useFakeTimer, new DummyVdsNodeOptions(), true); + setUpVdsNodes(useFakeTimer, true); for (DummyVdsNode node : nodes) { node.connect(); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java index 58df1c1f5eb..796204989b9 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateGatherTest.java @@ -37,9 +37,8 @@ public class StateGatherTest extends FleetControllerTest { .setNodeStateRequestTimeoutLatestPercentage(80); setUpFleetController(true, builder); String[] connectionSpecs = getSlobrokConnectionSpecs(slobrok); - DummyVdsNodeOptions dummyOptions = new DummyVdsNodeOptions(); - DummyVdsNode dnode = new DummyVdsNode(timer, dummyOptions, connectionSpecs, builder.clusterName(), NodeType.DISTRIBUTOR, 0); - DummyVdsNode snode = new DummyVdsNode(timer, dummyOptions, connectionSpecs, builder.clusterName(), NodeType.STORAGE, 0); + DummyVdsNode dnode = new DummyVdsNode(timer, connectionSpecs, builder.clusterName(), NodeType.DISTRIBUTOR, 0); + DummyVdsNode snode = new DummyVdsNode(timer, connectionSpecs, builder.clusterName(), NodeType.STORAGE, 0); dnode.connect(); snode.connect(); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicatorTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicatorTest.java index 7e0b7f6d953..b533168e61a 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicatorTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/rpc/RPCCommunicatorTest.java @@ -1,7 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.clustercontroller.core.rpc; -import com.yahoo.jrt.ErrorCode; import com.yahoo.jrt.Request; import com.yahoo.jrt.RequestWaiter; import com.yahoo.jrt.Supervisor; @@ -159,32 +158,6 @@ public class RPCCommunicatorTest { } @Test - void set_distribution_states_v3_rpc_auto_downgrades_to_v2_on_unknown_method_error() { - var f = new Fixture<SetClusterStateRequest>(); - var cf = ClusterFixture.forFlatCluster(3).bringEntireClusterUp().assignDummyRpcAddresses(); - var sentBundle = ClusterStateBundleUtil.makeBundle("version:123 distributor:3 storage:3"); - f.communicator.setSystemState(sentBundle, cf.cluster().getNodeInfo(Node.ofStorage(1)), f.mockWaiter); - - RequestWaiter waiter = f.receivedWaiter.get(); - assertNotNull(waiter); - Request req = f.receivedRequest.get(); - assertNotNull(req); - - req.setError(ErrorCode.NO_SUCH_METHOD, "que?"); - waiter.handleRequestDone(req); - - // This would normally be done in processResponses(), but that code path is not invoked in this test. - cf.cluster().getNodeInfo(Node.ofStorage(1)).setClusterStateBundleVersionAcknowledged(123, false); - - f.receivedRequest.set(null); - // Now when we try again, we should have been downgraded to the legacy setsystemstate2 RPC - f.communicator.setSystemState(sentBundle, cf.cluster().getNodeInfo(Node.ofStorage(1)), f.mockWaiter); - req = f.receivedRequest.get(); - assertNotNull(req); - assertEquals(req.methodName(), RPCCommunicator.LEGACY_SET_SYSTEM_STATE2_RPC_METHOD_NAME); - } - - @Test void activateClusterStateVersion_sends_version_activation_rpc() { var f = new Fixture<ActivateClusterStateVersionRequest>(); var cf = ClusterFixture.forFlatCluster(3).bringEntireClusterUp().assignDummyRpcAddresses(); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitCondition.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitCondition.java index deccaf282d6..211d475de31 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitCondition.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitCondition.java @@ -128,7 +128,7 @@ public interface WaitCondition { if (!match) { return "Node " + node + " state mismatch.\n wanted: " + pattern + "\n is: " + node.getClusterStateBundle().toString(); } - if (node.getStateCommunicationVersion() > 0 && !node.hasPendingGetNodeStateRequest()) { + if (!node.hasPendingGetNodeStateRequest()) { return "Node " + node + " has not received another get node state request yet"; } } |