/** * Locate the controller leader so that we can send LLC segment completion requests to it. * Checks the {@link ControllerLeaderLocator::_cachedControllerLeaderInvalid} flag and fetches the leader from helix if cached value is invalid * * @return The host:port string of the current controller leader. */ public synchronized Pair<String, Integer> getControllerLeader() { if (!_cachedControllerLeaderInvalid) { return _controllerLeaderHostPort; } BaseDataAccessor<ZNRecord> dataAccessor = _helixManager.getHelixDataAccessor().getBaseDataAccessor(); Stat stat = new Stat(); try { ZNRecord znRecord = dataAccessor.get("/" + _clusterName + "/CONTROLLER/LEADER", stat, AccessOption.THROW_EXCEPTION_IFNOTEXIST); String leader = znRecord.getId(); int index = leader.lastIndexOf('_'); String leaderHost = leader.substring(0, index); int leaderPort = Integer.valueOf(leader.substring(index + 1)); _controllerLeaderHostPort = new Pair<>(leaderHost, leaderPort); _cachedControllerLeaderInvalid = false; LOGGER.info("Setting controller leader to be {}:{} as per znode version {}, mtime {}", leaderHost, leaderPort, stat.getVersion(), stat.getMtime()); return _controllerLeaderHostPort; } catch (Exception e) { LOGGER.warn("Could not locate controller leader, exception", e); _cachedControllerLeaderInvalid = true; return null; } }
helixDataAccessor.getBaseDataAccessor().getStats(externalViewPaths, AccessOption.PERSISTENT); long statEndTime = System.currentTimeMillis();
@Test public void testNoControllerLeader() { HelixManager helixManager = mock(HelixManager.class); HelixDataAccessor helixDataAccessor = mock(HelixDataAccessor.class); BaseDataAccessor<ZNRecord> baseDataAccessor = mock(BaseDataAccessor.class); when(helixManager.getHelixDataAccessor()).thenReturn(helixDataAccessor); when(helixDataAccessor.getBaseDataAccessor()).thenReturn(baseDataAccessor); when(baseDataAccessor.get(anyString(), (Stat) any(), anyInt())).thenThrow(new RuntimeException()); // Create Controller Leader Locator FakeControllerLeaderLocator.create(helixManager); ControllerLeaderLocator controllerLeaderLocator = FakeControllerLeaderLocator.getInstance(); Assert.assertEquals(controllerLeaderLocator.getControllerLeader(), null); }
Map<String, Stat> instanceConfigStatMap = new HashMap<>(); Stat[] instanceConfigStats = helixDataAccessor.getBaseDataAccessor().getStats(instancePaths, AccessOption.PERSISTENT); long statFetchEnd = System.currentTimeMillis();
@Test public void testControllerLeaderExists() { HelixManager helixManager = mock(HelixManager.class); HelixDataAccessor helixDataAccessor = mock(HelixDataAccessor.class); BaseDataAccessor<ZNRecord> baseDataAccessor = mock(BaseDataAccessor.class); ZNRecord znRecord = mock(ZNRecord.class); final String leaderHost = "host"; final int leaderPort = 12345; when(helixManager.getHelixDataAccessor()).thenReturn(helixDataAccessor); when(helixDataAccessor.getBaseDataAccessor()).thenReturn(baseDataAccessor); when(znRecord.getId()).thenReturn(leaderHost + "_" + leaderPort); when(baseDataAccessor.get(anyString(), (Stat) any(), anyInt())).thenReturn(znRecord); when(helixManager.getClusterName()).thenReturn("myCluster"); // Create Controller Leader Locator FakeControllerLeaderLocator.create(helixManager); ControllerLeaderLocator controllerLeaderLocator = FakeControllerLeaderLocator.getInstance(); Pair<String, Integer> expectedLeaderLocation = new Pair<>(leaderHost, leaderPort); Assert.assertEquals(controllerLeaderLocator.getControllerLeader().getFirst(), expectedLeaderLocation.getFirst()); Assert.assertEquals(controllerLeaderLocator.getControllerLeader().getSecond(), expectedLeaderLocation.getSecond()); }
if (dataAccessor.getBaseDataAccessor() .set(idealStateKey.getPath(), updatedIdealState.getRecord(), idealState.getRecord().getVersion(), AccessOption.PERSISTENT)) {
/** * Create Helix cluster if needed, and then start a Pinot controller instance. */ public synchronized void start() { _helixZkManager = HelixSetupUtils .setup(_helixClusterName, _helixZkURL, _instanceId, _isUpdateStateModel, _enableBatchMessageMode); Preconditions.checkNotNull(_helixZkManager); _helixAdmin = _helixZkManager.getClusterManagmentTool(); _propertyStore = _helixZkManager.getHelixPropertyStore(); _helixDataAccessor = _helixZkManager.getHelixDataAccessor(); // Cache instance zk paths. BaseDataAccessor<ZNRecord> baseDataAccessor = _helixDataAccessor.getBaseDataAccessor(); String instanceConfigs = PropertyPathBuilder.instanceConfig(_helixClusterName); _cacheInstanceConfigsDataAccessor = new ZkCacheBaseDataAccessor<>((ZkBaseDataAccessor<ZNRecord>) baseDataAccessor, instanceConfigs, null, Collections.singletonList(instanceConfigs)); _keyBuilder = _helixDataAccessor.keyBuilder(); _segmentDeletionManager = new SegmentDeletionManager(_dataDir, _helixAdmin, _helixClusterName, _propertyStore); ZKMetadataProvider.setClusterTenantIsolationEnabled(_propertyStore, _isSingleTenantCluster); _tableRebalancer = new TableRebalancer(_helixZkManager, _helixAdmin, _helixClusterName); }
ZkBaseDataAccessor zkBaseDataAccessor = (ZkBaseDataAccessor) dataAccessor.getBaseDataAccessor();
when(helixDataAccessor.getBaseDataAccessor()).thenReturn(baseDataAccessor); when(znRecord.getId()).thenReturn(leaderHost + "_" + leaderPort); when(baseDataAccessor.get(anyString(), any(), anyInt())).thenReturn(znRecord);
public static ZkHelixPropertyStore<ZNRecord> getZkPropertyStore(HelixManager helixManager, String clusterName) { ZkBaseDataAccessor<ZNRecord> baseAccessor = (ZkBaseDataAccessor<ZNRecord>) helixManager.getHelixDataAccessor().getBaseDataAccessor(); String propertyStorePath = PropertyPathConfig.getPath(PropertyType.PROPERTYSTORE, clusterName); ZkHelixPropertyStore<ZNRecord> propertyStore = new ZkHelixPropertyStore<ZNRecord>(baseAccessor, propertyStorePath, Arrays.asList(propertyStorePath)); return propertyStore; }
/** * Update context of the Workflow or Job */ private void updateContext(String resourceName, ZNRecord record, HelixDataAccessor accessor) { String path = String.format("/%s/%s%s/%s/%s", _clusterName, PropertyType.PROPERTYSTORE.name(), TaskConstants.REBALANCER_CONTEXT_ROOT, resourceName, TaskConstants.CONTEXT_NODE); accessor.getBaseDataAccessor().set(path, record, AccessOption.PERSISTENT); _contextMap.put(resourceName, record); }
public static ZkHelixPropertyStore<ZNRecord> getZkPropertyStore(HelixManager helixManager, String clusterName) { ZkBaseDataAccessor<ZNRecord> baseAccessor = (ZkBaseDataAccessor<ZNRecord>) helixManager.getHelixDataAccessor().getBaseDataAccessor(); String propertyStorePath = PropertyPathConfig.getPath(PropertyType.PROPERTYSTORE, clusterName); ZkHelixPropertyStore<ZNRecord> propertyStore = new ZkHelixPropertyStore<ZNRecord>(baseAccessor, propertyStorePath, Arrays.asList(propertyStorePath)); return propertyStore; }
public static ZkHelixPropertyStore<ZNRecord> getZkPropertyStore(HelixManager helixManager, String clusterName) { ZkBaseDataAccessor<ZNRecord> baseAccessor = (ZkBaseDataAccessor<ZNRecord>) helixManager.getHelixDataAccessor().getBaseDataAccessor(); String propertyStorePath = PropertyPathConfig.getPath(PropertyType.PROPERTYSTORE, clusterName); ZkHelixPropertyStore<ZNRecord> propertyStore = new ZkHelixPropertyStore<ZNRecord>(baseAccessor, propertyStorePath, Arrays.asList(propertyStorePath)); return propertyStore; }
public MockHelixAdmin(HelixManager manager) { _dataAccessor = manager.getHelixDataAccessor(); _baseDataAccessor = _dataAccessor.getBaseDataAccessor(); }
private HelixDataAccessor getRecipientDataAccessor(final Criteria recipientCriteria) { HelixDataAccessor dataAccessor = _manager.getHelixDataAccessor(); String clusterName = recipientCriteria.getClusterName(); if (clusterName != null && !clusterName.equals(_manager.getClusterName())) { // for cross cluster message, create new DataAccessor for sending message. /* TODO On frequent cross clsuter messaging request, keeping construct data accessor may cause performance issue. We should consider adding cache in this service or HelixManager. --JJ */ dataAccessor = new ZKHelixDataAccessor(clusterName, dataAccessor.getBaseDataAccessor()); } return dataAccessor; }
private HelixDataAccessor getSrcClusterDataAccessor(final Message message) { HelixDataAccessor helixDataAccessor = _manager.getHelixDataAccessor(); String clusterName = message.getSrcClusterName(); if (clusterName != null && !clusterName.equals(_manager.getClusterName())) { // for cross cluster message, create different HelixDataAccessor for replying message. /* TODO On frequent cross clsuter messaging request, keeping construct data accessor may cause performance issue. We should consider adding cache in this class or HelixManager. --JJ */ helixDataAccessor = new ZKHelixDataAccessor(clusterName, helixDataAccessor.getBaseDataAccessor()); } return helixDataAccessor; }
private void relinquishLeadership(HelixManager manager, ControllerManagerHelper controllerHelper) { LOG.info(manager.getInstanceName() + " relinquish leadership for cluster: " + manager .getClusterName()); controllerHelper.stopControllerTimerTasks(); controllerHelper.removeListenersFromController(_controller); // clear write-through cache manager.getHelixDataAccessor().getBaseDataAccessor().reset(); }
/** * Create the resource config. Fails if it already exists in ZK. * @param accessor * @param resource * @param resourceConfig * @return */ private static boolean createResourceConfig(HelixDataAccessor accessor, String resource, ResourceConfig resourceConfig) { PropertyKey.Builder keyBuilder = accessor.keyBuilder(); return accessor.getBaseDataAccessor().create(keyBuilder.resourceConfig(resource).getPath(), resourceConfig.getRecord(), AccessOption.PERSISTENT); }
private boolean waitForMessageProcessed(HelixDataAccessor accessor, String messageId) throws InterruptedException { String path = accessor.keyBuilder().message(_participant.getInstanceName(), messageId).getPath(); long startTime = System.currentTimeMillis(); while (accessor.getBaseDataAccessor().exists(path, 0)) { if (System.currentTimeMillis() - startTime > DEFAULT_TIMEOUT) { return false; } Thread.sleep(200); } return true; } }
private void setLeader(HelixManager manager) throws Exception { System.out.println("Setting controller " + manager.getInstanceName() + " as leader"); HelixDataAccessor accessor = manager.getHelixDataAccessor(); final LiveInstance leader = new LiveInstance(manager.getInstanceName()); leader.setLiveInstance(ManagementFactory.getRuntimeMXBean().getName()); leader.setSessionId(manager.getSessionId()); leader.setHelixVersion(manager.getVersion()); // Delete the current controller leader node so it will trigger leader election while (!manager.isLeader()) { accessor.getBaseDataAccessor() .remove(PropertyPathBuilder.controllerLeader(manager.getClusterName()), AccessOption.EPHEMERAL); Thread.sleep(50); } }