This is an automated email from the ASF dual-hosted git repository.

jackie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 425182f438 Adding a cluster config to enable instance pool and replica 
group configuration in table config (#13131)
425182f438 is described below

commit 425182f438094be570740e617ff6274416469ec6
Author: soumitra-st <[email protected]>
AuthorDate: Mon Jun 10 15:20:55 2024 -0700

    Adding a cluster config to enable instance pool and replica group 
configuration in table config (#13131)
---
 .../pinot/controller/BaseControllerStarter.java    |   4 +
 .../apache/pinot/controller/ControllerConf.java    |   7 ++
 .../api/resources/PinotTableRestletResource.java   |   6 +-
 .../api/resources/TableConfigsRestletResource.java |   4 +-
 .../segment/local/utils/TableConfigUtils.java      |  68 ++++++++---
 .../segment/local/utils/TableConfigUtilsTest.java  | 125 ++++++++++++++++++++-
 6 files changed, 192 insertions(+), 22 deletions(-)

diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/BaseControllerStarter.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/BaseControllerStarter.java
index ea79125277..9fc7d99268 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/BaseControllerStarter.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/BaseControllerStarter.java
@@ -113,6 +113,7 @@ import 
org.apache.pinot.core.query.executor.sql.SqlQueryExecutor;
 import 
org.apache.pinot.core.segment.processing.lifecycle.PinotSegmentLifecycleEventListenerManager;
 import org.apache.pinot.core.transport.ListenerConfig;
 import org.apache.pinot.core.util.ListenerConfigUtil;
+import org.apache.pinot.segment.local.utils.TableConfigUtils;
 import org.apache.pinot.spi.config.table.TableConfig;
 import org.apache.pinot.spi.crypt.PinotCrypterFactory;
 import org.apache.pinot.spi.data.Schema;
@@ -253,6 +254,9 @@ public abstract class BaseControllerStarter implements 
ServiceStartable {
 
     // Initialize the table config tuner registry.
     TableConfigTunerRegistry.init(_config.getTableConfigTunerPackages());
+
+    TableConfigUtils.setDisableGroovy(_config.isDisableIngestionGroovy());
+    
TableConfigUtils.setEnforcePoolBasedAssignment(_config.isEnforcePoolBasedAssignmentEnabled());
   }
 
   private void inferHostnameIfNeeded(ControllerConf config) {
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/ControllerConf.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/ControllerConf.java
index 4598b48eeb..1ae79f565a 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/ControllerConf.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/ControllerConf.java
@@ -316,6 +316,9 @@ public class ControllerConf extends PinotConfiguration {
   public static final String DISABLE_GROOVY = 
"controller.disable.ingestion.groovy";
   public static final boolean DEFAULT_DISABLE_GROOVY = true;
 
+  public static final String ENFORCE_POOL_BASED_ASSIGNMENT_KEY = 
"enforce.pool.based.assignment";
+  public static final boolean DEFAULT_ENFORCE_POOL_BASED_ASSIGNMENT = false;
+
   public ControllerConf() {
     super(new HashMap<>());
   }
@@ -1065,4 +1068,8 @@ public class ControllerConf extends PinotConfiguration {
     Preconditions.checkArgument(SUPPORTED_PROTOCOLS.contains(value), 
"Unsupported %s protocol '%s'", property, value);
     return value;
   }
+
+  public boolean isEnforcePoolBasedAssignmentEnabled() {
+    return getProperty(ENFORCE_POOL_BASED_ASSIGNMENT_KEY, 
DEFAULT_ENFORCE_POOL_BASED_ASSIGNMENT);
+  }
 }
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableRestletResource.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableRestletResource.java
index 59e748a08f..c2ba66dc34 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableRestletResource.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotTableRestletResource.java
@@ -229,7 +229,7 @@ public class PinotTableRestletResource {
       TableConfigTunerUtils.applyTunerConfigs(_pinotHelixResourceManager, 
tableConfig, schema, Collections.emptyMap());
 
       // TableConfigUtils.validate(...) is used across table create/update.
-      TableConfigUtils.validate(tableConfig, schema, typesToSkip, 
_controllerConf.isDisableIngestionGroovy());
+      TableConfigUtils.validate(tableConfig, schema, typesToSkip);
       TableConfigUtils.validateTableName(tableConfig);
     } catch (Exception e) {
       throw new ControllerApplicationException(LOGGER, e.getMessage(), 
Response.Status.BAD_REQUEST, e);
@@ -498,7 +498,7 @@ public class PinotTableRestletResource {
       }
 
       Schema schema = 
_pinotHelixResourceManager.getSchemaForTableConfig(tableConfig);
-      TableConfigUtils.validate(tableConfig, schema, typesToSkip, 
_controllerConf.isDisableIngestionGroovy());
+      TableConfigUtils.validate(tableConfig, schema, typesToSkip);
     } catch (Exception e) {
       String msg = String.format("Invalid table config: %s with error: %s", 
tableName, e.getMessage());
       throw new ControllerApplicationException(LOGGER, msg, 
Response.Status.BAD_REQUEST, e);
@@ -579,7 +579,7 @@ public class PinotTableRestletResource {
       if (schema == null) {
         throw new SchemaNotFoundException("Got empty schema");
       }
-      TableConfigUtils.validate(tableConfig, schema, typesToSkip, 
_controllerConf.isDisableIngestionGroovy());
+      TableConfigUtils.validate(tableConfig, schema, typesToSkip);
       ObjectNode tableConfigValidateStr = JsonUtils.newObjectNode();
       if (tableConfig.getTableType() == TableType.OFFLINE) {
         tableConfigValidateStr.set(TableType.OFFLINE.name(), 
tableConfig.toJsonNode());
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableConfigsRestletResource.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableConfigsRestletResource.java
index aa52464cde..ca244a0f63 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableConfigsRestletResource.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableConfigsRestletResource.java
@@ -448,14 +448,14 @@ public class TableConfigsRestletResource {
         Preconditions.checkState(offlineRawTableName.equals(rawTableName),
             "Name in 'offline' table config: %s must be equal to 'tableName': 
%s", offlineRawTableName, rawTableName);
         TableConfigUtils.validateTableName(offlineTableConfig);
-        TableConfigUtils.validate(offlineTableConfig, schema, typesToSkip, 
_controllerConf.isDisableIngestionGroovy());
+        TableConfigUtils.validate(offlineTableConfig, schema, typesToSkip);
       }
       if (realtimeTableConfig != null) {
         String realtimeRawTableName = 
TableNameBuilder.extractRawTableName(realtimeTableConfig.getTableName());
         Preconditions.checkState(realtimeRawTableName.equals(rawTableName),
             "Name in 'realtime' table config: %s must be equal to 'tableName': 
%s", realtimeRawTableName, rawTableName);
         TableConfigUtils.validateTableName(realtimeTableConfig);
-        TableConfigUtils.validate(realtimeTableConfig, schema, typesToSkip, 
_controllerConf.isDisableIngestionGroovy());
+        TableConfigUtils.validate(realtimeTableConfig, schema, typesToSkip);
       }
       if (offlineTableConfig != null && realtimeTableConfig != null) {
         TableConfigUtils.verifyHybridTableConfigs(rawTableName, 
offlineTableConfig, realtimeTableConfig);
diff --git 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/TableConfigUtils.java
 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/TableConfigUtils.java
index d05a896483..6485c3bf03 100644
--- 
a/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/TableConfigUtils.java
+++ 
b/pinot-segment-local/src/main/java/org/apache/pinot/segment/local/utils/TableConfigUtils.java
@@ -127,11 +127,23 @@ public final class TableConfigUtils {
       
ImmutableSet.of(RoutingConfig.STRICT_REPLICA_GROUP_INSTANCE_SELECTOR_TYPE,
           RoutingConfig.MULTI_STAGE_REPLICA_GROUP_SELECTOR_TYPE);
 
+  private static boolean _disableGroovy;
+
+  private static boolean _enforcePoolBasedAssignment;
+
+  public static void setDisableGroovy(boolean disableGroovy) {
+    _disableGroovy = disableGroovy;
+  }
+
+  public static void setEnforcePoolBasedAssignment(boolean 
enforcePoolBasedAssignment) {
+    _enforcePoolBasedAssignment = enforcePoolBasedAssignment;
+  }
+
   /**
-   * @see TableConfigUtils#validate(TableConfig, Schema, String, boolean)
+   * @see TableConfigUtils#validate(TableConfig, Schema, String)
    */
   public static void validate(TableConfig tableConfig, @Nullable Schema 
schema) {
-    validate(tableConfig, schema, null, false);
+    validate(tableConfig, schema, null);
   }
 
   /**
@@ -141,11 +153,11 @@ public final class TableConfigUtils {
    * 3. TierConfigs
    * 4. Indexing config
    * 5. Field Config List
+   * 6. Instance pool and replica group, if enabled
    *
    * TODO: Add more validations for each section (e.g. validate conditions are 
met for aggregateMetrics)
    */
-  public static void validate(TableConfig tableConfig, @Nullable Schema 
schema, @Nullable String typesToSkip,
-      boolean disableGroovy) {
+  public static void validate(TableConfig tableConfig, @Nullable Schema 
schema, @Nullable String typesToSkip) {
     Set<ValidationType> skipTypes = parseTypesToSkipString(typesToSkip);
     if (tableConfig.getTableType() == TableType.REALTIME) {
       Preconditions.checkState(schema != null, "Schema should not be null for 
REALTIME table");
@@ -157,7 +169,7 @@ public final class TableConfigUtils {
     if (!skipTypes.contains(ValidationType.ALL)) {
       validateTableSchemaConfig(tableConfig);
       validateValidationConfig(tableConfig, schema);
-      validateIngestionConfig(tableConfig, schema, disableGroovy);
+      validateIngestionConfig(tableConfig, schema);
 
       // Only allow realtime tables with non-null stream.type and LLC 
consumer.type
       if (tableConfig.getTableType() == TableType.REALTIME) {
@@ -183,9 +195,42 @@ public final class TableConfigUtils {
       if (!skipTypes.contains(ValidationType.TASK)) {
         validateTaskConfigs(tableConfig, schema);
       }
+
+      if (_enforcePoolBasedAssignment) {
+        validateInstancePoolsNReplicaGroups(tableConfig);
+      }
     }
   }
 
+  /**
+   * Validates the table config is using instance pool and replica group 
configuration.
+   * @param tableConfig Table config to validate
+   * @return true if the table config is using instance pool and replica group 
configuration, false otherwise
+   */
+  static boolean isTableUsingInstancePoolAndReplicaGroup(@Nonnull TableConfig 
tableConfig) {
+    boolean status = true;
+    Map<String, InstanceAssignmentConfig> instanceAssignmentConfigMap = 
tableConfig.getInstanceAssignmentConfigMap();
+    if (instanceAssignmentConfigMap != null) {
+      for (InstanceAssignmentConfig instanceAssignmentConfig : 
instanceAssignmentConfigMap.values()) {
+        if (instanceAssignmentConfig != null) {
+          status &= (instanceAssignmentConfig.getTagPoolConfig().isPoolBased()
+              && 
instanceAssignmentConfig.getReplicaGroupPartitionConfig().isReplicaGroupBased());
+        } else {
+          status = false;
+        }
+      }
+    } else {
+      status = false;
+    }
+
+    return status;
+  }
+
+  public static void validateInstancePoolsNReplicaGroups(TableConfig 
tableConfig) {
+    
Preconditions.checkState(isTableUsingInstancePoolAndReplicaGroup(tableConfig),
+        "Instance pool and replica group configurations must be enabled");
+  }
+
   private static Set<ValidationType> parseTypesToSkipString(@Nullable String 
typesToSkip) {
     return typesToSkip == null ? Collections.emptySet()
         : Arrays.stream(typesToSkip.split(",")).map(s -> 
ValidationType.valueOf(s.toUpperCase()))
@@ -307,11 +352,6 @@ public final class TableConfigUtils {
     validateRetentionConfig(tableConfig);
   }
 
-  @VisibleForTesting
-  public static void validateIngestionConfig(TableConfig tableConfig, 
@Nullable Schema schema) {
-    validateIngestionConfig(tableConfig, schema, false);
-  }
-
   /**
    * Validates the following:
    * 1. validity of filter function
@@ -322,7 +362,7 @@ public final class TableConfigUtils {
    * 6. ingestion type for dimension tables
    */
   @VisibleForTesting
-  public static void validateIngestionConfig(TableConfig tableConfig, 
@Nullable Schema schema, boolean disableGroovy) {
+  public static void validateIngestionConfig(TableConfig tableConfig, 
@Nullable Schema schema) {
     IngestionConfig ingestionConfig = tableConfig.getIngestionConfig();
 
     if (ingestionConfig != null) {
@@ -365,7 +405,7 @@ public final class TableConfigUtils {
       if (filterConfig != null) {
         String filterFunction = filterConfig.getFilterFunction();
         if (filterFunction != null) {
-          if (disableGroovy && 
FunctionEvaluatorFactory.isGroovyExpression(filterFunction)) {
+          if (_disableGroovy && 
FunctionEvaluatorFactory.isGroovyExpression(filterFunction)) {
             throw new IllegalStateException(
                 "Groovy filter functions are disabled for table config. Found 
'" + filterFunction + "'");
           }
@@ -508,7 +548,7 @@ public final class TableConfigUtils {
       if (enrichmentConfigs != null) {
         for (EnrichmentConfig enrichmentConfig : enrichmentConfigs) {
           RecordEnricherRegistry.validateEnrichmentConfig(enrichmentConfig,
-              new RecordEnricherValidationConfig(disableGroovy));
+              new RecordEnricherValidationConfig(_disableGroovy));
         }
       }
 
@@ -534,7 +574,7 @@ public final class TableConfigUtils {
                     + "aggregations");
           }
           FunctionEvaluator expressionEvaluator;
-          if (disableGroovy && 
FunctionEvaluatorFactory.isGroovyExpression(transformFunction)) {
+          if (_disableGroovy && 
FunctionEvaluatorFactory.isGroovyExpression(transformFunction)) {
             throw new IllegalStateException(
                 "Groovy transform functions are disabled for table config. 
Found '" + transformFunction
                     + "' for column '" + columnName + "'");
diff --git 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/TableConfigUtilsTest.java
 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/TableConfigUtilsTest.java
index 55345a876d..e1ab636420 100644
--- 
a/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/TableConfigUtilsTest.java
+++ 
b/pinot-segment-local/src/test/java/org/apache/pinot/segment/local/utils/TableConfigUtilsTest.java
@@ -41,14 +41,17 @@ import 
org.apache.pinot.spi.config.table.SegmentsValidationAndRetentionConfig;
 import org.apache.pinot.spi.config.table.StarTreeAggregationConfig;
 import org.apache.pinot.spi.config.table.StarTreeIndexConfig;
 import org.apache.pinot.spi.config.table.TableConfig;
+import org.apache.pinot.spi.config.table.TableCustomConfig;
 import org.apache.pinot.spi.config.table.TableTaskConfig;
 import org.apache.pinot.spi.config.table.TableType;
 import org.apache.pinot.spi.config.table.TagOverrideConfig;
+import org.apache.pinot.spi.config.table.TenantConfig;
 import org.apache.pinot.spi.config.table.TierConfig;
 import org.apache.pinot.spi.config.table.UpsertConfig;
 import org.apache.pinot.spi.config.table.assignment.InstanceAssignmentConfig;
 import org.apache.pinot.spi.config.table.assignment.InstancePartitionsType;
 import 
org.apache.pinot.spi.config.table.assignment.InstanceReplicaGroupPartitionConfig;
+import org.apache.pinot.spi.config.table.assignment.InstanceTagPoolConfig;
 import org.apache.pinot.spi.config.table.ingestion.AggregationConfig;
 import org.apache.pinot.spi.config.table.ingestion.BatchIngestionConfig;
 import org.apache.pinot.spi.config.table.ingestion.ComplexTypeConfig;
@@ -322,7 +325,10 @@ public class TableConfigUtilsTest {
 
     // invalid transform config since Groovy is disabled
     try {
-      TableConfigUtils.validate(tableConfig, schema, null, true);
+      TableConfigUtils.setDisableGroovy(true);
+      TableConfigUtils.validate(tableConfig, schema, null);
+      // Reset to false
+      TableConfigUtils.setDisableGroovy(false);
       Assert.fail("Should fail when Groovy functions disabled but found in 
transform config");
     } catch (IllegalStateException e) {
       // expected
@@ -355,7 +361,10 @@ public class TableConfigUtilsTest {
     // invalid filter config since Groovy is disabled
     ingestionConfig.setFilterConfig(new FilterConfig("Groovy({timestamp > 0}, 
timestamp)"));
     try {
-      TableConfigUtils.validate(tableConfig, schema, null, true);
+      TableConfigUtils.setDisableGroovy(true);
+      TableConfigUtils.validate(tableConfig, schema, null);
+      // Reset to false
+      TableConfigUtils.setDisableGroovy(false);
       Assert.fail("Should fail when Groovy functions disabled but found in 
filter config");
     } catch (IllegalStateException e) {
       // expected
@@ -2110,7 +2119,7 @@ public class TableConfigUtilsTest {
     }
 
     // validate that TASK config will be skipped with skip string.
-    TableConfigUtils.validate(tableConfig, schema, "TASK,UPSERT", false);
+    TableConfigUtils.validate(tableConfig, schema, "TASK,UPSERT");
 
     // invalid period
     HashMap<String, String> invalidPeriodConfig = new 
HashMap<>(realtimeToOfflineTaskConfig);
@@ -2452,4 +2461,114 @@ public class TableConfigUtilsTest {
         "org.apache.pinot.plugin.inputformat.protobuf.ProtoBufMessageDecoder");
     return streamConfigs;
   }
+
+  @Test
+  public void testValidIGnRGOfflineTable() {
+    InstanceAssignmentConfig config =
+        new InstanceAssignmentConfig(new 
InstanceTagPoolConfig("DefaultTenant", true, 0, null), null,
+            new InstanceReplicaGroupPartitionConfig(true, 0, 0, 0, 0, 0, 
false, null), null, false);
+
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.OFFLINE.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, Map.of("OFFLINE", config), null, null, 
null, null, null, null, false, null, null,
+            null);
+
+    
Assert.assertTrue(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testValidIGnRGRealtimeTable() {
+    InstanceAssignmentConfig config =
+        new InstanceAssignmentConfig(new 
InstanceTagPoolConfig("DefaultTenant", true, 0, null), null,
+            new InstanceReplicaGroupPartitionConfig(true, 0, 0, 0, 0, 0, 
false, null), null, false);
+
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.REALTIME.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, Map.of("CONSUMING", config), null, null, 
null, null, null, null, false, null, null,
+            null);
+
+    
Assert.assertTrue(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testNoIACOfflineTable() {
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.OFFLINE.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, null, null, null, null, null, null, null, 
false, null, null, null);
+
+    
Assert.assertFalse(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testNoIACRealtimeTable() {
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.REALTIME.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, null, null, null, null, null, null, null, 
false, null, null, null);
+
+    
Assert.assertFalse(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testNoPoolsOfflineTable() {
+    InstanceAssignmentConfig config =
+        new InstanceAssignmentConfig(new 
InstanceTagPoolConfig("DefaultTenant", false, 0, null), null,
+            new InstanceReplicaGroupPartitionConfig(true, 0, 0, 0, 0, 0, 
false, null), null, false);
+
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.OFFLINE.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, Map.of("OFFLINE", config), null, null, 
null, null, null, null, false, null, null,
+            null);
+
+    
Assert.assertFalse(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testNoPoolsRealtimeTable() {
+    InstanceAssignmentConfig config =
+        new InstanceAssignmentConfig(new 
InstanceTagPoolConfig("DefaultTenant", false, 0, null), null,
+            new InstanceReplicaGroupPartitionConfig(true, 0, 0, 0, 0, 0, 
false, null), null, false);
+
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.REALTIME.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, Map.of("CONSUMING", config), null, null, 
null, null, null, null, false, null, null,
+            null);
+
+    
Assert.assertFalse(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testNoRgOfflineTable() {
+    InstanceAssignmentConfig config =
+        new InstanceAssignmentConfig(new 
InstanceTagPoolConfig("DefaultTenant", true, 0, null), null,
+            new InstanceReplicaGroupPartitionConfig(false, 0, 0, 0, 0, 0, 
false, null), null, false);
+
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.OFFLINE.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, Map.of("OFFLINE", config), null, null, 
null, null, null, null, false, null, null,
+            null);
+
+    
Assert.assertFalse(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
+
+  @Test
+  public void testNoRGRealtimeTable() {
+    InstanceAssignmentConfig config =
+        new InstanceAssignmentConfig(new 
InstanceTagPoolConfig("DefaultTenant", true, 0, null), null,
+            new InstanceReplicaGroupPartitionConfig(false, 0, 0, 0, 0, 0, 
false, null), null, false);
+
+    TableConfig tableConfig =
+        new TableConfig("table", TableType.REALTIME.name(), new 
SegmentsValidationAndRetentionConfig(),
+            new TenantConfig("DefaultTenant", "DefaultTenant", null), new 
IndexingConfig(), new TableCustomConfig(null),
+            null, null, null, null, Map.of("CONSUMING", config), null, null, 
null, null, null, null, false, null, null,
+            null);
+
+    
Assert.assertFalse(TableConfigUtils.isTableUsingInstancePoolAndReplicaGroup(tableConfig));
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to