List<String> liveInstances = zkHelixDataAccessor.getChildNames(property); PropertyKey controllerLeaderKey = zkHelixDataAccessor.keyBuilder().controllerLeader(); LiveInstance controllerLeaderLiveInstance = zkHelixDataAccessor.getProperty(controllerLeaderKey); ControllerInfo controllerInfo = new ControllerInfo();
LiveInstance leader = _dataAccessor.getProperty(_keyBuilder.controllerLeader()); if (leader != null) { String leaderName = leader.getInstanceName();
@GET @Path("{clusterId}/controller") public Response getClusterController(@PathParam("clusterId") String clusterId) { HelixDataAccessor dataAccessor = getDataAccssor(clusterId); Map<String, Object> controllerInfo = new HashMap<>(); controllerInfo.put(Properties.id.name(), clusterId); LiveInstance leader = dataAccessor.getProperty(dataAccessor.keyBuilder().controllerLeader()); if (leader != null) { controllerInfo.put(ClusterProperties.controller.name(), leader.getInstanceName()); controllerInfo.putAll(leader.getRecord().getSimpleFields()); } else { controllerInfo.put(ClusterProperties.controller.name(), "No Lead Controller!"); } return JSONRepresentation(controllerInfo); }
.getInstanceName()))); Assert.assertNull(accessor.getProperty(keyBuilder.controllerLeader()));
LiveInstance currentLeader = accessor.getProperty(keyBuilder.controllerLeader()); if (currentLeader != null) { String currentSession = currentLeader.getSessionId();
PropertyKey.Builder keyBuilder = accessor.keyBuilder(); Assert.assertNull(accessor.getProperty(keyBuilder.liveInstance("localhost_12918"))); Assert.assertNull(accessor.getProperty(keyBuilder.controllerLeader()));
private boolean tryUpdateController(HelixManager manager) { HelixDataAccessor accessor = manager.getHelixDataAccessor(); Builder keyBuilder = accessor.keyBuilder(); LiveInstance leader = new LiveInstance(manager.getInstanceName()); try { leader.setLiveInstance(ManagementFactory.getRuntimeMXBean().getName()); leader.setSessionId(manager.getSessionId()); leader.setHelixVersion(manager.getVersion()); boolean success = accessor.createControllerLeader(leader); if (success) { return true; } else { LOG.info("Unable to become leader probably because some other controller becames the leader"); } } catch (Exception e) { LOG.error( "Exception when trying to updating leader record in cluster:" + manager.getClusterName() + ". Need to check again whether leader node has been created or not", e); } leader = accessor.getProperty(keyBuilder.controllerLeader()); if (leader != null) { String leaderSessionId = leader.getSessionId(); LOG.info("Leader exists for cluster: " + manager.getClusterName() + ", currentLeader: " + leader.getInstanceName() + ", leaderSessionId: " + leaderSessionId); if (leaderSessionId != null && leaderSessionId.equals(manager.getSessionId())) { return true; } } return false; }
@GET @Path("{clusterId}") public Response getClusterInfo(@PathParam("clusterId") String clusterId) { if (!isClusterExist(clusterId)) { return notFound(); } HelixDataAccessor dataAccessor = getDataAccssor(clusterId); PropertyKey.Builder keyBuilder = dataAccessor.keyBuilder(); Map<String, Object> clusterInfo = new HashMap<>(); clusterInfo.put(Properties.id.name(), clusterId); LiveInstance controller = dataAccessor.getProperty(keyBuilder.controllerLeader()); if (controller != null) { clusterInfo.put(ClusterProperties.controller.name(), controller.getInstanceName()); } else { clusterInfo.put(ClusterProperties.controller.name(), "No Lead Controller!"); } boolean paused = (dataAccessor.getProperty(keyBuilder.pause()) == null ? false : true); clusterInfo.put(ClusterProperties.paused.name(), paused); boolean maintenance = (dataAccessor.getProperty(keyBuilder.maintenance()) == null ? false : true); clusterInfo.put(ClusterProperties.maintenance.name(), maintenance); List<String> idealStates = dataAccessor.getChildNames(keyBuilder.idealStates()); clusterInfo.put(ClusterProperties.resources.name(), idealStates); List<String> instances = dataAccessor.getChildNames(keyBuilder.instanceConfigs()); clusterInfo.put(ClusterProperties.instances.name(), instances); List<String> liveInstances = dataAccessor.getChildNames(keyBuilder.liveInstances()); clusterInfo.put(ClusterProperties.liveInstances.name(), liveInstances); return JSONRepresentation(clusterInfo); }
StringRepresentation getClusterRepresentation(String clusterName) throws JsonGenerationException, JsonMappingException, IOException { ZkClient zkClient = ResourceUtil.getAttributeFromCtx(getContext(), ResourceUtil.ContextKey.ZKCLIENT); ClusterSetup setupTool = new ClusterSetup(zkClient); List<String> instances = setupTool.getClusterManagementTool().getInstancesInCluster(clusterName); ZNRecord clusterSummayRecord = new ZNRecord("Cluster Summary"); clusterSummayRecord.setListField("participants", instances); List<String> resources = setupTool.getClusterManagementTool().getResourcesInCluster(clusterName); clusterSummayRecord.setListField("resources", resources); List<String> models = setupTool.getClusterManagementTool().getStateModelDefs(clusterName); clusterSummayRecord.setListField("stateModelDefs", models); HelixDataAccessor accessor = ClusterRepresentationUtil.getClusterDataAccessor(zkClient, clusterName); Builder keyBuilder = accessor.keyBuilder(); LiveInstance leader = accessor.getProperty(keyBuilder.controllerLeader()); if (leader != null) { clusterSummayRecord.setSimpleField("LEADER", leader.getInstanceName()); } else { clusterSummayRecord.setSimpleField("LEADER", ""); } StringRepresentation representation = new StringRepresentation(ClusterRepresentationUtil.ZNRecordToJson(clusterSummayRecord), MediaType.APPLICATION_JSON); return representation; }
StringRepresentation getControllerRepresentation(String clusterName) throws JsonGenerationException, JsonMappingException, IOException { Builder keyBuilder = new PropertyKey.Builder(clusterName); ZkClient zkClient = ResourceUtil.getAttributeFromCtx(getContext(), ResourceUtil.ContextKey.ZKCLIENT); ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkClient)); ZNRecord record = null; LiveInstance leader = accessor.getProperty(keyBuilder.controllerLeader()); if (leader != null) { record = leader.getRecord(); } else { record = new ZNRecord(""); DateFormat formatter = new SimpleDateFormat("yyyyMMdd-HHmmss.SSSSSS"); String time = formatter.format(new Date()); Map<String, String> contentMap = new TreeMap<String, String>(); contentMap.put("AdditionalInfo", "No leader exists"); record.setMapField(Level.HELIX_INFO + "-" + time, contentMap); } boolean paused = (accessor.getProperty(keyBuilder.pause()) == null ? false : true); record.setSimpleField(PropertyType.PAUSE.toString(), "" + paused); String retVal = ClusterRepresentationUtil.ZNRecordToJson(record); StringRepresentation representation = new StringRepresentation(retVal, MediaType.APPLICATION_JSON); return representation; }
@Override public boolean isLeader() { if (_instanceType != InstanceType.CONTROLLER && _instanceType != InstanceType.CONTROLLER_PARTICIPANT) { return false; } if (!isConnected()) { return false; } try { LiveInstance leader = _dataAccessor.getProperty(_keyBuilder.controllerLeader()); if (leader != null) { String leaderName = leader.getInstanceName(); String sessionId = leader.getSessionId(); if (leaderName != null && leaderName.equals(_instanceName) && sessionId != null && sessionId.equals(_sessionId)) { return true; } } } catch (Exception e) { // log } return false; }
private void acquireLeadership(final HelixManager manager, ControllerManagerHelper controllerHelper) { LOG.info(manager.getInstanceName() + " is trying to acquire leadership for cluster: " + manager .getClusterName()); HelixDataAccessor accessor = manager.getHelixDataAccessor(); Builder keyBuilder = accessor.keyBuilder(); while (accessor.getProperty(keyBuilder.controllerLeader()) == null) { if (tryCreateController(manager)) { LOG.info("{} with session {} acquired leadership for cluster: {}", manager.getInstanceName(), manager.getSessionId(), manager.getClusterName()); updateHistory(manager); manager.getHelixDataAccessor().getBaseDataAccessor().reset(); controllerHelper.addListenersToController(_controller); controllerHelper.startControllerTimerTasks(); } } }
@Override public void dropCluster(String clusterName) { logger.info("Deleting cluster {}.", clusterName); HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient)); Builder keyBuilder = accessor.keyBuilder(); String root = "/" + clusterName; if (accessor.getChildNames(keyBuilder.liveInstances()).size() > 0) { throw new HelixException( "There are still live instances in the cluster, shut them down first."); } if (accessor.getProperty(keyBuilder.controllerLeader()) != null) { throw new HelixException("There are still LEADER in the cluster, shut them down first."); } _zkClient.deleteRecursively(root); }
@Override public boolean verify() { // Newly created node should have a new creating time but with old session. LiveInstance invalidLeaderNode = accessor.getProperty(keyBuilder.controllerLeader()); // node exist if (invalidLeaderNode == null) return false; // node is newly created if (invalidLeaderNode.getStat().getCreationTime() == originalCreationTime) return false; // node has the same session as the old one, so it's invalid if (!invalidLeaderNode.getSessionId().equals(originalSessionId)) return false; return true; } }, 2000));
@Override public void dropCluster(String clusterName) { logger.info("Deleting cluster {}.", clusterName); HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient)); Builder keyBuilder = accessor.keyBuilder(); String root = "/" + clusterName; if (accessor.getChildNames(keyBuilder.liveInstances()).size() > 0) { throw new HelixException( "There are still live instances in the cluster, shut them down first."); } if (accessor.getProperty(keyBuilder.controllerLeader()) != null) { throw new HelixException("There are still LEADER in the cluster, shut them down first."); } _zkClient.deleteRecursively(root); }
@Override public boolean verify() throws Exception { LiveInstance leader = accessor.getProperty(keyBuilder.controllerLeader()); return leader == null; } }, 5 * 1000);
@Override public boolean verify() { LiveInstance liveInstance = accessor.getProperty(keyBuilder.controllerLeader()); return liveInstance != null && controllerName.equals(liveInstance.getInstanceName()) && manager.getSessionId().equals(liveInstance.getSessionId()); } }, 1000));
@Override public boolean verify() throws Exception { LiveInstance leader = accessor.getProperty(keyBuilder.controllerLeader()); if (leader == null) { return false; } return leader.getInstanceName().equals(newControllerName); } }, 30 * 1000);
protected String getCurrentLeader(HelixZkClient zkClient, String clusterName) { ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkClient)); Builder keyBuilder = accessor.keyBuilder(); LiveInstance leader = accessor.getProperty(keyBuilder.controllerLeader()); if (leader == null) { return null; } return leader.getInstanceName(); }
@Override public boolean verify() { LiveInstance liveInstance = accessor.getProperty(keyBuilder.controllerLeader()); if (liveInstance != null) { // disconnect the current leader manager managerList.remove(liveInstance.getInstanceName()).disconnect(); return true; } else { return false; } } }, 1000));