@Override protected Map<String, String> getPartitionStateMap(ExternalView state) { Map<String, String> partitionState = new HashMap<>(); for (String partition : state.getPartitionSet()) { Map<String, String> instanceStateMap = state.getStateMap(partition); if (instanceStateMap.containsKey(_instanceName)) { partitionState.put(partition, instanceStateMap.get(_instanceName)); } } return partitionState; } }
/** * Get a set of offline instance from the external view of the resource. * * @param resourceExternalView External view of the resource * @return Set of string instance names of the offline instances in the external view. */ public static Set<String> getOfflineInstanceFromExternalView(ExternalView resourceExternalView) { Set<String> instanceSet = new HashSet<String>(); for (String partition : resourceExternalView.getPartitionSet()) { Map<String, String> stateMap = resourceExternalView.getStateMap(partition); for (String instance : stateMap.keySet()) { if (stateMap.get(instance).equalsIgnoreCase(OFFLINE)) { instanceSet.add(instance); } } } return instanceSet; }
/** * Returns the set of online instances from external view. * * @param resourceExternalView External view for the resource. * @return Set<String> of online instances in the external view for the resource. */ public static Set<String> getOnlineInstanceFromExternalView(ExternalView resourceExternalView) { Set<String> instanceSet = new HashSet<String>(); if (resourceExternalView != null) { for (String partition : resourceExternalView.getPartitionSet()) { Map<String, String> stateMap = resourceExternalView.getStateMap(partition); for (String instance : stateMap.keySet()) { if (stateMap.get(instance).equalsIgnoreCase(ONLINE)) { instanceSet.add(instance); } } } } return instanceSet; }
private void updateInstanceConfigsMapFromExternalView(Map<String, InstanceConfig> relevantInstanceConfigs, List<InstanceConfig> instanceConfigs, ExternalView externalView) { Set<String> relevantInstanceNames = new HashSet<>(); // Gather all the instance names contained in the external view for (String partitionName : externalView.getPartitionSet()) { relevantInstanceNames.addAll(externalView.getStateMap(partitionName).keySet()); } // Update the relevant instance config map with the instance configs given for (InstanceConfig instanceConfig : instanceConfigs) { if (relevantInstanceNames.contains(instanceConfig.getInstanceName())) { relevantInstanceConfigs.put(instanceConfig.getInstanceName(), instanceConfig); } } }
while (System.currentTimeMillis() < externalViewChangeCompletedDeadline) { ExternalView externalView = _helixAdmin.getResourceExternalView(_helixClusterName, tableName); Map<String, String> segmentStatsMap = externalView.getStateMap(segmentName); if (segmentStatsMap != null) { LOGGER.info("Found {} instances for segment '{}' in external view", segmentStatsMap.size(), segmentName);
private boolean noOnlineResources(HelixManager spectatorManager, Set<String> resources) { Iterator<String> iterator = resources.iterator(); while (iterator.hasNext()) { String resourceName = iterator.next(); ExternalView externalView = spectatorManager.getClusterManagmentTool().getResourceExternalView(_helixClusterName, resourceName); if (externalView == null) { iterator.remove(); continue; } for (String partition : externalView.getPartitionSet()) { Map<String, String> instanceStateMap = externalView.getStateMap(partition); if (instanceStateMap.containsKey(_instanceId)) { if ("ONLINE".equals(instanceStateMap.get(_instanceId))) { return false; } } } iterator.remove(); } return true; }
Map<String, String> helixPartitionState = externalView.getStateMap(segmentName.getSegmentName()); boolean allInConsumingState = true; int replicasInConsumingState = 0;
private boolean isLargeCluster(ExternalView externalView) { // Check if the number of replicas is sufficient to treat it as a large cluster final String helixReplicaCount = externalView.getRecord().getSimpleField("REPLICAS"); final int replicaCount; try { replicaCount = Integer.parseInt(helixReplicaCount); } catch (Exception e) { LOGGER.warn("Failed to parse the replica count ({}) from external view of table {}", helixReplicaCount, externalView.getResourceName()); return false; } if (replicaCount < _minReplicaCountForLargeCluster) { return false; } // Check if the server count is high enough to count as a large cluster final Set<String> instanceSet = new HashSet<>(); for (String partition : externalView.getPartitionSet()) { instanceSet.addAll(externalView.getStateMap(partition).keySet()); } return _minServerCountForLargeCluster <= instanceSet.size(); }
@Override protected Map<String, List<String>> computeSegmentToServersMapFromExternalView(ExternalView externalView, List<InstanceConfig> instanceConfigs) { Map<String, List<String>> segmentToServersMap = new HashMap<>(); RoutingTableInstancePruner instancePruner = new RoutingTableInstancePruner(instanceConfigs); for (String segmentName : externalView.getPartitionSet()) { List<String> servers = new ArrayList<>(); for (Map.Entry<String, String> entry : externalView.getStateMap(segmentName).entrySet()) { String serverName = entry.getKey(); if (entry.getValue().equals(CommonConstants.Helix.StateModel.SegmentOnlineOfflineStateModel.ONLINE) && !instancePruner.isInactive(serverName) && SegmentName.isHighLevelConsumerSegmentName(segmentName)) { servers.add(serverName); } } if (servers.size() != 0) { segmentToServersMap.put(segmentName, servers); } else { handleNoServingHost(segmentName); } } return segmentToServersMap; }
/** * Given an external view and a list of instance configs, computes the mapping of segment to servers. The mapping * will be cached if we use dynamic routing. By default, this will check ONLINE segments and active servers. * * @param externalView an external view * @param instanceConfigs a list of instance config * @return a mapping of segment to servers */ protected Map<String, List<String>> computeSegmentToServersMapFromExternalView(ExternalView externalView, List<InstanceConfig> instanceConfigs) { Map<String, List<String>> segmentToServersMap = new HashMap<>(); RoutingTableInstancePruner instancePruner = new RoutingTableInstancePruner(instanceConfigs); for (String segmentName : externalView.getPartitionSet()) { // List of servers that are active and are serving the segment List<String> servers = new ArrayList<>(); for (Map.Entry<String, String> entry : externalView.getStateMap(segmentName).entrySet()) { String serverName = entry.getKey(); if (entry.getValue().equals(CommonConstants.Helix.StateModel.SegmentOnlineOfflineStateModel.ONLINE) && !instancePruner.isInactive(serverName)) { servers.add(serverName); } } if (!servers.isEmpty()) { segmentToServersMap.put(segmentName, servers); } else { handleNoServingHost(segmentName); } } return segmentToServersMap; }
@Override public Boolean call() throws Exception { return _helixAdmin.getResourceExternalView(HELIX_CLUSTER_NAME, CommonConstants.Helix.BROKER_RESOURCE_INSTANCE) .getStateMap(COFFEE_TABLE_NAME).size() == SEGMENT_COUNT; } }, 30000L);
Map<String, String> segmentToInstancesMapFromExternalView = externalView.getStateMap(segmentId); Map<String, String> segmentToInstancesMapFromIdealStates = idealState.getInstanceStateMap(segmentId); if ((segmentToInstancesMapFromExternalView == null || segmentToInstancesMapFromExternalView.isEmpty()) && (
List<String> validServers = new ArrayList<>(); String segmentNameStr = segmentName.getSegmentName(); Map<String, String> externalViewState = externalView.getStateMap(segmentNameStr);
Map<String, String> stateMap = brokerResource.getStateMap(tableNameWithType); int otherOnlineBrokerCount = 0;
private List<InstanceConfig> getInstanceConfigs(ExternalView externalView) { List<InstanceConfig> instanceConfigs = new ArrayList<>(); Set<String> instances = new HashSet<>(); // Collect all unique instances for (String partitionName : externalView.getPartitionSet()) { for (String instance : externalView.getStateMap(partitionName).keySet()) { if (!instances.contains(instance)) { instanceConfigs.add(new InstanceConfig(instance)); instances.add(instance); } } } return instanceConfigs; }
HelixAdmin makeHelixAdmin() { HelixAdmin admin = mock(HelixAdmin.class); ExternalView ev = mock(ExternalView.class); IdealState is = mock(IdealState.class); when(admin.getResourceExternalView(clusterName, tableName)).thenReturn(ev); when(admin.getResourceIdealState(clusterName, tableName)).thenReturn(is); List<String> segmentsInIs = segmentsInIdealStateOrExtView(); Map<String, String> dummy = new HashMap<>(1); dummy.put("someHost", "ONLINE"); for (String segment : segmentsInIs) { when(is.getInstanceStateMap(segment)).thenReturn(dummy); } when(ev.getStateMap(anyString())).thenReturn(null); return admin; }
for (Map.Entry<String, String> entry : externalView.getStateMap(segmentName).entrySet()) { String serverName = entry.getKey(); String state = entry.getValue();
int replicaIdForNoPartitionMetadata = 0; for (Map.Entry<String, String> entry : externalView.getStateMap(segmentName).entrySet()) { String serverName = entry.getKey(); if (entry.getValue().equals(CommonConstants.Helix.StateModel.SegmentOnlineOfflineStateModel.ONLINE)
Map<String, String> stateMap = currentBrokerResource.getStateMap(tableNameWithType); if (stateMap == null) { LOGGER.info("No broker resource for Table {}. Removing its rate limit.", tableNameWithType);
Assert.assertEquals(externalView.getStateMap(DINING_TABLE_NAME).size(), SEGMENT_COUNT); Assert.assertEquals(externalView.getStateMap(COFFEE_TABLE_NAME).size(), SEGMENT_COUNT);