|  | 
| 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