public OfflineTagConfig(TableConfig tableConfig) { super(tableConfig); _offlineServerTag = TagNameUtils.getOfflineTagForTenant(_serverTenant); }
public static String getTagFromTenantAndServerType(String tenantName, ServerType type) { if (type == ServerType.OFFLINE) { return getOfflineTagForTenant(tenantName); } return getRealtimeTagForTenant(tenantName); }
public static String getOfflineTagForTenant(String tenantName) { if (tenantName == null) { return TagNameUtils.getOfflineTagForTenant(DEFAULT_TENANT_NAME); } if (tenantName.endsWith(ServerType.OFFLINE.toString())) { return tenantName; } else { return TagNameUtils.buildOfflineTagFromTenantName(tenantName); } }
@Override public List<String> getAssignedInstances(HelixManager helixManager, HelixAdmin helixAdmin, ZkHelixPropertyStore<ZNRecord> propertyStore, String helixClusterName, SegmentMetadata segmentMetadata, int numReplicas, String tenantName) { String serverTenantName = TagNameUtils.getOfflineTagForTenant(tenantName); final Random random = new Random(System.currentTimeMillis()); List<String> allInstanceList = HelixHelper.getEnabledInstancesWithTag(helixManager, serverTenantName); List<String> selectedInstanceList = new ArrayList<>(); for (int i = 0; i < numReplicas; ++i) { final int idx = random.nextInt(allInstanceList.size()); selectedInstanceList.add(allInstanceList.get(idx)); allInstanceList.remove(idx); } LOGGER.info("Segment assignment result for : " + segmentMetadata.getName() + ", in resource : " + segmentMetadata .getTableName() + ", selected instances: " + Arrays.toString(selectedInstanceList.toArray())); return selectedInstanceList; } }
/** * Returns the server instances in the cluster for the given tenant. * * TODO: refactor code to use this method if applicable to reuse instance configs in order to reduce ZK accesses */ public static Set<String> getServerInstancesForTenant(List<InstanceConfig> instanceConfigs, String tenant) { Set<String> serverInstances = new HashSet<>(); serverInstances .addAll(HelixHelper.getInstancesWithTag(instanceConfigs, TagNameUtils.getOfflineTagForTenant(tenant))); serverInstances .addAll(HelixHelper.getInstancesWithTag(instanceConfigs, TagNameUtils.getRealtimeTagForTenant(tenant))); return serverInstances; }
public boolean isTenantExisted(String tenantName) { if (!HelixHelper.getInstancesWithTag(_helixZkManager, TagNameUtils.getBrokerTagForTenant(tenantName)).isEmpty()) { return true; } if (!HelixHelper.getInstancesWithTag(_helixZkManager, TagNameUtils.getOfflineTagForTenant(tenantName)).isEmpty()) { return true; } if (!HelixHelper.getInstancesWithTag(_helixZkManager, TagNameUtils.getRealtimeTagForTenant(tenantName)).isEmpty()) { return true; } return false; }
public PinotResourceManagerResponse deleteOfflineServerTenantFor(String tenantName) { String offlineTenantTag = TagNameUtils.getOfflineTagForTenant(tenantName); List<String> instancesInClusterWithTag = HelixHelper.getInstancesWithTag(_helixZkManager, offlineTenantTag); for (String instanceName : instancesInClusterWithTag) { _helixAdmin.removeInstanceTag(_helixClusterName, instanceName, offlineTenantTag); if (getTagsForInstance(instanceName).isEmpty()) { _helixAdmin.addInstanceTag(_helixClusterName, instanceName, CommonConstants.Helix.UNTAGGED_SERVER_INSTANCE); } } return PinotResourceManagerResponse.SUCCESS; }
@Override public List<String> getAssignedInstances(HelixManager helixManager, HelixAdmin helixAdmin, ZkHelixPropertyStore<ZNRecord> propertyStore, String helixClusterName, SegmentMetadata segmentMetadata, int numReplicas, String tenantName) { String serverTenantName = TagNameUtils.getOfflineTagForTenant(tenantName); List<String> allInstances = HelixHelper.getEnabledInstancesWithTag(helixManager, serverTenantName); List<String> selectedInstanceList = new ArrayList<>(); if (segmentMetadata.getShardingKey() != null) { for (String instance : allInstances) { if (HelixHelper.getInstanceConfigsMapFor(instance, helixClusterName, helixAdmin).get("shardingKey") .equalsIgnoreCase(segmentMetadata.getShardingKey())) { selectedInstanceList.add(instance); } } LOGGER.info("Segment assignment result for : " + segmentMetadata.getName() + ", in resource : " + segmentMetadata .getTableName() + ", selected instances: " + Arrays.toString(selectedInstanceList.toArray())); return selectedInstanceList; } else { throw new RuntimeException("Segment missing sharding key!"); } } }
int numReplicas, String tenantName) { String offlineTableName = TableNameBuilder.OFFLINE.tableNameWithType(segmentMetadata.getTableName()); String serverTenantName = TagNameUtils.getOfflineTagForTenant(tenantName);
public PinotResourceManagerResponse updateServerTenant(Tenant serverTenant) { String realtimeServerTag = TagNameUtils.getRealtimeTagForTenant(serverTenant.getTenantName()); List<String> taggedRealtimeServers = HelixHelper.getInstancesWithTag(_helixZkManager, realtimeServerTag); String offlineServerTag = TagNameUtils.getOfflineTagForTenant(serverTenant.getTenantName()); List<String> taggedOfflineServers = HelixHelper.getInstancesWithTag(_helixZkManager, offlineServerTag); Set<String> allServingServers = new HashSet<>(); allServingServers.addAll(taggedOfflineServers); allServingServers.addAll(taggedRealtimeServers); boolean isCurrentTenantColocated = (allServingServers.size() < taggedOfflineServers.size() + taggedRealtimeServers.size()); if (isCurrentTenantColocated != serverTenant.isCoLocated()) { String message = "Not support different colocated type request for update request: " + serverTenant; LOGGER.error(message); return PinotResourceManagerResponse.failure(message); } if (serverTenant.getNumberOfInstances() < allServingServers.size() || serverTenant.getOfflineInstances() < taggedOfflineServers.size() || serverTenant.getRealtimeInstances() < taggedRealtimeServers.size()) { return scaleDownServer(serverTenant, taggedRealtimeServers, taggedOfflineServers, allServingServers); } return scaleUpServerTenant(serverTenant, realtimeServerTag, taggedRealtimeServers, offlineServerTag, taggedOfflineServers, allServingServers); }
private void assignColocatedServerTenant(Tenant serverTenant, int numberOfInstances, List<String> unTaggedInstanceList) { int cnt = 0; String offlineServerTag = TagNameUtils.getOfflineTagForTenant(serverTenant.getTenantName()); for (int i = 0; i < serverTenant.getOfflineInstances(); i++) { retagInstance(unTaggedInstanceList.get(cnt++), CommonConstants.Helix.UNTAGGED_SERVER_INSTANCE, offlineServerTag); } String realtimeServerTag = TagNameUtils.getRealtimeTagForTenant(serverTenant.getTenantName()); for (int i = 0; i < serverTenant.getRealtimeInstances(); i++) { retagInstance(unTaggedInstanceList.get(cnt++), CommonConstants.Helix.UNTAGGED_SERVER_INSTANCE, realtimeServerTag); if (cnt == numberOfInstances) { cnt = 0; } } }
private void assignIndependentServerTenant(Tenant serverTenant, int numberOfInstances, List<String> unTaggedInstanceList) { String offlineServerTag = TagNameUtils.getOfflineTagForTenant(serverTenant.getTenantName()); for (int i = 0; i < serverTenant.getOfflineInstances(); i++) { retagInstance(unTaggedInstanceList.get(i), CommonConstants.Helix.UNTAGGED_SERVER_INSTANCE, offlineServerTag); } String realtimeServerTag = TagNameUtils.getRealtimeTagForTenant(serverTenant.getTenantName()); for (int i = 0; i < serverTenant.getRealtimeInstances(); i++) { retagInstance(unTaggedInstanceList.get(i + serverTenant.getOfflineInstances()), CommonConstants.Helix.UNTAGGED_SERVER_INSTANCE, realtimeServerTag); } }
public boolean isServerTenantDeletable(String tenantName) { Set<String> taggedInstances = new HashSet<>( HelixHelper.getInstancesWithTag(_helixZkManager, TagNameUtils.getOfflineTagForTenant(tenantName))); taggedInstances .addAll(HelixHelper.getInstancesWithTag(_helixZkManager, TagNameUtils.getRealtimeTagForTenant(tenantName))); for (String resourceName : getAllResources()) { if (!TableNameBuilder.isTableResource(resourceName)) { continue; } IdealState tableIdealState = _helixAdmin.getResourceIdealState(_helixClusterName, resourceName); for (String partition : tableIdealState.getPartitionSet()) { for (String instance : tableIdealState.getInstanceSet(partition)) { if (taggedInstances.contains(instance)) { return false; } } } } return true; }
/** * Helper method to add the passed in offline segment to the helix cluster. * - Gets the segment name and the table name from the passed in segment meta-data. * - Identifies the instance set onto which the segment needs to be added, based on * segment assignment strategy and replicas in the table config in the property-store. * - Updates ideal state such that the new segment is assigned to required set of instances as per * the segment assignment strategy and replicas. * * @param segmentMetadata Meta-data for the segment, used to access segmentName and tableName. */ // NOTE: method should be thread-safe private void addNewOfflineSegment(SegmentMetadata segmentMetadata) { String offlineTableName = TableNameBuilder.OFFLINE.tableNameWithType(segmentMetadata.getTableName()); String segmentName = segmentMetadata.getName(); // Assign new segment to instances TableConfig offlineTableConfig = ZKMetadataProvider.getOfflineTableConfig(_propertyStore, offlineTableName); Preconditions.checkNotNull(offlineTableConfig); int numReplicas = Integer.parseInt(offlineTableConfig.getValidationConfig().getReplication()); String serverTenant = TagNameUtils.getOfflineTagForTenant(offlineTableConfig.getTenantConfig().getServer()); SegmentAssignmentStrategy segmentAssignmentStrategy = SegmentAssignmentStrategyFactory .getSegmentAssignmentStrategy(offlineTableConfig.getValidationConfig().getSegmentAssignmentStrategy()); List<String> assignedInstances = segmentAssignmentStrategy .getAssignedInstances(_helixZkManager, _helixAdmin, _propertyStore, _helixClusterName, segmentMetadata, numReplicas, serverTenant); HelixHelper.addSegmentToIdealState(_helixZkManager, offlineTableName, segmentName, assignedInstances); }
sendPostRequest(_controllerRequestURLBuilder.forTenantCreate(), payload); Assert.assertEquals( _helixAdmin.getInstancesInClusterWithTag(_helixClusterName, TagNameUtils.getOfflineTagForTenant(serverTenant)) .size(), NUM_OFFLINE_SERVERS_PER_TAG); Assert.assertEquals(_helixAdmin sendPutRequest(_controllerRequestURLBuilder.forTenantCreate(), payload); Assert.assertEquals( _helixAdmin.getInstancesInClusterWithTag(_helixClusterName, TagNameUtils.getOfflineTagForTenant(serverTenant)) .size(), NUM_OFFLINE_SERVERS_PER_TAG + i); Assert.assertEquals(_helixAdmin sendDeleteRequest(_controllerRequestURLBuilder.forServerTenantDelete(serverTenant)); Assert.assertEquals( _helixAdmin.getInstancesInClusterWithTag(_helixClusterName, TagNameUtils.getOfflineTagForTenant(serverTenant)) .size(), 0); Assert.assertEquals(_helixAdmin
TagNameUtils.getRealtimeTagForTenant(TagNameUtils.DEFAULT_TENANT_NAME)).size(), 20); Assert.assertEquals(_helixAdmin.getInstancesInClusterWithTag(_helixClusterName, TagNameUtils.getOfflineTagForTenant(TagNameUtils.DEFAULT_TENANT_NAME)).size(), 20);
int nInstances = 6; String serverTenant = "aServerTenant"; String offlineServerTag = TagNameUtils.getOfflineTagForTenant(serverTenant); List<String> instances = getInstanceList(nInstances); _rebalanceSegmentsStrategy.setTagToInstances(offlineServerTag, instances);