|
49 | 49 | import static org.mockito.ArgumentMatchers.any; |
50 | 50 | import static org.mockito.Mockito.spy; |
51 | 51 | import static org.mockito.Mockito.verify; |
| 52 | +import static org.mockito.Mockito.verifyNoInteractions; |
52 | 53 |
|
53 | 54 | public class InternalClusterInfoServiceSchedulingTests extends ESTestCase { |
54 | 55 |
|
55 | 56 | public void testScheduling() { |
56 | 57 | final DiscoveryNode discoveryNode = DiscoveryNodeUtils.create("test"); |
57 | 58 | final DiscoveryNodes noMaster = DiscoveryNodes.builder().add(discoveryNode).localNodeId(discoveryNode.getId()).build(); |
58 | 59 | final DiscoveryNodes localMaster = noMaster.withMasterNodeId(discoveryNode.getId()); |
| 60 | + final DiscoveryNode joiner = DiscoveryNodeUtils.create("joiner"); |
| 61 | + final DiscoveryNodes withJoiner = DiscoveryNodes.builder(localMaster).add(joiner).build(); |
59 | 62 |
|
60 | 63 | final Settings.Builder settingsBuilder = Settings.builder() |
61 | 64 | .put(Node.NODE_NAME_SETTING.getKey(), discoveryNode.getName()) |
@@ -129,6 +132,45 @@ public void reroute(String reason, Priority priority, ActionListener<Void> liste |
129 | 132 | ); |
130 | 133 | runUntilFlag(deterministicTaskQueue, becameMaster1); |
131 | 134 |
|
| 135 | + // A node joins the cluster |
| 136 | + { |
| 137 | + Mockito.clearInvocations(mockEstimatedHeapUsageCollector, nodeUsageStatsForThreadPoolsCollector); |
| 138 | + final int initialRequestCount = client.requestCount; |
| 139 | + final AtomicBoolean nodeJoined = new AtomicBoolean(); |
| 140 | + clusterApplierService.onNewClusterState( |
| 141 | + "node joins", |
| 142 | + () -> ClusterState.builder(new ClusterName("cluster")).nodes(withJoiner).build(), |
| 143 | + setFlagOnSuccess(nodeJoined) |
| 144 | + ); |
| 145 | + // Don't use runUntilFlag because we don't want the scheduled task to run |
| 146 | + deterministicTaskQueue.runAllRunnableTasks(); |
| 147 | + assertTrue(nodeJoined.get()); |
| 148 | + // Addition of node should have triggered refresh |
| 149 | + // should have run two client requests: nodes stats request and indices stats request |
| 150 | + assertThat(client.requestCount, equalTo(initialRequestCount + 2)); |
| 151 | + verify(mockEstimatedHeapUsageCollector).collectClusterHeapUsage(any()); // Should have polled for heap usage |
| 152 | + verify(nodeUsageStatsForThreadPoolsCollector).collectUsageStats(any(), any(), any()); |
| 153 | + } |
| 154 | + |
| 155 | + // ... then leaves |
| 156 | + { |
| 157 | + Mockito.clearInvocations(mockEstimatedHeapUsageCollector, nodeUsageStatsForThreadPoolsCollector); |
| 158 | + final int initialRequestCount = client.requestCount; |
| 159 | + final AtomicBoolean nodeLeft = new AtomicBoolean(); |
| 160 | + clusterApplierService.onNewClusterState( |
| 161 | + "node leaves", |
| 162 | + () -> ClusterState.builder(new ClusterName("cluster")).nodes(localMaster).build(), |
| 163 | + setFlagOnSuccess(nodeLeft) |
| 164 | + ); |
| 165 | + // Don't use runUntilFlag because we don't want the scheduled task to run |
| 166 | + deterministicTaskQueue.runAllRunnableTasks(); |
| 167 | + assertTrue(nodeLeft.get()); |
| 168 | + // departing nodes don't trigger refreshes |
| 169 | + assertThat(client.requestCount, equalTo(initialRequestCount)); |
| 170 | + verifyNoInteractions(mockEstimatedHeapUsageCollector); |
| 171 | + verifyNoInteractions(nodeUsageStatsForThreadPoolsCollector); |
| 172 | + } |
| 173 | + |
132 | 174 | final AtomicBoolean failMaster1 = new AtomicBoolean(); |
133 | 175 | clusterApplierService.onNewClusterState( |
134 | 176 | "fail master 1", |
|
0 commit comments