use of com.sequenceiq.cloudbreak.core.flow2.Flow2Handler in project cloudbreak by hortonworks.
the class HeartbeatServiceTest method testDistributionConcurrencyWithDifferentFlows.
@Test
public void testDistributionConcurrencyWithDifferentFlows() {
List<CloudbreakNode> clusterNodes = getClusterNodes();
// myself
clusterNodes.get(0).setLastUpdated(200_000);
// failed node
clusterNodes.get(1).setLastUpdated(50_000);
// active node
clusterNodes.get(2).setLastUpdated(200_000);
when(cloudbreakNodeRepository.findAll()).thenReturn(clusterNodes);
when(clock.getCurrentTime()).thenReturn(200_000L);
// all flows that need to be re-distributed
List<String> suspendedFlows = new ArrayList<>();
List<FlowLog> node1FlowLogs = getFlowLogs(3, 5000);
suspendedFlows.addAll(node1FlowLogs.stream().map(FlowLog::getFlowId).distinct().collect(Collectors.toList()));
when(flowLogRepository.findAllByCloudbreakNodeId(NODE_1_ID)).thenReturn(new HashSet<>(node1FlowLogs));
Map<CloudbreakNode, List<String>> distribution = new HashMap<>();
distribution.computeIfAbsent(clusterNodes.get(0), v -> new ArrayList<>()).addAll(Arrays.asList(suspendedFlows.get(0), suspendedFlows.get(2)));
distribution.computeIfAbsent(clusterNodes.get(2), v -> new ArrayList<>()).addAll(Collections.singletonList(suspendedFlows.get(1)));
when(flowDistributor.distribute(any(), any())).thenReturn(distribution);
List<FlowLog> myNewFlowLogs = node1FlowLogs.stream().filter(fl -> fl.getFlowId().equalsIgnoreCase(suspendedFlows.get(0))).collect(Collectors.toList());
when(flowLogRepository.findAllByCloudbreakNodeId(MY_ID)).thenReturn(new HashSet<>(myNewFlowLogs));
when(runningFlows.get(any())).thenReturn(null);
when(flowLogRepository.save(anyCollection())).thenThrow(new OptimisticLockingFailureException("Someone already distributed the flows.."));
heartbeatService.scheduledFlowDistribution();
verify(flow2Handler, times(1)).restartFlow(stringCaptor.capture());
List<String> allFlowIds = stringCaptor.getAllValues();
assertEquals(1, allFlowIds.size());
for (FlowLog flowLog : myNewFlowLogs) {
assertTrue(allFlowIds.contains(flowLog.getFlowId()));
}
}
Aggregations