private void addAndRemoveNewInstanceConfig(ZkClient zkClient) throws Exception { int biggerRandomNumber = NUM_INSTANCES + new Random().nextInt(NUM_INSTANCES); String instanceName = "Server_localhost_" + String.valueOf(biggerRandomNumber); String instanceConfigPath = PropertyPathBuilder.instanceConfig(_helixClusterName, instanceName); Assert.assertFalse(zkClient.exists(instanceConfigPath)); List<String> instances = _helixResourceManager.getAllInstances(); Assert.assertFalse(instances.contains(instanceName)); // Add new ZNode. ZNRecord znRecord = new ZNRecord(instanceName); zkClient.createPersistent(instanceConfigPath, znRecord); List<String> latestAllInstances = _helixResourceManager.getAllInstances(); long maxTime = System.currentTimeMillis() + MAX_TIMEOUT_IN_MILLISECOND; while (!latestAllInstances.contains(instanceName) && System.currentTimeMillis() < maxTime) { Thread.sleep(100L); latestAllInstances = _helixResourceManager.getAllInstances(); } Assert.assertTrue(System.currentTimeMillis() < maxTime, "Timeout when waiting for adding instance config"); // Remove new ZNode. zkClient.delete(instanceConfigPath); latestAllInstances = _helixResourceManager.getAllInstances(); maxTime = System.currentTimeMillis() + MAX_TIMEOUT_IN_MILLISECOND; while (latestAllInstances.contains(instanceName) && System.currentTimeMillis() < maxTime) { Thread.sleep(100L); latestAllInstances = _helixResourceManager.getAllInstances(); } Assert.assertTrue(System.currentTimeMillis() < maxTime, "Timeout when waiting for removing instance config"); }
/** * 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); }
private void modifyExistingInstanceConfig(ZkClient zkClient) throws InterruptedException { String instanceName = "Server_localhost_" + new Random().nextInt(NUM_INSTANCES); String instanceConfigPath = PropertyPathBuilder.instanceConfig(_helixClusterName, instanceName); Assert.assertTrue(zkClient.exists(instanceConfigPath)); ZNRecord znRecord = zkClient.readData(instanceConfigPath, null); InstanceConfig cachedInstanceConfig = _helixResourceManager.getHelixInstanceConfig(instanceName); String originalPort = cachedInstanceConfig.getPort(); Assert.assertNotNull(originalPort); String newPort = Long.toString(System.currentTimeMillis()); Assert.assertTrue(!newPort.equals(originalPort)); // Set new port to this instance config. znRecord.setSimpleField(InstanceConfig.InstanceConfigProperty.HELIX_PORT.toString(), newPort); zkClient.writeData(instanceConfigPath, znRecord); long maxTime = System.currentTimeMillis() + MAX_TIMEOUT_IN_MILLISECOND; InstanceConfig latestCachedInstanceConfig = _helixResourceManager.getHelixInstanceConfig(instanceName); String latestPort = latestCachedInstanceConfig.getPort(); while (!newPort.equals(latestPort) && System.currentTimeMillis() < maxTime) { Thread.sleep(100L); latestCachedInstanceConfig = _helixResourceManager.getHelixInstanceConfig(instanceName); latestPort = latestCachedInstanceConfig.getPort(); } Assert.assertTrue(System.currentTimeMillis() < maxTime, "Timeout when waiting for adding instance config"); // Set original port back to this instance config. znRecord.setSimpleField(InstanceConfig.InstanceConfigProperty.HELIX_PORT.toString(), originalPort); zkClient.writeData(instanceConfigPath, znRecord); }
@Test() public void testNullChildren() { String path = PropertyPathBuilder.instanceConfig(clusterName, "id6"); ZKUtil.createChildren(_gZkClient, path, (List<ZNRecord>) null); }
@Override public List<String> getInstancesByDomain(String clusterName, String domain) { List<String> instances = new ArrayList<>(); String path = PropertyPathBuilder.instanceConfig(clusterName); BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<>(_zkClient); List<ZNRecord> znRecords = baseAccessor.getChildren(path, null, 0); for (ZNRecord record : znRecords) { if (record != null) { InstanceConfig instanceConfig = new InstanceConfig(record); if (instanceConfig.isInstanceInDomain(domain)) { instances.add(instanceConfig.getInstanceName()); } } } return instances; }
@Override public List<String> getInstancesByDomain(String clusterName, String domain) { List<String> instances = new ArrayList<>(); String path = PropertyPathBuilder.instanceConfig(clusterName); BaseDataAccessor<ZNRecord> baseAccessor = new ZkBaseDataAccessor<>(_zkClient); List<ZNRecord> znRecords = baseAccessor.getChildren(path, null, 0); for (ZNRecord record : znRecords) { if (record != null) { InstanceConfig instanceConfig = new InstanceConfig(record); if (instanceConfig.isInstanceInDomain(domain)) { instances.add(instanceConfig.getInstanceName()); } } } return instances; }
private void enableSingleInstance(final String clusterName, final String instanceName, final boolean enabled, BaseDataAccessor<ZNRecord> baseAccessor) { String path = PropertyPathBuilder.instanceConfig(clusterName, instanceName); if (!baseAccessor.exists(path, 0)) { throw new HelixException("Cluster " + clusterName + ", instance: " + instanceName + ", instance config does not exist"); } baseAccessor.update(path, new DataUpdater<ZNRecord>() { @Override public ZNRecord update(ZNRecord currentData) { if (currentData == null) { throw new HelixException("Cluster: " + clusterName + ", instance: " + instanceName + ", participant config is null"); } InstanceConfig config = new InstanceConfig(currentData); config.setInstanceEnabled(enabled); return config.getRecord(); } }, AccessOption.PERSISTENT); }
private void enableSingleInstance(final String clusterName, final String instanceName, final boolean enabled, BaseDataAccessor<ZNRecord> baseAccessor) { String path = PropertyPathBuilder.instanceConfig(clusterName, instanceName); if (!baseAccessor.exists(path, 0)) { throw new HelixException("Cluster " + clusterName + ", instance: " + instanceName + ", instance config does not exist"); } baseAccessor.update(path, new DataUpdater<ZNRecord>() { @Override public ZNRecord update(ZNRecord currentData) { if (currentData == null) { throw new HelixException("Cluster: " + clusterName + ", instance: " + instanceName + ", participant config is null"); } InstanceConfig config = new InstanceConfig(currentData); config.setInstanceEnabled(enabled); return config.getRecord(); } }, AccessOption.PERSISTENT); }
@Override public InstanceConfig getInstanceConfig(String clusterName, String instanceName) { logger.info("Get instance config for instance {} from cluster {}.", instanceName, clusterName); String instanceConfigPath = PropertyPathBuilder.instanceConfig(clusterName, instanceName); if (!_zkClient.exists(instanceConfigPath)) { throw new HelixException( "instance" + instanceName + " does not exist in cluster " + clusterName); } HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient)); Builder keyBuilder = accessor.keyBuilder(); return accessor.getProperty(keyBuilder.instanceConfig(instanceName)); }
@Override public InstanceConfig getInstanceConfig(String clusterName, String instanceName) { logger.info("Get instance config for instance {} from cluster {}.", instanceName, clusterName); String instanceConfigPath = PropertyPathBuilder.instanceConfig(clusterName, instanceName); if (!_zkClient.exists(instanceConfigPath)) { throw new HelixException( "instance" + instanceName + " does not exist in cluster " + clusterName); } HelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(_zkClient)); Builder keyBuilder = accessor.keyBuilder(); return accessor.getProperty(keyBuilder.instanceConfig(instanceName)); }
@Override public void dropInstance(String clusterName, InstanceConfig instanceConfig) { logger.info("Drop instance {} from cluster {}.", instanceConfig.getInstanceName(), clusterName); String instanceName = instanceConfig.getInstanceName(); String instanceConfigPath = PropertyPathBuilder.instanceConfig(clusterName, instanceName); if (!_zkClient.exists(instanceConfigPath)) { throw new HelixException( "Node " + instanceName + " does not exist in config for cluster " + clusterName); } String instancePath = PropertyPathBuilder.instance(clusterName, instanceName); if (!_zkClient.exists(instancePath)) { throw new HelixException( "Node " + instanceName + " does not exist in instances for cluster " + clusterName); } String liveInstancePath = PropertyPathBuilder.liveInstance(clusterName, instanceName); if (_zkClient.exists(liveInstancePath)) { throw new HelixException( "Node " + instanceName + " is still alive for cluster " + clusterName + ", can't drop."); } // delete config path String instanceConfigsPath = PropertyPathBuilder.instanceConfig(clusterName); ZKUtil.dropChildren(_zkClient, instanceConfigsPath, instanceConfig.getRecord()); // delete instance path _zkClient.deleteRecursively(instancePath); }
@Test() public void testChildrenOperations() { List<ZNRecord> list = new ArrayList<ZNRecord>(); list.add(new ZNRecord("id1")); list.add(new ZNRecord("id2")); String path = PropertyPathBuilder.instanceConfig(clusterName); ZKUtil.createChildren(_gZkClient, path, list); list = ZKUtil.getChildren(_gZkClient, path); AssertJUnit.assertEquals(2, list.size()); ZKUtil.dropChildren(_gZkClient, path, list); ZKUtil.dropChildren(_gZkClient, path, new ZNRecord("id1")); list = ZKUtil.getChildren(_gZkClient, path); AssertJUnit.assertEquals(0, list.size()); ZKUtil.dropChildren(_gZkClient, path, (List<ZNRecord>) null); }
@Test() public void testSubtract() { String path = PropertyPathBuilder.instanceConfig(clusterName, "id5"); ZNRecord record = new ZNRecord("id5"); record.setSimpleField("key1", "value1"); _gZkClient.createPersistent(path, record); ZKUtil.subtract(_gZkClient, path, record); record = _gZkClient.readData(path); AssertJUnit.assertNull(record.getSimpleField("key1")); }
public void verifyInstance(HelixZkClient zkClient, String clusterName, String instance, boolean wantExists) { // String instanceConfigsPath = HelixUtil.getConfigPath(clusterName); String instanceConfigsPath = PropertyPathBuilder.instanceConfig(clusterName); String instanceConfigPath = instanceConfigsPath + "/" + instance; String instancePath = PropertyPathBuilder.instance(clusterName, instance); AssertJUnit.assertEquals(wantExists, zkClient.exists(instanceConfigPath)); AssertJUnit.assertEquals(wantExists, zkClient.exists(instancePath)); }
@Override public void addInstance(String clusterName, InstanceConfig instanceConfig) { logger.info("Add instance {} to cluster {}.", instanceConfig.getInstanceName(), clusterName); if (!ZKUtil.isClusterSetup(clusterName, _zkClient)) { throw new HelixException("cluster " + clusterName + " is not setup yet"); } String instanceConfigsPath = PropertyPathBuilder.instanceConfig(clusterName); String nodeId = instanceConfig.getId(); String instanceConfigPath = instanceConfigsPath + "/" + nodeId; if (_zkClient.exists(instanceConfigPath)) { throw new HelixException("Node " + nodeId + " already exists in cluster " + clusterName); } ZKUtil.createChildren(_zkClient, instanceConfigsPath, instanceConfig.getRecord()); _zkClient.createPersistent(PropertyPathBuilder.instanceMessage(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceCurrentState(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceError(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceStatusUpdate(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceHistory(clusterName, nodeId), true); }
@Test() public void testCreateOrReplace() { String path = PropertyPathBuilder.instanceConfig(clusterName, "id8"); ZNRecord record = new ZNRecord("id8"); ZKUtil.createOrReplace(_gZkClient, path, record, true); record = _gZkClient.readData(path); AssertJUnit.assertEquals("id8", record.getId()); record = new ZNRecord("id9"); ZKUtil.createOrReplace(_gZkClient, path, record, true); record = _gZkClient.readData(path); AssertJUnit.assertEquals("id9", record.getId()); }
@Override public void addInstance(String clusterName, InstanceConfig instanceConfig) { logger.info("Add instance {} to cluster {}.", instanceConfig.getInstanceName(), clusterName); if (!ZKUtil.isClusterSetup(clusterName, _zkClient)) { throw new HelixException("cluster " + clusterName + " is not setup yet"); } String instanceConfigsPath = PropertyPathBuilder.instanceConfig(clusterName); String nodeId = instanceConfig.getId(); String instanceConfigPath = instanceConfigsPath + "/" + nodeId; if (_zkClient.exists(instanceConfigPath)) { throw new HelixException("Node " + nodeId + " already exists in cluster " + clusterName); } ZKUtil.createChildren(_zkClient, instanceConfigsPath, instanceConfig.getRecord()); _zkClient.createPersistent(PropertyPathBuilder.instanceMessage(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceCurrentState(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceError(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceStatusUpdate(clusterName, nodeId), true); _zkClient.createPersistent(PropertyPathBuilder.instanceHistory(clusterName, nodeId), true); }
@Test() public void testUpdateIfExists() { String path = PropertyPathBuilder.instanceConfig(clusterName, "id3"); ZNRecord record = new ZNRecord("id4"); ZKUtil.updateIfExists(_gZkClient, path, record, false); AssertJUnit.assertFalse(_gZkClient.exists(path)); _gZkClient.createPersistent(path); ZKUtil.updateIfExists(_gZkClient, path, record, false); AssertJUnit.assertTrue(_gZkClient.exists(path)); record = _gZkClient.readData(path); AssertJUnit.assertEquals("id4", record.getId()); }
@Override public void enableInstance(String clusterName, String instanceName, boolean enabled) { String instanceConfigsPath = PropertyPathBuilder.instanceConfig(clusterName); if (!_baseDataAccessor.exists(instanceConfigsPath, 0)) { _baseDataAccessor.create(instanceConfigsPath, new ZNRecord(instanceName), 0); } String instanceConfigPath = instanceConfigsPath + "/" + instanceName; ZNRecord record = (ZNRecord) _baseDataAccessor.get(instanceConfigPath, null, 0); InstanceConfig instanceConfig = new InstanceConfig(record); instanceConfig.setInstanceEnabled(enabled); _baseDataAccessor.set(instanceConfigPath, instanceConfig.getRecord(), 0); }
@Override public void addInstance(String clusterName, InstanceConfig instanceConfig) { String instanceConfigsPath = PropertyPathBuilder.instanceConfig(clusterName); String nodeId = instanceConfig.getId(); if (!_baseDataAccessor.exists(instanceConfigsPath, 0)) { _baseDataAccessor.create(instanceConfigsPath, new ZNRecord(nodeId), 0); } String instanceConfigPath = instanceConfigsPath + "/" + nodeId; _baseDataAccessor.create(instanceConfigPath, instanceConfig.getRecord(), 0); _baseDataAccessor .set(PropertyPathBuilder.instanceMessage(clusterName, nodeId), new ZNRecord(nodeId), 0); _baseDataAccessor .set(PropertyPathBuilder.instanceCurrentState(clusterName, nodeId), new ZNRecord(nodeId), 0); _baseDataAccessor .set(PropertyPathBuilder.instanceError(clusterName, nodeId), new ZNRecord(nodeId), 0); _baseDataAccessor .set(PropertyPathBuilder.instanceStatusUpdate(clusterName, nodeId), new ZNRecord(nodeId), 0); _baseDataAccessor .set(PropertyPathBuilder.instanceHistory(clusterName, nodeId), new ZNRecord(nodeId), 0); }