diff options
Diffstat (limited to 'clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller')
17 files changed, 136 insertions, 88 deletions
diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java index 4ce32484098..f8d41405e85 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ClusterFixture.java @@ -8,7 +8,7 @@ import com.yahoo.vdslib.state.Node; import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; import java.util.Collection; import java.util.HashSet; @@ -57,7 +57,7 @@ public class ClusterFixture { private void doReportNodeState(final Node node, final NodeState nodeState) { final ClusterState stateBefore = rawGeneratedClusterState(); - NodeStateOrHostInfoChangeHandler handler = mock(NodeStateOrHostInfoChangeHandler.class); + NodeListener handler = mock(NodeListener.class); NodeInfo nodeInfo = cluster.getNodeInfo(node); nodeStateChangeHandler.handleNewReportedNodeState(stateBefore, nodeInfo, nodeState, handler); @@ -142,7 +142,7 @@ public class ClusterFixture { } public ClusterFixture assignDummyRpcAddresses() { - cluster.getNodeInfo().forEach(ni -> { + cluster.getNodeInfos().forEach(ni -> { ni.setRpcAddress(String.format("tcp/%s.%d.local:0", ni.isStorage() ? "storage" : "distributor", ni.getNodeIndex())); @@ -169,7 +169,7 @@ public class ClusterFixture { Set<ConfiguredNode> configuredNodes = new HashSet<>(cluster.getConfiguredNodes().values()); configuredNodes.remove(new ConfiguredNode(nodeIndex, false)); configuredNodes.add(new ConfiguredNode(nodeIndex, true)); - cluster.setNodes(configuredNodes); + cluster.setNodes(configuredNodes, new NodeListener() {}); return this; } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java index a621b0f565a..1f7b9293960 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseHandlerTest.java @@ -1,23 +1,42 @@ // 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.state.Node; +import com.yahoo.vdslib.state.NodeState; +import com.yahoo.vdslib.state.NodeType; +import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.database.Database; import com.yahoo.vespa.clustercontroller.core.database.DatabaseFactory; import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; +import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener; +import org.junit.After; +import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.MockitoAnnotations; + +import java.util.Map; +import java.util.TreeMap; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class DatabaseHandlerTest { + private AutoCloseable openMock = null; + + @Captor + ArgumentCaptor<TreeMap<Node, NodeState>> wantedStatesArgument; + static class Fixture { final ClusterFixture clusterFixture = ClusterFixture.forFlatCluster(10); final FleetController mockController = mock(FleetController.class); @@ -52,12 +71,12 @@ public class DatabaseHandlerTest { } @Override - public NodeAddedOrRemovedListener getNodeAddedOrRemovedListener() { + public SlobrokListener getNodeAddedOrRemovedListener() { return null; } @Override - public NodeStateOrHostInfoChangeHandler getNodeStateUpdateListener() { + public NodeListener getNodeStateUpdateListener() { return null; } }; @@ -70,6 +89,16 @@ public class DatabaseHandlerTest { } } + @Before + public void setUp() { + openMock = MockitoAnnotations.openMocks(this); + } + + @After + public void tearDown() throws Exception { + openMock.close(); + } + @Test public void can_store_latest_cluster_state_bundle() throws Exception { Fixture f = new Fixture(); @@ -104,4 +133,29 @@ public class DatabaseHandlerTest { assertEquals(ClusterStateBundle.empty(), retrievedBundle); } + @Test + public void save_wanted_state_of_configured_nodes() throws Exception { + var fixture = new Fixture(); + DatabaseHandler handler = fixture.createHandler(); + DatabaseHandler.DatabaseContext databaseContext = fixture.createMockContext(); + + // The test fixture contains 10 nodes with indices 1-10. A wanted state for + // an existing node (5) should be preserved. Note that it is not possible to set a + // wanted state outside the existing nodes. + Node storageNode5 = Node.ofStorage(5); + NodeState maintenance = new NodeState(NodeType.STORAGE, State.MAINTENANCE); + databaseContext.getCluster().getNodeInfo(storageNode5).setWantedState(maintenance); + var expectedWantedStates = new TreeMap<>(Map.of(storageNode5, maintenance)); + + // Ensure database is connected to ZooKeeper + assertTrue(handler.doNextZooKeeperTask(databaseContext)); + + // Verify ZooKeeperDatabase::storeWantedStates is invoked once + verify(fixture.mockDatabase, times(0)).storeWantedStates(any()); + assertTrue(handler.saveWantedStates(databaseContext)); + verify(fixture.mockDatabase, times(1)).storeWantedStates(wantedStatesArgument.capture()); + + // Verify ZooKeeperDatabase::storeWantedStates only saves states for existing nodes + assertEquals(expectedWantedStates, wantedStatesArgument.getValue()); + } } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java index 37fe3e28a5d..2ff48e00d0f 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DatabaseTest.java @@ -26,8 +26,6 @@ public class DatabaseTest extends FleetControllerTest { private static final Logger log = Logger.getLogger(DatabaseTest.class.getName()); - // These tests work in isolation but causes other tests to hang - @Ignore @Test public void testWantedStatesInZooKeeper() throws Exception { startingTest("DatabaseTest::testWantedStatesInZooKeeper"); @@ -82,8 +80,6 @@ public class DatabaseTest extends FleetControllerTest { assertWantedStates(wantedStates); } - // These tests work in isolation but causes other tests to hang - @Ignore @Test public void testWantedStateOfUnknownNode() throws Exception { startingTest("DatabaseTest::testWantedStatesOfUnknownNode"); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java index 3c232a7c52b..3127201a342 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/DummyCommunicator.java @@ -6,7 +6,7 @@ import com.yahoo.vdslib.state.ClusterState; import com.yahoo.vdslib.state.Node; import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.State; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener; +import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener; import java.util.ArrayList; import java.util.List; @@ -133,14 +133,14 @@ public class DummyCommunicator implements Communicator, NodeLookup { } @Override - public boolean updateCluster(ContentCluster cluster, NodeAddedOrRemovedListener listener) { + public boolean updateCluster(ContentCluster cluster, SlobrokListener listener) { if (newNodes != null) { List<Node> tmp = newNodes; for (Node node : tmp) cluster.clusterInfo().setRpcAddress(node, "foo"); - for (NodeInfo info : cluster.getNodeInfo()) { + for (NodeInfo info : cluster.getNodeInfos()) { if (!tmp.contains(info.getNode())) { info.markRpcAddressOutdated(timer); listener.handleMissingNode(info); 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 c56b3bbdc69..a5eeb69e126 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 @@ -84,7 +84,7 @@ public abstract class FleetControllerTest implements Waiter { static { LogSetup.initVespaLogging("fleetcontroller"); - timeoutS = 120; + timeoutS = 30; timeoutMS = timeoutS * 1000; } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java index 254f863e9ea..1d4b2a73560 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/GroupAutoTakedownTest.java @@ -7,20 +7,19 @@ import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; - -import static com.yahoo.vespa.clustercontroller.core.matchers.EventForNode.eventForNode; -import static com.yahoo.vespa.clustercontroller.core.matchers.NodeEventWithDescription.nodeEventWithDescription; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; import org.junit.Test; import java.util.HashSet; import java.util.List; import java.util.Set; +import static com.yahoo.vespa.clustercontroller.core.matchers.EventForNode.eventForNode; +import static com.yahoo.vespa.clustercontroller.core.matchers.NodeEventWithDescription.nodeEventWithDescription; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.AllOf.allOf; import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.junit.Assert.assertEquals; -import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -179,7 +178,7 @@ public class GroupAutoTakedownTest { // However, once grace period expires the group should be taken down. fixture.timer.advanceTime(1001); - NodeStateOrHostInfoChangeHandler changeListener = mock(NodeStateOrHostInfoChangeHandler.class); + NodeListener changeListener = mock(NodeListener.class); fixture.nodeStateChangeHandler.watchTimers( fixture.cluster, fixture.annotatedGeneratedClusterState().getClusterState(), changeListener); @@ -253,7 +252,7 @@ public class GroupAutoTakedownTest { nodes.add(new ConfiguredNode(5, true)); // TODO this should ideally also set the retired flag in the distribution // config, but only the ConfiguredNodes are actually looked at currently. - fixture.cluster.setNodes(nodes); + fixture.cluster.setNodes(nodes, new NodeListener() {}); assertEquals("distributor:6 storage:6 .4.s:d .5.s:r", stateAfterStorageTransition(fixture, 5, State.UP)); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java index db86df88fc5..257bb54047c 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/MasterElectionTest.java @@ -12,7 +12,6 @@ import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.status.StatusHandler; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; @@ -79,7 +78,6 @@ public class MasterElectionTest extends FleetControllerTest { long maxTime = System.currentTimeMillis() + timeoutMS; for (FleetController f : fleetControllers) { while (f.hasZookeeperConnection()) { - timer.advanceTime(1000); try { Thread.sleep(1); } catch (InterruptedException e) { /* ignore */ } if (System.currentTimeMillis() > maxTime) throw new TimeoutException("Failed to notice zookeeper down within timeout of " + timeoutMS + " ms"); @@ -117,14 +115,12 @@ public class MasterElectionTest extends FleetControllerTest { super.tearDown(); } - /** Ignored for unknown reasons */ @Test - @Ignore public void testMasterElection() throws Exception { startingTest("MasterElectionTest::testMasterElection"); log.log(Level.INFO, "STARTING TEST: MasterElectionTest::testMasterElection()"); FleetControllerOptions options = defaultOptions("mycluster"); - options.masterZooKeeperCooldownPeriod = 1; + options.masterZooKeeperCooldownPeriod = 100; setUpFleetController(5, false, options); waitForMaster(0); log.log(Level.INFO, "SHUTTING DOWN FLEET CONTROLLER 0"); @@ -137,7 +133,7 @@ public class MasterElectionTest extends FleetControllerTest { fleetControllers.get(2).shutdown(); // Too few for there to be a master at this point - for (int i=0; i<fleetControllers.size(); ++i) { + for (int i = 0; i < fleetControllers.size(); ++i) { if (fleetControllers.get(i).isRunning()) waitForCompleteCycle(i); assertFalse("Fleet controller " + i, fleetControllers.get(i).isMaster()); } @@ -163,7 +159,7 @@ public class MasterElectionTest extends FleetControllerTest { fleetControllers.get(2).shutdown(); // Too few for there to be a master at this point - for (int i=0; i<fleetControllers.size(); ++i) { + for (int i = 0; i < fleetControllers.size(); ++i) { if (fleetControllers.get(i).isRunning()) waitForCompleteCycle(i); assertFalse(fleetControllers.get(i).isMaster()); } @@ -172,15 +168,15 @@ public class MasterElectionTest extends FleetControllerTest { private void waitForMaster(int master) { log.log(Level.INFO, "Entering waitForMaster"); boolean isOnlyMaster = false; - for (int i=0; i < FleetControllerTest.timeoutMS; i+=100) { + for (int i = 0; i < FleetControllerTest.timeoutMS; i += 100) { if (!fleetControllers.get(master).isMaster()) { log.log(Level.INFO, "Node " + master + " is not master yet, sleeping more"); timer.advanceTime(100); waitForCompleteCycle(master); } else { - log.log(Level.INFO, "Node " + master + " is master. Checking that noone else is master"); + log.log(Level.INFO, "Node " + master + " is master. Checking that no one else is master"); isOnlyMaster = true; - for (int j=0; j<fleetControllers.size(); ++j) { + for (int j = 0; j < fleetControllers.size(); ++j) { if (j != master && fleetControllers.get(j).isMaster()) { isOnlyMaster = false; log.log(Level.INFO, "Node " + j + " also says it is master."); @@ -192,7 +188,7 @@ public class MasterElectionTest extends FleetControllerTest { } } // Have to wait to get zookeeper communication chance to happen. - try{ Thread.sleep(100); } catch (InterruptedException e) { /* ignore */ } + try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } if (!isOnlyMaster) { @@ -258,11 +254,9 @@ public class MasterElectionTest extends FleetControllerTest { zooKeeperServer.shutdown(true); waitForCompleteCycles(); - timer.advanceTime(options.zooKeeperSessionTimeout); waitForZookeeperDisconnected(); zooKeeperServer = ZooKeeperTestServer.createWithFixedPort(18342); - timer.advanceTime(10 * 1000); // Wait long enough for fleetcontroller wanting to retry zookeeper connection log.log(Level.INFO, "WAITING FOR 0 TO BE MASTER"); waitForMaster(0); @@ -281,11 +275,10 @@ public class MasterElectionTest extends FleetControllerTest { log.log(Level.INFO, "STOPPING ZOOKEEPER SERVER AT " + zooKeeperServer.getAddress()); zooKeeperServer.shutdown(true); waitForCompleteCycles(); - timer.advanceTime(options.zooKeeperSessionTimeout); waitForZookeeperDisconnected(); // No one can be master if server is unavailable log.log(Level.INFO, "Checking master status"); - for (int i=0; i<fleetControllers.size(); ++i) { + for (int i = 0; i < fleetControllers.size(); ++i) { assertFalse("Index " + i, fleetControllers.get(i).isMaster()); } @@ -297,19 +290,16 @@ public class MasterElectionTest extends FleetControllerTest { fc.updateOptions(myoptions); log.log(Level.INFO, "Should now have sent out new zookeeper server address " + myoptions.zooKeeperServerAddress + " to fleetcontroller " + myoptions.fleetControllerIndex); } - timer.advanceTime(10 * 1000); // Wait long enough for fleetcontroller wanting to retry zookeeper connection waitForMaster(0); log.log(Level.INFO, "SHUTTING DOWN"); } - /** Ignored for unknown reasons */ @Test - @Ignore public void testMasterZooKeeperCooldown() throws Exception { startingTest("MasterElectionTest::testMasterZooKeeperCooldown"); FleetControllerOptions options = defaultOptions("mycluster"); options.masterZooKeeperCooldownPeriod = 3600 * 1000; // An hour - setUpFleetController(3, false, options); + setUpFleetController(3, true, options); waitForMaster(0); timer.advanceTime(24 * 3600 * 1000); // A day waitForCompleteCycle(1); @@ -352,14 +342,12 @@ public class MasterElectionTest extends FleetControllerTest { + "' within timeout of " + timeoutMS + " ms"); } - /** Ignored for unknown reasons */ @Test - @Ignore public void testGetMaster() throws Exception { startingTest("MasterElectionTest::testGetMaster"); FleetControllerOptions options = defaultOptions("mycluster"); options.masterZooKeeperCooldownPeriod = 3600 * 1000; // An hour - setUpFleetController(3, false, options); + setUpFleetController(3, true, options); waitForMaster(0); supervisor = new Supervisor(new Transport()); diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceExhaustionCalculatorTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceExhaustionCalculatorTest.java index 7e02f63d56e..e136ddfa72d 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceExhaustionCalculatorTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceExhaustionCalculatorTest.java @@ -23,7 +23,7 @@ public class ResourceExhaustionCalculatorTest { var calc = new ResourceExhaustionCalculator(true, mapOf(usage("disk", 0.5), usage("memory", 0.8))); var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.49), usage("memory", 0.79)), forNode(2, usage("disk", 0.4), usage("memory", 0.6))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNull(feedBlock); } @@ -32,7 +32,7 @@ public class ResourceExhaustionCalculatorTest { var calc = new ResourceExhaustionCalculator(true, mapOf(usage("disk", 0.5), usage("memory", 0.8))); var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.51), usage("memory", 0.79)), forNode(2, usage("disk", 0.4), usage("memory", 0.6))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); assertTrue(feedBlock.blockFeedInCluster()); assertEquals("disk on node 1 [storage.1.local] (0.510 > 0.500)", feedBlock.getDescription()); @@ -43,7 +43,7 @@ public class ResourceExhaustionCalculatorTest { var calc = new ResourceExhaustionCalculator(true, mapOf(usage("disk", 0.5), usage("memory", 0.8))); var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", "a-fancy-disk", 0.51), usage("memory", 0.79)), forNode(2, usage("disk", 0.4), usage("memory", 0.6))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); assertTrue(feedBlock.blockFeedInCluster()); assertEquals("disk:a-fancy-disk on node 1 [storage.1.local] (0.510 > 0.500)", feedBlock.getDescription()); @@ -56,7 +56,7 @@ public class ResourceExhaustionCalculatorTest { forNode(2, usage("disk", 0.4), usage("memory", 0.85))); cf.cluster().getNodeInfo(storageNode(1)).setRpcAddress(null); cf.cluster().getNodeInfo(storageNode(2)).setRpcAddress("max mekker"); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); assertTrue(feedBlock.blockFeedInCluster()); assertEquals("disk on node 1 [unknown hostname] (0.510 > 0.500), " + @@ -68,7 +68,7 @@ public class ResourceExhaustionCalculatorTest { var calc = new ResourceExhaustionCalculator(true, mapOf(usage("disk", 0.4), usage("memory", 0.8))); var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.51), usage("memory", 0.85)), forNode(2, usage("disk", 0.45), usage("memory", 0.6))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); assertTrue(feedBlock.blockFeedInCluster()); assertEquals("disk on node 1 [storage.1.local] (0.510 > 0.400), " + @@ -83,7 +83,7 @@ public class ResourceExhaustionCalculatorTest { var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.51), usage("memory", 0.85)), forNode(2, usage("disk", 0.45), usage("memory", 0.6)), forNode(3, usage("disk", 0.6), usage("memory", 0.9))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); assertTrue(feedBlock.blockFeedInCluster()); assertEquals("disk on node 1 [storage.1.local] (0.510 > 0.400), " + @@ -97,7 +97,7 @@ public class ResourceExhaustionCalculatorTest { var calc = new ResourceExhaustionCalculator(false, mapOf(usage("disk", 0.5), usage("memory", 0.8))); var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.51), usage("memory", 0.79)), forNode(2, usage("disk", 0.4), usage("memory", 0.6))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNull(feedBlock); } @@ -109,7 +109,7 @@ public class ResourceExhaustionCalculatorTest { // Node 2 is at 0.49 but was not previously blocked and should not be blocked now either. var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.3), usage("memory", 0.49)), forNode(2, usage("disk", 0.3), usage("memory", 0.49))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); // TODO should we not change the limits themselves? Explicit mention of hysteresis state? assertEquals("memory on node 1 [storage.1.local] (0.490 > 0.400)", @@ -124,7 +124,7 @@ public class ResourceExhaustionCalculatorTest { // Node 2 is at 0.49 but was not previously blocked and should not be blocked now either. var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.3), usage("memory", 0.48)), forNode(2, usage("disk", 0.3), usage("memory", 0.49))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNotNull(feedBlock); assertEquals("memory on node 1 [storage.1.local] (0.480 > 0.400)", feedBlock.getDescription()); @@ -138,7 +138,7 @@ public class ResourceExhaustionCalculatorTest { // Node 2 is at 0.49 but was not previously blocked and should not be blocked now either. var cf = createFixtureWithReportedUsages(forNode(1, usage("disk", 0.3), usage("memory", 0.39)), forNode(2, usage("disk", 0.3), usage("memory", 0.49))); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNull(feedBlock); } @@ -149,7 +149,7 @@ public class ResourceExhaustionCalculatorTest { forNode(2, usage("disk", 0.6), usage("memory", 0.6))); cf.reportStorageNodeState(1, State.DOWN); cf.reportStorageNodeState(2, State.DOWN); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNull(feedBlock); } @@ -160,7 +160,7 @@ public class ResourceExhaustionCalculatorTest { forNode(2, usage("disk", 0.6), usage("memory", 0.6))); cf.proposeStorageNodeWantedState(1, State.DOWN); cf.proposeStorageNodeWantedState(2, State.MAINTENANCE); - var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfo()); + var feedBlock = calc.inferContentClusterFeedBlockOrNull(cf.cluster().getNodeInfos()); assertNull(feedBlock); } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java index 3a5f9954a20..2eeaf7658ff 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ResourceUsageStatsTest.java @@ -66,7 +66,7 @@ public class ResourceUsageStatsTest { } private static Collection<NodeInfo> createNodeInfo(FeedBlockUtil.NodeAndUsages... nodeAndUsages) { - return createFixtureWithReportedUsages(nodeAndUsages).cluster().getNodeInfo(); + return createFixtureWithReportedUsages(nodeAndUsages).cluster().getNodeInfos(); } private static Map<String, Double> createFeedBlockLimits(double diskLimit, double memoryLimit) { diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SlobrokTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SlobrokTest.java index 5395048cad9..47ba7e1cb77 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SlobrokTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SlobrokTest.java @@ -99,7 +99,7 @@ public class SlobrokTest extends FleetControllerTest { private boolean clusterAvailable() { boolean ok = true; ContentCluster cluster = fleetController.getCluster(); - for (NodeInfo info : cluster.getNodeInfo()) { + for (NodeInfo info : cluster.getNodeInfos()) { if (info.getConnectionAttemptCount() > 0) ok = false; if (info.getLatestNodeStateRequestTime() == null) ok = false; } @@ -107,7 +107,7 @@ public class SlobrokTest extends FleetControllerTest { } private void assertClusterAvailable() { ContentCluster cluster = fleetController.getCluster(); - for (NodeInfo info : cluster.getNodeInfo()) { + for (NodeInfo info : cluster.getNodeInfos()) { assertEquals("Node " + info + " connection attempts.", 0, info.getConnectionAttemptCount()); assertTrue("Node " + info + " has no last request time.", info.getLatestNodeStateRequestTime() != 0); } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java index 95c097c5920..699a35a190c 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandlerTest.java @@ -9,7 +9,7 @@ import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; import com.yahoo.vespa.clustercontroller.core.mocks.TestEventLog; import com.yahoo.vespa.clustercontroller.core.testutils.LogFormatter; import org.junit.Before; @@ -34,7 +34,7 @@ public class StateChangeHandlerTest { int maxPrematureCrashes = 3; } - private static class TestNodeStateOrHostInfoChangeHandler implements NodeStateOrHostInfoChangeHandler { + private static class TestNodeListener implements NodeListener { LinkedList<String> events = new LinkedList<>(); @@ -49,6 +49,11 @@ public class StateChangeHandlerTest { } @Override + public void handleRemovedNode(Node node) { + events.add("removed: " + node); + } + + @Override public void handleUpdatedHostInfo(NodeInfo node, HostInfo newHostInfo) { events.add(node + " - " + newHostInfo); } @@ -68,7 +73,7 @@ public class StateChangeHandlerTest { private Config config; private ContentCluster cluster; private StateChangeHandler nodeStateChangeHandler; - private TestNodeStateOrHostInfoChangeHandler nodeStateUpdateListener; + private TestNodeListener nodeStateUpdateListener; private final ClusterStateGenerator.Params params = new ClusterStateGenerator.Params(); @Before @@ -88,7 +93,7 @@ public class StateChangeHandlerTest { .maxPrematureCrashes(config.maxPrematureCrashes) .transitionTimes(5000) .cluster(cluster); - nodeStateUpdateListener = new TestNodeStateOrHostInfoChangeHandler(); + nodeStateUpdateListener = new TestNodeListener(); } private ClusterState currentClusterState() { 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 a5bb65e11d0..5a33414c955 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 @@ -1294,7 +1294,7 @@ public class StateChangeTest extends FleetControllerTest { NodeState newNodeState = new NodeState(NodeType.STORAGE, State.MAINTENANCE); NodeInfo nodeInfo = ctx.cluster.getNodeInfo(new Node(NodeType.STORAGE, 0)); nodeInfo.setWantedState(newNodeState); - ctx.nodeStateOrHostInfoChangeHandler.handleNewWantedNodeState(nodeInfo, newNodeState); + ctx.nodeListener.handleNewWantedNodeState(nodeInfo, newNodeState); invoked = true; } } @@ -1312,7 +1312,7 @@ public class StateChangeTest extends FleetControllerTest { NodeState newNodeState = new NodeState(NodeType.STORAGE, State.DOWN); NodeInfo nodeInfo = ctx.cluster.getNodeInfo(new Node(NodeType.STORAGE, 0)); nodeInfo.setWantedState(newNodeState); - ctx.nodeStateOrHostInfoChangeHandler.handleNewWantedNodeState(nodeInfo, newNodeState); + ctx.nodeListener.handleNewWantedNodeState(nodeInfo, newNodeState); invoked = true; } } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java index 45593375c0b..1832f1132ac 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/SystemStateBroadcasterTest.java @@ -6,8 +6,8 @@ import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.database.DatabaseHandler; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; +import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -69,12 +69,12 @@ public class SystemStateBroadcasterTest { } @Override - public NodeAddedOrRemovedListener getNodeAddedOrRemovedListener() { + public SlobrokListener getNodeAddedOrRemovedListener() { return null; } @Override - public NodeStateOrHostInfoChangeHandler getNodeStateUpdateListener() { + public NodeListener getNodeStateUpdateListener() { return null; } }; @@ -91,7 +91,7 @@ public class SystemStateBroadcasterTest { ClusterFixture cf = ClusterFixture.forFlatCluster(2).bringEntireClusterUp().assignDummyRpcAddresses(); f.broadcaster.handleNewClusterStates(stateBundle); f.broadcaster.broadcastNewStateBundleIfRequired(dbContextFrom(cf.cluster()), f.mockCommunicator, 3); - cf.cluster().getNodeInfo().forEach(nodeInfo -> verify(f.mockCommunicator).setSystemState(eq(stateBundle), eq(nodeInfo), any())); + cf.cluster().getNodeInfos().forEach(nodeInfo -> verify(f.mockCommunicator).setSystemState(eq(stateBundle), eq(nodeInfo), any())); } @Test @@ -121,7 +121,7 @@ public class SystemStateBroadcasterTest { f.broadcaster.handleNewClusterStates(stateBundle); f.broadcaster.broadcastNewStateBundleIfRequired(dbContextFrom(cf.cluster()), f.mockCommunicator, 3); - cf.cluster().getNodeInfo().forEach(nodeInfo -> verify(f.mockCommunicator).setSystemState(eq(stateBundle), eq(nodeInfo), any())); + cf.cluster().getNodeInfos().forEach(nodeInfo -> verify(f.mockCommunicator).setSystemState(eq(stateBundle), eq(nodeInfo), any())); } @Test @@ -153,7 +153,7 @@ public class SystemStateBroadcasterTest { f.broadcaster.handleNewClusterStates(stateBundle); f.broadcaster.broadcastNewStateBundleIfRequired(dbContextFrom(cf.cluster()), f.mockCommunicator, 99); - cf.cluster().getNodeInfo().forEach(nodeInfo -> { + cf.cluster().getNodeInfos().forEach(nodeInfo -> { verify(f.mockCommunicator, times(0)).setSystemState(any(), eq(nodeInfo), any()); }); } @@ -166,7 +166,7 @@ public class SystemStateBroadcasterTest { f.broadcaster.handleNewClusterStates(stateBundle); f.broadcaster.broadcastNewStateBundleIfRequired(dbContextFrom(cf.cluster()), f.mockCommunicator, 100); - cf.cluster().getNodeInfo().forEach(nodeInfo -> { + cf.cluster().getNodeInfos().forEach(nodeInfo -> { verify(f.mockCommunicator, times(1)).setSystemState(any(), eq(nodeInfo), any()); }); } @@ -276,7 +276,7 @@ public class SystemStateBroadcasterTest { f.simulateBroadcastTick(cf, 123); // No activations should be sent yet - cf.cluster().getNodeInfo().forEach(nodeInfo -> { + cf.cluster().getNodeInfos().forEach(nodeInfo -> { verify(f.mockCommunicator, times(0)).activateClusterStateVersion(eq(123), eq(nodeInfo), any()); }); assertNull(f.broadcaster.getLastClusterStateBundleConverged()); @@ -285,7 +285,7 @@ public class SystemStateBroadcasterTest { f.simulateBroadcastTick(cf, 123); // Activation should now be sent to _all_ nodes (distributor and storage) - cf.cluster().getNodeInfo().forEach(nodeInfo -> { + cf.cluster().getNodeInfos().forEach(nodeInfo -> { verify(f.mockCommunicator).activateClusterStateVersion(eq(123), eq(nodeInfo), any()); }); // But not converged yet, as activations have not been ACKed diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ZooKeeperDatabaseTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ZooKeeperDatabaseTest.java index 7d64a8f8878..1ce7586adea 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ZooKeeperDatabaseTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/ZooKeeperDatabaseTest.java @@ -37,7 +37,7 @@ public class ZooKeeperDatabaseTest { closeDatabaseIfOpen(); var id = new FleetControllerId(clusterFixture.cluster.getName(), nodeIndex); var context = new TestFleetControllerContext(id); - zkDatabase = new ZooKeeperDatabase(context, clusterFixture.cluster(), nodeIndex, zkServer.getAddress(), + zkDatabase = new ZooKeeperDatabase(context, zkServer.getAddress(), (int)sessionTimeout.toMillis(), mockListener); } diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java index 95071931a75..f53b2898145 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/ClusterControllerMock.java @@ -2,11 +2,12 @@ package com.yahoo.vespa.clustercontroller.core.restapiv2; import com.yahoo.vdslib.state.ClusterState; +import com.yahoo.vdslib.state.Node; import com.yahoo.vdslib.state.NodeState; import com.yahoo.vespa.clustercontroller.core.*; import com.yahoo.vespa.clustercontroller.core.hostinfo.HostInfo; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeAddedOrRemovedListener; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; +import com.yahoo.vespa.clustercontroller.core.listeners.SlobrokListener; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; public class ClusterControllerMock implements RemoteClusterControllerTaskScheduler { public RemoteClusterControllerTask.Context context = new RemoteClusterControllerTask.Context(); @@ -40,16 +41,21 @@ public class ClusterControllerMock implements RemoteClusterControllerTaskSchedul return fleetControllerMaster; } }; - context.nodeStateOrHostInfoChangeHandler = new NodeStateOrHostInfoChangeHandler() { + context.nodeListener = new NodeListener() { @Override public void handleNewNodeState(NodeInfo currentInfo, NodeState newState) { - events.append("newNodeState(").append(currentInfo.getNode()).append(": ").append(newState).append("\n"); + events.append("newNodeState(").append(currentInfo.getNode()).append(": ").append(newState).append('\n'); } @Override public void handleNewWantedNodeState(NodeInfo node, NodeState newState) { - events.append("newWantedNodeState(").append(node.getNode()).append(": ").append(newState).append("\n"); + events.append("newWantedNodeState(").append(node.getNode()).append(": ").append(newState).append('\n'); + } + + @Override + public void handleRemovedNode(Node node) { + events.append("handleRemovedNode(").append(node).append(")\n"); } @Override @@ -59,7 +65,7 @@ public class ClusterControllerMock implements RemoteClusterControllerTaskSchedul } }; - context.nodeAddedOrRemovedListener = new NodeAddedOrRemovedListener() { + context.slobrokListener = new SlobrokListener() { @Override public void handleNewNode(NodeInfo node) { @@ -68,12 +74,12 @@ public class ClusterControllerMock implements RemoteClusterControllerTaskSchedul @Override public void handleMissingNode(NodeInfo node) { - events.append("newMissingNode(").append(node.getNode()).append("\n"); + events.append("newMissingNode(").append(node.getNode()).append('\n'); } @Override public void handleNewRpcAddress(NodeInfo node) { - events.append("newRpcAddress(").append(node.getNode()).append("\n"); + events.append("newRpcAddress(").append(node.getNode()).append('\n'); } @Override diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java index 090e80361e5..9f14b2e71d2 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/restapiv2/requests/SetNodeStateRequestTest.java @@ -10,7 +10,7 @@ import com.yahoo.vdslib.state.State; import com.yahoo.vespa.clustercontroller.core.ContentCluster; import com.yahoo.vespa.clustercontroller.core.NodeInfo; import com.yahoo.vespa.clustercontroller.core.NodeStateChangeChecker; -import com.yahoo.vespa.clustercontroller.core.listeners.NodeStateOrHostInfoChangeHandler; +import com.yahoo.vespa.clustercontroller.core.listeners.NodeListener; import com.yahoo.vespa.clustercontroller.utils.staterestapi.errors.StateRestApiException; import com.yahoo.vespa.clustercontroller.utils.staterestapi.requests.SetUnitStateRequest; import com.yahoo.vespa.clustercontroller.utils.staterestapi.response.SetResponse; @@ -38,7 +38,7 @@ public class SetNodeStateRequestTest { private final UnitState unitState = mock(UnitState.class); private final int NODE_INDEX = 2; private final Node storageNode = new Node(NodeType.STORAGE, NODE_INDEX); - private final NodeStateOrHostInfoChangeHandler stateListener = mock(NodeStateOrHostInfoChangeHandler.class); + private final NodeListener stateListener = mock(NodeListener.class); private final ClusterState currentClusterState = mock(ClusterState.class); private boolean inMasterMoratorium = false; private boolean probe = false; diff --git a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitTask.java b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitTask.java index 6362d6fe9a7..d9967381e75 100644 --- a/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitTask.java +++ b/clustercontroller-core/src/test/java/com/yahoo/vespa/clustercontroller/core/testutils/WaitTask.java @@ -25,7 +25,7 @@ public abstract class WaitTask { public boolean performWaitTask() { boolean didWork = false; synchronized (fleetController.getMonitor()) { - for (NodeInfo info : fleetController.getCluster().getNodeInfo()) { + for (NodeInfo info : fleetController.getCluster().getNodeInfos()) { if (info.getTimeForNextStateRequestAttempt() != 0) didWork = true; info.setNextGetStateAttemptTime(0); } |