public RebalanceSegmentStrategy getRebalanceSegmentsStrategy(TableConfig tableConfig) { // If we use replica group segment assignment strategy, we pick the replica group rebalancer String segmentAssignmentStrategy = tableConfig.getValidationConfig().getSegmentAssignmentStrategy(); if (segmentAssignmentStrategy == null) { return new DefaultRebalanceSegmentStrategy(_helixManager); } switch (SegmentAssignmentStrategyEnum.valueOf(segmentAssignmentStrategy)) { case ReplicaGroupSegmentAssignmentStrategy: return new ReplicaGroupRebalanceSegmentStrategy(_helixManager); default: return new DefaultRebalanceSegmentStrategy(_helixManager); } } }
/** * 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); }
/** * Update replica group partition assignment in the property store * * @param tableConfig a table config */ private void updateReplicaGroupPartitionAssignment(TableConfig tableConfig) { String tableNameWithType = tableConfig.getTableName(); String assignmentStrategy = tableConfig.getValidationConfig().getSegmentAssignmentStrategy(); // We create replica group partition assignment and write to property store if new table config // has the replica group config. if (assignmentStrategy != null && SegmentAssignmentStrategyEnum.valueOf(assignmentStrategy) == SegmentAssignmentStrategyEnum.ReplicaGroupSegmentAssignmentStrategy) { ReplicaGroupPartitionAssignmentGenerator partitionAssignmentGenerator = new ReplicaGroupPartitionAssignmentGenerator(_propertyStore); // Create the new replica group partition assignment if there is none in the property store. // This will create the replica group partition assignment and write to the property store in 2 cases: // 1. when we create the table with replica group segment assignment // 2. when we update the table config with replica group segment assignment from another assignment strategy if (partitionAssignmentGenerator.getReplicaGroupPartitionAssignment(tableNameWithType) == null) { List<String> servers = getServerInstancesForTable(tableNameWithType, TableType.OFFLINE); ReplicaGroupPartitionAssignment partitionAssignment = partitionAssignmentGenerator.buildReplicaGroupPartitionAssignment(tableNameWithType, tableConfig, servers); partitionAssignmentGenerator.writeReplicaGroupPartitionAssignment(partitionAssignment); } } }
case PartitionAwareOffline: SegmentsValidationAndRetentionConfig validationConfig = tableConfig.getValidationConfig(); String segmentAssignmentStrategy = validationConfig.getSegmentAssignmentStrategy();