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]