Java Code Examples for org.apache.helix.HelixAdmin#getResourceExternalView()
The following examples show how to use
org.apache.helix.HelixAdmin#getResourceExternalView() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: TestAutoRebalanceWithDisabledInstance.java From helix with Apache License 2.0 | 6 votes |
private Set<String> getCurrentPartitionsOnInstance(String cluster, String dbName, String instance) { HelixAdmin admin = _gSetupTool.getClusterManagementTool(); Set<String> partitionSet = new HashSet<>(); ExternalView ev = admin.getResourceExternalView(cluster, dbName); for (String partition : ev.getRecord().getMapFields().keySet()) { Map<String, String> assignments = ev.getRecord().getMapField(partition); for (String ins : assignments.keySet()) { if (ins.equals(instance)) { partitionSet.add(partition); } } } return partitionSet; }
Example 2
Source File: LockManagerDemo.java From helix with Apache License 2.0 | 6 votes |
private static void printStatus(HelixAdmin admin, String cluster, String resource) { ExternalView externalView = admin.getResourceExternalView(cluster, resource); // System.out.println(externalView); TreeSet<String> treeSet = new TreeSet<String>(externalView.getPartitionSet()); System.out.println("lockName" + "\t" + "acquired By"); System.out.println("======================================"); for (String lockName : treeSet) { Map<String, String> stateMap = externalView.getStateMap(lockName); String acquiredBy = null; if (stateMap != null) { for (String instanceName : stateMap.keySet()) { if ("ONLINE".equals(stateMap.get(instanceName))) { acquiredBy = instanceName; break; } } } System.out.println(lockName + "\t" + ((acquiredBy != null) ? acquiredBy : "NONE")); } }
Example 3
Source File: ResourceAccessor.java From helix with Apache License 2.0 | 5 votes |
@GET @Path("{resourceName}/externalView") public Response getResourceExternalView(@PathParam("clusterId") String clusterId, @PathParam("resourceName") String resourceName) { HelixAdmin admin = getHelixAdmin(); ExternalView externalView = admin.getResourceExternalView(clusterId, resourceName); if (externalView != null) { return JSONRepresentation(externalView.getRecord()); } return notFound(); }
Example 4
Source File: HelixServerStarter.java From incubator-pinot with Apache License 2.0 | 5 votes |
private boolean isResourceOffline(HelixAdmin helixAdmin, String resource) { ExternalView externalView = helixAdmin.getResourceExternalView(_helixClusterName, resource); // Treat deleted resource as OFFLINE if (externalView == null) { return true; } for (String partition : externalView.getPartitionSet()) { Map<String, String> instanceStateMap = externalView.getStateMap(partition); String state = instanceStateMap.get(_instanceId); if (StateModel.SegmentStateModel.ONLINE.equals(state) || StateModel.SegmentStateModel.CONSUMING.equals(state)) { return false; } } return true; }
Example 5
Source File: TestAbnormalStatesResolver.java From helix with Apache License 2.0 | 4 votes |
@Test(dependsOnMethods = "testConfigureResolver") public void testExcessiveTopStateResolver() throws InterruptedException { BestPossibleExternalViewVerifier verifier = new BestPossibleExternalViewVerifier.Builder(CLUSTER_NAME).setZkClient(_gZkClient).build(); Assert.assertTrue(verifier.verify()); // 1. Find a partition with a MASTER replica and a SLAVE replica HelixAdmin admin = new ZKHelixAdmin.Builder().setZkAddress(ZK_ADDR).build(); ExternalView ev = admin.getResourceExternalView(CLUSTER_NAME, TEST_DB); String targetPartition = ev.getPartitionSet().iterator().next(); Map<String, String> partitionAssignment = ev.getStateMap(targetPartition); String slaveHost = partitionAssignment.entrySet().stream() .filter(entry -> entry.getValue().equals(MasterSlaveSMD.States.SLAVE.name())).findAny() .get().getKey(); long previousMasterUpdateTime = getTopStateUpdateTime(ev, targetPartition, MasterSlaveSMD.States.MASTER.name()); // Build SLAVE to MASTER message String msgId = new UUID(123, 456).toString(); Message msg = createMessage(Message.MessageType.STATE_TRANSITION, msgId, MasterSlaveSMD.States.SLAVE.name(), MasterSlaveSMD.States.MASTER.name(), TEST_DB, slaveHost); msg.setStateModelDef(MasterSlaveSMD.name); Criteria cr = new Criteria(); cr.setInstanceName(slaveHost); cr.setRecipientInstanceType(InstanceType.PARTICIPANT); cr.setSessionSpecific(true); cr.setPartition(targetPartition); cr.setResource(TEST_DB); cr.setClusterName(CLUSTER_NAME); AsyncCallback callback = new AsyncCallback() { @Override public void onTimeOut() { Assert.fail("The test state transition timeout."); } @Override public void onReplyMessage(Message message) { Assert.assertEquals(message.getMsgState(), Message.MessageState.READ); } }; // 2. Send the SLAVE to MASTER message to the SLAVE host to make abnormal partition states. // 2.A. Without resolver, the fixing is not completely done by the default rebalancer logic. _controller.getMessagingService() .sendAndWait(cr, msg, callback, (int) TestHelper.WAIT_DURATION); Thread.sleep(DEFAULT_REBALANCE_PROCESSING_WAIT_TIME); // Wait until the partition status is fixed, verify if the result is as expected verifier = new BestPossibleExternalViewVerifier.Builder(CLUSTER_NAME).setZkClient(_gZkClient).build(); Assert.assertTrue(verifier.verifyByPolling()); ev = admin.getResourceExternalView(CLUSTER_NAME, TEST_DB); Assert.assertEquals(ev.getStateMap(targetPartition).values().stream() .filter(state -> state.equals(MasterSlaveSMD.States.MASTER.name())).count(), 1); // Since the resolver is not used in the auto default fix process, there is no update on the // original master. So if there is any data issue, it was not fixed. long currentMasterUpdateTime = getTopStateUpdateTime(ev, targetPartition, MasterSlaveSMD.States.MASTER.name()); Assert.assertFalse(currentMasterUpdateTime > previousMasterUpdateTime); // 2.B. with resolver configured, the fixing is complete. ConfigAccessor configAccessor = new ConfigAccessor.Builder().setZkAddress(ZK_ADDR).build(); ClusterConfig clusterConfig = configAccessor.getClusterConfig(CLUSTER_NAME); clusterConfig.setAbnormalStateResolverMap( ImmutableMap.of(MasterSlaveSMD.name, ExcessiveTopStateResolver.class.getName())); configAccessor.setClusterConfig(CLUSTER_NAME, clusterConfig); _controller.getMessagingService() .sendAndWait(cr, msg, callback, (int) TestHelper.WAIT_DURATION); Thread.sleep(DEFAULT_REBALANCE_PROCESSING_WAIT_TIME); // Wait until the partition status is fixed, verify if the result is as expected Assert.assertTrue(verifier.verifyByPolling()); ev = admin.getResourceExternalView(CLUSTER_NAME, TEST_DB); Assert.assertEquals(ev.getStateMap(targetPartition).values().stream() .filter(state -> state.equals(MasterSlaveSMD.States.MASTER.name())).count(), 1); // Now the resolver is used in the auto fix process, the original master has also been refreshed. // The potential data issue has been fixed in this process. currentMasterUpdateTime = getTopStateUpdateTime(ev, targetPartition, MasterSlaveSMD.States.MASTER.name()); Assert.assertTrue(currentMasterUpdateTime > previousMasterUpdateTime); // Reset the resolver map clusterConfig = configAccessor.getClusterConfig(CLUSTER_NAME); clusterConfig.setAbnormalStateResolverMap(Collections.emptyMap()); configAccessor.setClusterConfig(CLUSTER_NAME, clusterConfig); }
Example 6
Source File: ResourceAccessor.java From helix with Apache License 2.0 | 4 votes |
private Map<String, String> computePartitionHealth(String clusterId, String resourceName) { HelixAdmin admin = getHelixAdmin(); IdealState idealState = admin.getResourceIdealState(clusterId, resourceName); ExternalView externalView = admin.getResourceExternalView(clusterId, resourceName); StateModelDefinition stateModelDef = admin.getStateModelDef(clusterId, idealState.getStateModelDefRef()); String initialState = stateModelDef.getInitialState(); List<String> statesPriorityList = stateModelDef.getStatesPriorityList(); statesPriorityList = statesPriorityList.subList(0, statesPriorityList.indexOf(initialState)); // Trim // stateList // to // initialState // and // above int minActiveReplicas = idealState.getMinActiveReplicas(); // Start the logic that determines the health status of each partition Map<String, String> partitionHealthResult = new HashMap<>(); Set<String> allPartitionNames = idealState.getPartitionSet(); if (!allPartitionNames.isEmpty()) { for (String partitionName : allPartitionNames) { int replicaCount = idealState.getReplicaCount(idealState.getPreferenceList(partitionName).size()); // Simplify expectedStateCountMap by assuming that all instances are available to reduce // computation load on this REST endpoint LinkedHashMap<String, Integer> expectedStateCountMap = stateModelDef.getStateCountMap(replicaCount, replicaCount); // Extract all states into Collections from ExternalView Map<String, String> stateMapInExternalView = externalView.getStateMap(partitionName); Collection<String> allReplicaStatesInExternalView = (stateMapInExternalView != null && !stateMapInExternalView.isEmpty()) ? stateMapInExternalView.values() : Collections.<String> emptyList(); int numActiveReplicasInExternalView = 0; HealthStatus status = HealthStatus.HEALTHY; // Go through all states that are "active" states (higher priority than InitialState) for (int statePriorityIndex = 0; statePriorityIndex < statesPriorityList .size(); statePriorityIndex++) { String currentState = statesPriorityList.get(statePriorityIndex); int currentStateCountInIdealState = expectedStateCountMap.get(currentState); int currentStateCountInExternalView = Collections.frequency(allReplicaStatesInExternalView, currentState); numActiveReplicasInExternalView += currentStateCountInExternalView; // Top state counts must match, if not, unhealthy if (statePriorityIndex == 0 && currentStateCountInExternalView != currentStateCountInIdealState) { status = HealthStatus.UNHEALTHY; break; } else if (currentStateCountInExternalView < currentStateCountInIdealState) { // For non-top states, if count in ExternalView is less than count in IdealState, // partially healthy status = HealthStatus.PARTIAL_HEALTHY; } } if (numActiveReplicasInExternalView < minActiveReplicas) { // If this partition does not satisfy the number of minimum active replicas, unhealthy status = HealthStatus.UNHEALTHY; } partitionHealthResult.put(partitionName, status.name()); } } return partitionHealthResult; }
Example 7
Source File: HelixHelper.java From incubator-pinot with Apache License 2.0 | 4 votes |
public static ExternalView getExternalViewForResource(HelixAdmin admin, String clusterName, String resourceName) { return admin.getResourceExternalView(clusterName, resourceName); }