This is an automated email from the ASF dual-hosted git repository.
tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new c24e6e0497 IGNITE-20146 Add improvements to the catalog associated
with the DistributionZone (#2403)
c24e6e0497 is described below
commit c24e6e0497f054fbedbc7e474dadddd3a4210260
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Fri Aug 4 11:54:21 2023 +0300
IGNITE-20146 Add improvements to the catalog associated with the
DistributionZone (#2403)
---
modules/catalog/build.gradle | 6 +
.../ignite/internal/catalog/CatalogManager.java | 8 +-
.../internal/catalog/CatalogManagerImpl.java | 82 ++--
.../catalog/CatalogParamsValidationUtils.java | 181 +++++++
.../catalog/CatalogValidationException.java | 53 ++
.../internal/catalog/commands/AlterZoneParams.java | 20 +
.../internal/catalog/commands/CatalogUtils.java | 29 ++
.../catalog/commands/CreateZoneParams.java | 49 +-
...{DropZoneParams.java => DataStorageParams.java} | 56 ++-
.../internal/catalog/commands/DropZoneParams.java | 41 +-
.../descriptors/CatalogDataStorageDescriptor.java | 1 +
.../internal/catalog/BaseCatalogManagerTest.java | 84 ++++
.../internal/catalog/CatalogManagerSelfTest.java | 104 ++--
.../catalog/CatalogManagerValidationTest.java | 541 +++++++++++++++++++++
.../ignite/lang/IgniteInternalException.java | 13 +
.../engine/exec/ddl/DdlCommandHandlerWrapper.java | 8 +-
16 files changed, 1077 insertions(+), 199 deletions(-)
diff --git a/modules/catalog/build.gradle b/modules/catalog/build.gradle
index 5fb5e02c74..0b6576cff0 100644
--- a/modules/catalog/build.gradle
+++ b/modules/catalog/build.gradle
@@ -28,8 +28,14 @@ dependencies {
implementation project(':ignite-configuration')
implementation project(':ignite-metastorage-api')
implementation project(':ignite-vault')
+
implementation libs.jetbrains.annotations
implementation libs.auto.service.annotations
+ implementation(libs.jsonpath.core) {
+ //IDEA test runner doesn't apply Gradle dependency resolve strategy,
this is just not implemented
+ //So, exclude asm-core transitive dependency to protect of jar-hell.
+ exclude group: 'org.ow2.asm', module: 'asm'
+ }
testImplementation(testFixtures(project(':ignite-core')))
testImplementation(testFixtures(project(':ignite-metastorage')))
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
index 1d91cc35de..b80885e49e 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManager.java
@@ -106,7 +106,7 @@ public interface CatalogManager extends IgniteComponent,
CatalogService {
* @param params Parameters.
* @return Operation future.
*/
- CompletableFuture<Void> createDistributionZone(CreateZoneParams params);
+ CompletableFuture<Void> createZone(CreateZoneParams params);
/**
* Drops distribution zone.
@@ -114,7 +114,7 @@ public interface CatalogManager extends IgniteComponent,
CatalogService {
* @param params Parameters.
* @return Operation future.
*/
- CompletableFuture<Void> dropDistributionZone(DropZoneParams params);
+ CompletableFuture<Void> dropZone(DropZoneParams params);
/**
* Alter distribution zone.
@@ -122,7 +122,7 @@ public interface CatalogManager extends IgniteComponent,
CatalogService {
* @param params Parameters.
* @return Operation future.
*/
- CompletableFuture<Void> alterDistributionZone(AlterZoneParams params);
+ CompletableFuture<Void> alterZone(AlterZoneParams params);
/**
* Rename distribution zone.
@@ -130,5 +130,5 @@ public interface CatalogManager extends IgniteComponent,
CatalogService {
* @param params Parameters.
* @return Operation future.
*/
- CompletableFuture<Void> renameDistributionZone(RenameZoneParams params);
+ CompletableFuture<Void> renameZone(RenameZoneParams params);
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index a6b29af3cb..67cff40275 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -20,7 +20,13 @@ package org.apache.ignite.internal.catalog;
import static java.util.concurrent.CompletableFuture.completedFuture;
import static java.util.concurrent.CompletableFuture.failedFuture;
import static java.util.stream.Collectors.joining;
-import static
org.apache.ignite.internal.catalog.commands.CreateZoneParams.INFINITE_TIMER_VALUE;
+import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateAlterZoneParams;
+import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateCreateZoneParams;
+import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateDropZoneParams;
+import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateRenameZoneParams;
+import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateZoneDataNodesAutoAdjustParametersCompatibility;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
import java.util.ArrayList;
@@ -168,7 +174,7 @@ public class CatalogManagerImpl extends
Producer<CatalogEvent, CatalogEventParam
INFINITE_TIMER_VALUE,
INFINITE_TIMER_VALUE,
INFINITE_TIMER_VALUE,
- CreateZoneParams.DEFAULT_FILTER
+ DEFAULT_FILTER
);
registerCatalog(new Catalog(0, 0L, objectIdGen, List.of(defaultZone),
List.of(schemaPublic)));
@@ -467,14 +473,12 @@ public class CatalogManagerImpl extends
Producer<CatalogEvent, CatalogEventParam
}
@Override
- public CompletableFuture<Void> createDistributionZone(CreateZoneParams
params) {
+ public CompletableFuture<Void> createZone(CreateZoneParams params) {
return saveUpdateAndWaitForActivation(catalog -> {
validateCreateZoneParams(params);
- String zoneName = Objects.requireNonNull(params.zoneName(),
"zone");
-
if (catalog.zone(params.zoneName()) != null) {
- throw new DistributionZoneAlreadyExistsException(zoneName);
+ throw new
DistributionZoneAlreadyExistsException(params.zoneName());
}
CatalogZoneDescriptor zone =
CatalogUtils.fromParams(catalog.objectIdGenState(), params);
@@ -487,8 +491,10 @@ public class CatalogManagerImpl extends
Producer<CatalogEvent, CatalogEventParam
}
@Override
- public CompletableFuture<Void> dropDistributionZone(DropZoneParams params)
{
+ public CompletableFuture<Void> dropZone(DropZoneParams params) {
return saveUpdateAndWaitForActivation(catalog -> {
+ validateDropZoneParams(params);
+
CatalogZoneDescriptor zone = getZone(catalog, params.zoneName());
if (zone.name().equals(DEFAULT_ZONE_NAME)) {
@@ -506,15 +512,15 @@ public class CatalogManagerImpl extends
Producer<CatalogEvent, CatalogEventParam
throw new
DistributionZoneBindTableException(zone.name(), t.name());
});
- return List.of(
- new DropZoneEntry(zone.id())
- );
+ return List.of(new DropZoneEntry(zone.id()));
});
}
@Override
- public CompletableFuture<Void> renameDistributionZone(RenameZoneParams
params) {
+ public CompletableFuture<Void> renameZone(RenameZoneParams params) {
return saveUpdateAndWaitForActivation(catalog -> {
+ validateRenameZoneParams(params);
+
CatalogZoneDescriptor zone = getZone(catalog, params.zoneName());
if (catalog.zone(params.newZoneName()) != null) {
@@ -544,31 +550,32 @@ public class CatalogManagerImpl extends
Producer<CatalogEvent, CatalogEventParam
}
@Override
- public CompletableFuture<Void> alterDistributionZone(AlterZoneParams
params) {
+ public CompletableFuture<Void> alterZone(AlterZoneParams params) {
return saveUpdateAndWaitForActivation(catalog -> {
+ validateAlterZoneParams(params);
+
CatalogZoneDescriptor zone = getZone(catalog, params.zoneName());
- Integer dataNodesAutoAdjust = params.dataNodesAutoAdjust();
- Integer dataNodesAutoAdjustScaleUp =
params.dataNodesAutoAdjustScaleUp();
- Integer dataNodesAutoAdjustScaleDown =
params.dataNodesAutoAdjustScaleDown();
+ Integer dataNodesAutoAdjust = Objects.requireNonNullElse(
+ params.dataNodesAutoAdjust(),
+ zone.dataNodesAutoAdjust()
+ );
- if (dataNodesAutoAdjust == null && dataNodesAutoAdjustScaleUp ==
null && dataNodesAutoAdjustScaleDown == null) {
- dataNodesAutoAdjust = zone.dataNodesAutoAdjust();
- dataNodesAutoAdjustScaleUp = zone.dataNodesAutoAdjustScaleUp();
- dataNodesAutoAdjustScaleDown =
zone.dataNodesAutoAdjustScaleDown();
- } else {
- if (dataNodesAutoAdjust != null && (dataNodesAutoAdjustScaleUp
!= null || dataNodesAutoAdjustScaleDown != null)) {
- throw new IgniteInternalException(
- DistributionZones.ZONE_DEFINITION_ERR,
- "Not compatible dataNodes parameters
[autoAdjust={}, autoAdjustScaleUp={}, autoAdjustScaleDown={}]",
- params.dataNodesAutoAdjust(),
params.dataNodesAutoAdjustScaleUp(), params.dataNodesAutoAdjustScaleDown()
- );
- }
+ Integer dataNodesAutoAdjustScaleUp = Objects.requireNonNullElse(
+ params.dataNodesAutoAdjustScaleUp(),
+ zone.dataNodesAutoAdjustScaleUp()
+ );
- dataNodesAutoAdjust =
Objects.requireNonNullElse(params.dataNodesAutoAdjust(), INFINITE_TIMER_VALUE);
- dataNodesAutoAdjustScaleUp =
Objects.requireNonNullElse(params.dataNodesAutoAdjustScaleUp(),
INFINITE_TIMER_VALUE);
- dataNodesAutoAdjustScaleDown =
Objects.requireNonNullElse(params.dataNodesAutoAdjustScaleDown(),
INFINITE_TIMER_VALUE);
- }
+ Integer dataNodesAutoAdjustScaleDown = Objects.requireNonNullElse(
+ params.dataNodesAutoAdjustScaleDown(),
+ zone.dataNodesAutoAdjustScaleDown()
+ );
+
+ validateZoneDataNodesAutoAdjustParametersCompatibility(
+ dataNodesAutoAdjust,
+ dataNodesAutoAdjustScaleUp,
+ dataNodesAutoAdjustScaleDown
+ );
CatalogZoneDescriptor descriptor = new CatalogZoneDescriptor(
zone.id(),
@@ -885,19 +892,6 @@ public class CatalogManagerImpl extends
Producer<CatalogEvent, CatalogEventParam
}
}
- private static void validateCreateZoneParams(CreateZoneParams params) {
- if (params.dataNodesAutoAdjust() != INFINITE_TIMER_VALUE
- && (params.dataNodesAutoAdjustScaleUp() != INFINITE_TIMER_VALUE
- || params.dataNodesAutoAdjustScaleDown() !=
INFINITE_TIMER_VALUE)
- ) {
- throw new IgniteInternalException(
- DistributionZones.ZONE_DEFINITION_ERR,
- "Not compatible parameters [dataNodesAutoAdjust={},
dataNodesAutoAdjustScaleUp={}, dataNodesAutoAdjustScaleDown={}]",
- params.dataNodesAutoAdjust(),
params.dataNodesAutoAdjustScaleUp(), params.dataNodesAutoAdjustScaleDown()
- );
- }
- }
-
private static void validateIndexColumns(List<String> indexColumns,
CatalogTableDescriptor table) {
if (indexColumns.isEmpty()) {
throw new IgniteInternalException(
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
new file mode 100644
index 0000000000..2e472b3856
--- /dev/null
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogParamsValidationUtils.java
@@ -0,0 +1,181 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog;
+
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.MAX_PARTITION_COUNT;
+
+import com.jayway.jsonpath.InvalidPathException;
+import com.jayway.jsonpath.JsonPath;
+import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
+import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
+import org.apache.ignite.internal.catalog.commands.DropZoneParams;
+import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
+import org.apache.ignite.internal.util.StringUtils;
+import org.apache.ignite.lang.ErrorGroups.DistributionZones;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Utility class for validating catalog commands parameters.
+ */
+class CatalogParamsValidationUtils {
+ static void validateCreateZoneParams(CreateZoneParams params) {
+ validateUpdateZoneFieldsParameters(
+ params.zoneName(),
+ params.partitions(),
+ params.replicas(),
+ params.dataNodesAutoAdjust(),
+ params.dataNodesAutoAdjustScaleUp(),
+ params.dataNodesAutoAdjustScaleDown(),
+ params.filter()
+ );
+ }
+
+ static void validateAlterZoneParams(AlterZoneParams params) {
+ validateUpdateZoneFieldsParameters(
+ params.zoneName(),
+ params.partitions(),
+ params.replicas(),
+ params.dataNodesAutoAdjust(),
+ params.dataNodesAutoAdjustScaleUp(),
+ params.dataNodesAutoAdjustScaleDown(),
+ params.filter()
+ );
+ }
+
+ static void validateDropZoneParams(DropZoneParams params) {
+ validateZoneName(params.zoneName());
+ }
+
+ static void validateRenameZoneParams(RenameZoneParams params) {
+ validateZoneName(params.zoneName());
+ validateZoneName(params.newZoneName(), "Missing new zone name");
+ }
+
+ private static void validateUpdateZoneFieldsParameters(
+ String zoneName,
+ @Nullable Integer partitions,
+ @Nullable Integer replicas,
+ @Nullable Integer dataNodesAutoAdjust,
+ @Nullable Integer dataNodesAutoAdjustScaleUp,
+ @Nullable Integer dataNodesAutoAdjustScaleDown,
+ @Nullable String filter
+ ) {
+ validateZoneName(zoneName);
+
+ validateZonePartitions(partitions);
+ validateZoneReplicas(replicas);
+
+ validateZoneDataNodesAutoAdjust(dataNodesAutoAdjust);
+ validateZoneDataNodesAutoAdjustScaleUp(dataNodesAutoAdjustScaleUp);
+ validateZoneDataNodesAutoAdjustScaleDown(dataNodesAutoAdjustScaleDown);
+
+ validateZoneDataNodesAutoAdjustParametersCompatibility(
+ dataNodesAutoAdjust,
+ dataNodesAutoAdjustScaleUp,
+ dataNodesAutoAdjustScaleDown
+ );
+
+ validateZoneFilter(filter);
+ }
+
+ private static void validateZoneName(String zoneName) {
+ validateZoneName(zoneName, "Missing zone name");
+ }
+
+ private static void validateZoneName(String zoneName, String errorMessage)
{
+ if (StringUtils.nullOrBlank(zoneName)) {
+ throw new CatalogValidationException(
+ DistributionZones.ZONE_DEFINITION_ERR,
+ errorMessage
+ );
+ }
+ }
+
+ private static void validateZonePartitions(@Nullable Integer partitions) {
+ validateZoneField(partitions, 1, MAX_PARTITION_COUNT, "Invalid number
of partitions");
+ }
+
+ private static void validateZoneReplicas(@Nullable Integer replicas) {
+ validateZoneField(replicas, 1, null, "Invalid number of replicas");
+ }
+
+ private static void validateZoneDataNodesAutoAdjust(@Nullable Integer
dataNodesAutoAdjust) {
+ validateZoneField(dataNodesAutoAdjust, 0, null, "Invalid data nodes
auto adjust");
+ }
+
+ private static void validateZoneDataNodesAutoAdjustScaleUp(@Nullable
Integer dataNodesAutoAdjustScaleUp) {
+ validateZoneField(dataNodesAutoAdjustScaleUp, 0, null, "Invalid data
nodes auto adjust scale up");
+ }
+
+ private static void validateZoneDataNodesAutoAdjustScaleDown(@Nullable
Integer dataNodesAutoAdjustScaleDown) {
+ validateZoneField(dataNodesAutoAdjustScaleDown, 0, null, "Invalid data
nodes auto adjust scale down");
+ }
+
+ static void validateZoneDataNodesAutoAdjustParametersCompatibility(
+ @Nullable Integer dataNodesAutoAdjust,
+ @Nullable Integer dataNodesAutoAdjustScaleUp,
+ @Nullable Integer dataNodesAutoAdjustScaleDown
+ ) {
+ if (dataNodesAutoAdjust == null || dataNodesAutoAdjust ==
INFINITE_TIMER_VALUE) {
+ return;
+ }
+
+ if ((dataNodesAutoAdjustScaleUp != null && dataNodesAutoAdjustScaleUp
!= INFINITE_TIMER_VALUE)
+ || (dataNodesAutoAdjustScaleDown != null &&
dataNodesAutoAdjustScaleDown != INFINITE_TIMER_VALUE)) {
+ throw new CatalogValidationException(
+ DistributionZones.ZONE_DEFINITION_ERR,
+ "Not compatible parameters [dataNodesAutoAdjust={},
dataNodesAutoAdjustScaleUp={}, dataNodesAutoAdjustScaleDown={}]",
+ dataNodesAutoAdjust, dataNodesAutoAdjustScaleUp,
dataNodesAutoAdjustScaleDown
+ );
+ }
+ }
+
+ private static void validateZoneFilter(@Nullable String filter) {
+ if (filter == null) {
+ return;
+ }
+
+ try {
+ JsonPath.compile(filter);
+ } catch (InvalidPathException e) {
+ String error = e.getMessage() == null ? "Unknown JsonPath
compilation error." : e.getMessage();
+
+ throw new CatalogValidationException(
+ DistributionZones.ZONE_DEFINITION_ERR,
+ "Invalid filter: [value={}, error={}]",
+ e,
+ filter, error
+ );
+ }
+ }
+
+ private static void validateZoneField(@Nullable Integer value, int min,
@Nullable Integer max, String errorPrefix) {
+ if (value == null) {
+ return;
+ }
+
+ if (value < min || (max != null && value > max)) {
+ throw new CatalogValidationException(
+ DistributionZones.ZONE_DEFINITION_ERR,
+ "{}: [value={}, min={}" + (max == null ? ']' : ",
max={}]"),
+ errorPrefix, value, min, max
+ );
+ }
+ }
+}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogValidationException.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogValidationException.java
new file mode 100644
index 0000000000..430b70912e
--- /dev/null
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogValidationException.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog;
+
+import org.apache.ignite.lang.IgniteInternalException;
+import org.apache.ignite.lang.IgniteStringFormatter;
+
+/**
+ * Catalog validation exception.
+ */
+public class CatalogValidationException extends IgniteInternalException {
+ private static final long serialVersionUID = 2692301541251354006L;
+
+ /**
+ * Constructor.
+ *
+ * @param code Full error code.
+ * @param messagePattern Error message pattern.
+ * @param params Error message params.
+ * @see IgniteStringFormatter#format(String, Object...)
+ */
+ CatalogValidationException(int code, String messagePattern, Object...
params) {
+ super(code, messagePattern, params);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param code Full error code.
+ * @param messagePattern Error message pattern.
+ * @param cause Non-null throwable cause.
+ * @param params Error message params.
+ * @see IgniteStringFormatter#format(String, Object...)
+ */
+ CatalogValidationException(int code, String messagePattern, Throwable
cause, Object... params) {
+ super(code, messagePattern, cause, params);
+ }
+}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
index d44a26f3f9..85388020c2 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneParams.java
@@ -46,6 +46,9 @@ public class AlterZoneParams extends
AbstractZoneCommandParams {
/* Nodes' filter. */
private @Nullable String filter;
+ /** Data storage. */
+ private @Nullable DataStorageParams dataStorage;
+
/**
* Gets number of zone replicas.
*
@@ -100,6 +103,11 @@ public class AlterZoneParams extends
AbstractZoneCommandParams {
return dataNodesAutoAdjustScaleDown;
}
+ /** Returns the data storage, {@code null} if not set. */
+ public @Nullable DataStorageParams dataStorage() {
+ return dataStorage;
+ }
+
/**
* Parameters builder.
*/
@@ -179,5 +187,17 @@ public class AlterZoneParams extends
AbstractZoneCommandParams {
return this;
}
+
+ /**
+ * Sets the data storage.
+ *
+ * @param dataStorage Data storage.
+ * @return This instance.
+ */
+ public Builder dataStorage(@Nullable DataStorageParams dataStorage) {
+ params.dataStorage = dataStorage;
+
+ return this;
+ }
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
index d085f4ca0d..99f31b6f29 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CatalogUtils.java
@@ -38,6 +38,35 @@ import org.apache.ignite.sql.ColumnType;
* Catalog utils.
*/
public class CatalogUtils {
+ /** Default number of distribution zone partitions. */
+ public static final int DEFAULT_PARTITION_COUNT = 25;
+
+ /** Default number of distribution zone replicas. */
+ public static final int DEFAULT_REPLICA_COUNT = 1;
+
+ /**
+ * Default filter of distribution zone, which is a {@link
com.jayway.jsonpath.JsonPath} expression for including all attributes of
+ * nodes.
+ */
+ public static final String DEFAULT_FILTER = "$.+";
+
+ /** Default distribution zone storage engine. */
+ // TODO: IGNITE-19719 Should be defined differently
+ public static final String DEFAULT_STORAGE_ENGINE = "aipersist";
+
+ /** Default distribution zone storage engine data region. */
+ // TODO: IGNITE-19719 Must be storage engine specific
+ public static final String DEFAULT_DATA_REGION = "default";
+
+ /** Infinite value for the distribution zone timers. */
+ public static final int INFINITE_TIMER_VALUE = Integer.MAX_VALUE;
+
+ /** Value for the distribution zone timers which means that data nodes
changing will be started without waiting. */
+ public static final int IMMEDIATE_TIMER_VALUE = 0;
+
+ /** Max number of distribution zone partitions. */
+ public static final int MAX_PARTITION_COUNT = 65_000;
+
private static final Map<ColumnType, Set<ColumnType>>
ALTER_COLUMN_TYPE_TRANSITIONS = new EnumMap<>(ColumnType.class);
static {
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
index 2ac83df8f3..9177a03d6d 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneParams.java
@@ -17,6 +17,13 @@
package org.apache.ignite.internal.catalog.commands;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_DATA_REGION;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_STORAGE_ENGINE;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+
import java.util.Objects;
import org.jetbrains.annotations.Nullable;
@@ -29,13 +36,6 @@ public class CreateZoneParams extends
AbstractZoneCommandParams {
return new Builder();
}
- /** Default number of zone partitions. */
- public static final int DEFAULT_PARTITION_COUNT = 25;
- /** Default number of zone replicas. */
- public static final int DEFAULT_REPLICA_COUNT = 1;
- /** Default infinite value for the distribution zones' timers. */
- public static final int INFINITE_TIMER_VALUE = Integer.MAX_VALUE;
-
/** Amount of zone partitions. */
private int partitions = DEFAULT_PARTITION_COUNT;
@@ -51,13 +51,14 @@ public class CreateZoneParams extends
AbstractZoneCommandParams {
/** Data nodes auto adjust scale down timeout. */
private int dataNodesAutoAdjustScaleDown = INFINITE_TIMER_VALUE;
- /**
- * Default filter value for a distribution zone, which is a {@link
com.jayway.jsonpath.JsonPath} expression for including all attributes
- * of nodes.
- */
- public static final String DEFAULT_FILTER = "$.+";
/** Nodes' filter. */
- protected String filter = DEFAULT_FILTER;
+ private String filter = DEFAULT_FILTER;
+
+ /** Data storage. */
+ private DataStorageParams dataStorage = DataStorageParams.builder()
+ .engine(DEFAULT_STORAGE_ENGINE)
+ .dataRegion(DEFAULT_DATA_REGION)
+ .build();
/**
* Returns amount of zone partitions.
@@ -67,7 +68,7 @@ public class CreateZoneParams extends
AbstractZoneCommandParams {
}
/**
- * Return amount of zone replicas.
+ * Returns amount of zone replicas.
*/
public int replicas() {
return replicas;
@@ -109,6 +110,11 @@ public class CreateZoneParams extends
AbstractZoneCommandParams {
return filter;
}
+ /** Returns the data storage. */
+ public DataStorageParams dataStorage() {
+ return dataStorage;
+ }
+
/**
* Parameters builder.
*/
@@ -187,5 +193,20 @@ public class CreateZoneParams extends
AbstractZoneCommandParams {
return this;
}
+
+ /**
+ * Sets the data storage.
+ *
+ * @param dataStorage Data storage.
+ * @return This instance.
+ */
+ public Builder dataStorage(@Nullable DataStorageParams dataStorage) {
+ params.dataStorage = Objects.requireNonNullElse(
+ dataStorage,
+
DataStorageParams.builder().engine(DEFAULT_STORAGE_ENGINE).dataRegion(DEFAULT_DATA_REGION).build()
+ );
+
+ return this;
+ }
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DataStorageParams.java
similarity index 51%
copy from
modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
copy to
modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DataStorageParams.java
index 956772f3bd..7b81ead830 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DataStorageParams.java
@@ -18,54 +18,72 @@
package org.apache.ignite.internal.catalog.commands;
/**
- * DROP ZONE statement.
+ * Define a data storage.
*/
-public class DropZoneParams implements DdlCommandParams {
+// TODO: IGNITE-19719 Must be storage engine specific
+// TODO: IGNITE-19719 Implement validation of engines and their parameters
+public class DataStorageParams {
/** Creates parameters builder. */
public static Builder builder() {
return new Builder();
}
- /** Distribution zone name. */
- protected String zoneName;
+ private String engine;
+
+ private String dataRegion;
/**
- * Returns distribution zone name.
+ * Returns the storage engine name.
*/
- public String zoneName() {
- return zoneName;
+ public String engine() {
+ return engine;
}
/**
- * Parameters builder.
+ * Returns the data region name within the storage engine.
*/
+ public String dataRegion() {
+ return dataRegion;
+ }
+
+ /** Parameters builder. */
public static class Builder {
- DropZoneParams params;
+ private DataStorageParams params;
- Builder() {
- params = new DropZoneParams();
+ private Builder() {
+ params = new DataStorageParams();
}
/**
- * Sets distribution zone name.
+ * Sets the storage engine name.
*
- * @param zoneName Distribution zone name.
+ * @param engine Storage engine name.
* @return {@code this}.
*/
- public Builder zoneName(String zoneName) {
- params.zoneName = zoneName;
+ public Builder engine(String engine) {
+ params.engine = engine;
return this;
}
/**
- * Builds parameters.
+ * Sets the data region name within the storage engine.
*
- * @return Parameters.
+ * @param dataRegion Data region name within the storage engine.
+ * @return {@code this}.
*/
- public DropZoneParams build() {
- DropZoneParams params0 = params;
+ public Builder dataRegion(String dataRegion) {
+ params.dataRegion = dataRegion;
+
+ return this;
+ }
+
+ /** Builds parameters. */
+ public DataStorageParams build() {
+ DataStorageParams params0 = params;
+
params = null;
+
return params0;
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
index 956772f3bd..2bc0b41b3b 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/DropZoneParams.java
@@ -20,53 +20,18 @@ package org.apache.ignite.internal.catalog.commands;
/**
* DROP ZONE statement.
*/
-public class DropZoneParams implements DdlCommandParams {
+public class DropZoneParams extends AbstractZoneCommandParams {
/** Creates parameters builder. */
public static Builder builder() {
return new Builder();
}
- /** Distribution zone name. */
- protected String zoneName;
-
- /**
- * Returns distribution zone name.
- */
- public String zoneName() {
- return zoneName;
- }
-
/**
* Parameters builder.
*/
- public static class Builder {
- DropZoneParams params;
-
+ public static class Builder extends AbstractBuilder<DropZoneParams,
Builder> {
Builder() {
- params = new DropZoneParams();
- }
-
- /**
- * Sets distribution zone name.
- *
- * @param zoneName Distribution zone name.
- * @return {@code this}.
- */
- public Builder zoneName(String zoneName) {
- params.zoneName = zoneName;
-
- return this;
- }
-
- /**
- * Builds parameters.
- *
- * @return Parameters.
- */
- public DropZoneParams build() {
- DropZoneParams params0 = params;
- params = null;
- return params0;
+ super(new DropZoneParams());
}
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
index 0b95360f94..b24efdcbee 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogDataStorageDescriptor.java
@@ -23,6 +23,7 @@ import org.apache.ignite.internal.tostring.S;
/**
* Data storage descriptor.
*/
+// TODO: IGNITE-19719 Must be storage engine specific
public class CatalogDataStorageDescriptor implements Serializable {
private static final long serialVersionUID = -5268530663660582126L;
private final String engine;
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
new file mode 100644
index 0000000000..05f54b0f1d
--- /dev/null
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/BaseCatalogManagerTest.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog;
+
+import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.spy;
+
+import java.util.Objects;
+import java.util.stream.Stream;
+import org.apache.ignite.internal.catalog.storage.UpdateLog;
+import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
+import org.apache.ignite.internal.hlc.HybridClock;
+import org.apache.ignite.internal.hlc.HybridClockImpl;
+import org.apache.ignite.internal.metastorage.MetaStorageManager;
+import
org.apache.ignite.internal.metastorage.impl.StandaloneMetaStorageManager;
+import
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
+import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.internal.vault.VaultManager;
+import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
+/**
+ * Base class for testing the {@link CatalogManager}.
+ */
+public abstract class BaseCatalogManagerTest extends BaseIgniteAbstractTest {
+ private static final String NODE_NAME = "test";
+
+ final HybridClock clock = new HybridClockImpl();
+
+ private VaultManager vault;
+
+ private MetaStorageManager metastore;
+
+ UpdateLog updateLog;
+
+ ClockWaiter clockWaiter;
+
+ CatalogManagerImpl manager;
+
+ @BeforeEach
+ void setUp() {
+ vault = new VaultManager(new InMemoryVaultService());
+
+ metastore = StandaloneMetaStorageManager.create(vault, new
SimpleInMemoryKeyValueStorage(NODE_NAME));
+
+ updateLog = spy(new UpdateLogImpl(metastore));
+ clockWaiter = spy(new ClockWaiter(NODE_NAME, clock));
+
+ manager = new CatalogManagerImpl(updateLog, clockWaiter);
+
+ vault.start();
+ metastore.start();
+ clockWaiter.start();
+ manager.start();
+
+ assertThat("Watches were not deployed", metastore.deployWatches(),
willCompleteSuccessfully());
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ IgniteUtils.closeAll(Stream.of(manager, clockWaiter, metastore, vault)
+ .filter(Objects::nonNull)
+ .map(component -> component::stop)
+ );
+ }
+}
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index 1a2c34c4d6..71641b9bf4 100644
---
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -21,6 +21,10 @@ import static
java.util.concurrent.CompletableFuture.completedFuture;
import static java.util.concurrent.CompletableFuture.failedFuture;
import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
@@ -46,7 +50,6 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@@ -99,19 +102,9 @@ import
org.apache.ignite.internal.catalog.events.DropZoneEventParameters;
import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
import org.apache.ignite.internal.catalog.storage.UpdateLog;
import org.apache.ignite.internal.catalog.storage.UpdateLog.OnUpdateHandler;
-import org.apache.ignite.internal.catalog.storage.UpdateLogImpl;
import org.apache.ignite.internal.catalog.storage.VersionedUpdate;
-import org.apache.ignite.internal.hlc.HybridClock;
-import org.apache.ignite.internal.hlc.HybridClockImpl;
import org.apache.ignite.internal.hlc.HybridTimestamp;
import org.apache.ignite.internal.manager.EventListener;
-import org.apache.ignite.internal.metastorage.MetaStorageManager;
-import
org.apache.ignite.internal.metastorage.impl.StandaloneMetaStorageManager;
-import
org.apache.ignite.internal.metastorage.server.SimpleInMemoryKeyValueStorage;
-import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
-import org.apache.ignite.internal.util.IgniteUtils;
-import org.apache.ignite.internal.vault.VaultManager;
-import org.apache.ignite.internal.vault.inmemory.InMemoryVaultService;
import org.apache.ignite.lang.ColumnAlreadyExistsException;
import org.apache.ignite.lang.ColumnNotFoundException;
import org.apache.ignite.lang.DistributionZoneAlreadyExistsException;
@@ -125,8 +118,6 @@ import org.apache.ignite.sql.ColumnType;
import org.apache.ignite.sql.SqlException;
import org.hamcrest.TypeSafeMatcher;
import org.jetbrains.annotations.Nullable;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
@@ -134,9 +125,9 @@ import org.junit.jupiter.params.provider.EnumSource.Mode;
import org.mockito.ArgumentCaptor;
/**
- * Catalog service self test.
+ * Catalog manager self test.
*/
-public class CatalogManagerSelfTest extends BaseIgniteAbstractTest {
+public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
private static final String SCHEMA_NAME = DEFAULT_SCHEMA_NAME;
private static final String ZONE_NAME = DEFAULT_ZONE_NAME;
private static final String TABLE_NAME = "myTable";
@@ -145,46 +136,6 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
private static final String NEW_COLUMN_NAME_2 = "NEWCOL2";
private static final String INDEX_NAME = "myIndex";
- private MetaStorageManager metastore;
-
- private VaultManager vault;
-
- private UpdateLog updateLog;
-
- private CatalogManagerImpl manager;
-
- private final HybridClock clock = new HybridClockImpl();
-
- private ClockWaiter clockWaiter;
-
- @BeforeEach
- void setUp() {
- vault = new VaultManager(new InMemoryVaultService());
-
- metastore = StandaloneMetaStorageManager.create(vault, new
SimpleInMemoryKeyValueStorage("test"));
-
- clockWaiter = spy(new ClockWaiter("test", clock));
- updateLog = spy(new UpdateLogImpl(metastore));
- manager = new CatalogManagerImpl(updateLog, clockWaiter);
-
- vault.start();
- metastore.start();
- clockWaiter.start();
- manager.start();
-
- assertThat("Watches were not deployed", metastore.deployWatches(),
willCompleteSuccessfully());
- }
-
- @AfterEach
- public void tearDown() throws Exception {
- IgniteUtils.closeAll(
- manager == null ? null : manager::stop,
- clockWaiter == null ? null : clockWaiter::stop,
- metastore == null ? null : metastore::stop,
- vault == null ? null : vault::stop
- );
- }
-
@Test
public void testEmptyCatalog() {
CatalogSchemaDescriptor schema = manager.schema(DEFAULT_SCHEMA_NAME,
0);
@@ -206,12 +157,12 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
// Default distribution zone must exists.
CatalogZoneDescriptor zone = manager.zone(DEFAULT_ZONE_NAME,
clock.nowLong());
assertEquals(DEFAULT_ZONE_NAME, zone.name());
- assertEquals(CreateZoneParams.DEFAULT_PARTITION_COUNT,
zone.partitions());
- assertEquals(CreateZoneParams.DEFAULT_REPLICA_COUNT, zone.replicas());
- assertEquals(CreateZoneParams.DEFAULT_FILTER, zone.filter());
- assertEquals(CreateZoneParams.INFINITE_TIMER_VALUE,
zone.dataNodesAutoAdjust());
- assertEquals(CreateZoneParams.INFINITE_TIMER_VALUE,
zone.dataNodesAutoAdjustScaleUp());
- assertEquals(CreateZoneParams.INFINITE_TIMER_VALUE,
zone.dataNodesAutoAdjustScaleDown());
+ assertEquals(DEFAULT_PARTITION_COUNT, zone.partitions());
+ assertEquals(DEFAULT_REPLICA_COUNT, zone.replicas());
+ assertEquals(DEFAULT_FILTER, zone.filter());
+ assertEquals(INFINITE_TIMER_VALUE, zone.dataNodesAutoAdjust());
+ assertEquals(INFINITE_TIMER_VALUE, zone.dataNodesAutoAdjustScaleUp());
+ assertEquals(INFINITE_TIMER_VALUE,
zone.dataNodesAutoAdjustScaleDown());
}
@Test
@@ -1311,7 +1262,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.filter("expression")
.build();
- assertThat(manager.createDistributionZone(params),
willCompleteSuccessfully());
+ assertThat(manager.createZone(params), willCompleteSuccessfully());
// Validate catalog version from the past.
assertNull(manager.zone(zoneName, 0));
@@ -1343,7 +1294,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.zoneName(zoneName)
.build();
- assertThat(manager.createDistributionZone(createZoneParams),
willCompleteSuccessfully());
+ assertThat(manager.createZone(createZoneParams),
willCompleteSuccessfully());
long beforeDropTimestamp = clock.nowLong();
@@ -1351,7 +1302,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.zoneName(zoneName)
.build();
- CompletableFuture<Void> fut = manager.dropDistributionZone(params);
+ CompletableFuture<Void> fut = manager.dropZone(params);
assertThat(fut, willCompleteSuccessfully());
@@ -1368,7 +1319,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
assertNull(manager.zone(zone.id(), clock.nowLong()));
// Try to drop non-existing zone.
- assertThat(manager.dropDistributionZone(params),
willThrow(DistributionZoneNotFoundException.class));
+ assertThat(manager.dropZone(params),
willThrow(DistributionZoneNotFoundException.class));
}
@Test
@@ -1381,7 +1332,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.replicas(15)
.build();
- assertThat(manager.createDistributionZone(createParams),
willCompleteSuccessfully());
+ assertThat(manager.createZone(createParams),
willCompleteSuccessfully());
long beforeDropTimestamp = clock.nowLong();
@@ -1394,7 +1345,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.newZoneName(newZoneName)
.build();
- assertThat(manager.renameDistributionZone(renameZoneParams),
willCompleteSuccessfully());
+ assertThat(manager.renameZone(renameZoneParams),
willCompleteSuccessfully());
// Validate catalog version from the past.
CatalogZoneDescriptor zone = manager.zone(zoneName,
beforeDropTimestamp);
@@ -1424,7 +1375,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.partitions(42)
.replicas(15)
.build();
- assertThat(manager.createDistributionZone(createParams),
willThrow(IgniteInternalException.class));
+ assertThat(manager.createZone(createParams),
willThrow(IgniteInternalException.class));
// Validate default zone wasn't changed.
assertSame(defaultZone, manager.zone(DEFAULT_ZONE_NAME,
clock.nowLong()));
@@ -1436,7 +1387,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.zoneName(DEFAULT_ZONE_NAME)
.newZoneName(newDefaultZoneName)
.build();
- assertThat(manager.renameDistributionZone(renameZoneParams),
willThrow(IgniteInternalException.class));
+ assertThat(manager.renameZone(renameZoneParams),
willThrow(IgniteInternalException.class));
// Validate default zone wasn't changed.
assertNull(manager.zone(newDefaultZoneName, clock.nowLong()));
@@ -1446,7 +1397,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
DropZoneParams dropZoneParams = DropZoneParams.builder()
.zoneName(DEFAULT_ZONE_NAME)
.build();
- assertThat(manager.dropDistributionZone(dropZoneParams),
willThrow(IgniteInternalException.class));
+ assertThat(manager.dropZone(dropZoneParams),
willThrow(IgniteInternalException.class));
// Validate default zone wasn't changed.
assertSame(defaultZone, manager.zone(DEFAULT_ZONE_NAME,
clock.nowLong()));
@@ -1468,13 +1419,14 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.zoneName(zoneName)
.partitions(10)
.replicas(2)
+ .dataNodesAutoAdjust(INFINITE_TIMER_VALUE)
.dataNodesAutoAdjustScaleUp(3)
.dataNodesAutoAdjustScaleDown(4)
.filter("newExpression")
.build();
- assertThat(manager.createDistributionZone(createParams),
willCompleteSuccessfully());
- assertThat(manager.alterDistributionZone(alterZoneParams),
willCompleteSuccessfully());
+ assertThat(manager.createZone(createParams),
willCompleteSuccessfully());
+ assertThat(manager.alterZone(alterZoneParams),
willCompleteSuccessfully());
// Validate actual catalog
CatalogZoneDescriptor zone = manager.zone(zoneName, clock.nowLong());
@@ -1500,7 +1452,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.replicas(15)
.build();
- assertThat(manager.createDistributionZone(params),
willCompleteSuccessfully());
+ assertThat(manager.createZone(params), willCompleteSuccessfully());
// Try to create zone with same name.
params = CreateZoneParams.builder()
@@ -1509,7 +1461,7 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
.replicas(1)
.build();
- assertThat(manager.createDistributionZone(params),
willThrowFast(DistributionZoneAlreadyExistsException.class));
+ assertThat(manager.createZone(params),
willThrowFast(DistributionZoneAlreadyExistsException.class));
// Validate zone was NOT changed
CatalogZoneDescriptor zone = manager.zone(zoneName, clock.nowLong());
@@ -1541,13 +1493,13 @@ public class CatalogManagerSelfTest extends
BaseIgniteAbstractTest {
manager.listen(CatalogEvent.ZONE_CREATE, eventListener);
manager.listen(CatalogEvent.ZONE_DROP, eventListener);
- CompletableFuture<Void> fut =
manager.createDistributionZone(createZoneParams);
+ CompletableFuture<Void> fut = manager.createZone(createZoneParams);
assertThat(fut, willCompleteSuccessfully());
verify(eventListener).notify(any(CreateZoneEventParameters.class),
isNull());
- fut = manager.dropDistributionZone(dropZoneParams);
+ fut = manager.dropZone(dropZoneParams);
assertThat(fut, willCompleteSuccessfully());
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
new file mode 100644
index 0000000000..9988886802
--- /dev/null
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerValidationTest.java
@@ -0,0 +1,541 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.catalog;
+
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_REPLICA_COUNT;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.IMMEDIATE_TIMER_VALUE;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.INFINITE_TIMER_VALUE;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.MAX_PARTITION_COUNT;
+import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
+import static
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.nullValue;
+
+import org.apache.ignite.internal.catalog.commands.AlterZoneParams;
+import org.apache.ignite.internal.catalog.commands.CreateZoneParams;
+import org.apache.ignite.internal.catalog.commands.DropZoneParams;
+import org.apache.ignite.internal.catalog.commands.RenameZoneParams;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Catalog manager validation test.
+ */
+public class CatalogManagerValidationTest extends BaseCatalogManagerTest {
+ private static final String ZONE_NAME = "test_zone";
+
+ @Test
+ void testValidateZoneNameOnCreateZone() {
+ assertThat(
+ manager.createZone(CreateZoneParams.builder().build()),
+ willThrowFast(CatalogValidationException.class, "Missing zone
name")
+ );
+
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateZoneNameOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+ manager.alterZone(AlterZoneParams.builder().build()),
+ willThrowFast(CatalogValidationException.class, "Missing zone
name")
+ );
+
+ assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateZonePartitionsOnCreateZone() {
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).partitions(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of partitions")
+ );
+
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).partitions(0).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of partitions")
+ );
+
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).partitions(65_001).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of partitions")
+ );
+
+ // Let's check the success cases.
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
0).partitions(1).build()), willBe(nullValue()));
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
1).partitions(MAX_PARTITION_COUNT).build()), willBe(nullValue()));
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
2).partitions(10).build()), willBe(nullValue()));
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
3).partitions(DEFAULT_PARTITION_COUNT).build()), willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateZonePartitionsOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of partitions")
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(0).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of partitions")
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(65_001).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of partitions")
+ );
+
+ // Let's check the success cases.
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(1).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(MAX_PARTITION_COUNT).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(10).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).partitions(DEFAULT_PARTITION_COUNT).build()),
willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateZoneReplicasOnCreateZone() {
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).replicas(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of replicas")
+ );
+
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).replicas(0).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of replicas")
+ );
+
+ // Let's check the success cases.
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
0).replicas(1).build()), willBe(nullValue()));
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
1).replicas(Integer.MAX_VALUE).build()), willBe(nullValue()));
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME +
2).replicas(DEFAULT_REPLICA_COUNT).build()), willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateZoneReplicasOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of replicas")
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(0).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
number of replicas")
+ );
+
+ // Let's check the success cases.
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(1).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(Integer.MAX_VALUE).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).replicas(DEFAULT_REPLICA_COUNT).build()),
willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustOnCreateZone() {
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid data
nodes auto adjust")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
0).dataNodesAutoAdjust(0).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
1).dataNodesAutoAdjust(Integer.MAX_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
2).dataNodesAutoAdjust(IMMEDIATE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
3).dataNodesAutoAdjust(INFINITE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid data
nodes auto adjust")
+ );
+
+ // Let's check the success cases.
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(0).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(Integer.MAX_VALUE).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(INFINITE_TIMER_VALUE).build()),
willBe(nullValue()));
+
assertThat(manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(IMMEDIATE_TIMER_VALUE).build()),
willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustScaleUpOnCreateZone() {
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid data
nodes auto adjust scale up")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
0).dataNodesAutoAdjustScaleUp(0).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
1).dataNodesAutoAdjustScaleUp(Integer.MAX_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
2).dataNodesAutoAdjustScaleUp(IMMEDIATE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
3).dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustScaleUpOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid data
nodes auto adjust scale up")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(0).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(Integer.MAX_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(IMMEDIATE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustScaleDownOnCreateZone() {
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid data
nodes auto adjust scale down")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
0).dataNodesAutoAdjustScaleDown(0).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
1).dataNodesAutoAdjustScaleDown(Integer.MAX_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
2).dataNodesAutoAdjustScaleDown(IMMEDIATE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
3).dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustScaleDownOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(-1).build()),
+ willThrowFast(CatalogValidationException.class, "Invalid data
nodes auto adjust scale down")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(0).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(Integer.MAX_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(IMMEDIATE_TIMER_VALUE).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustCompatibilityParametersOnCreateZone() {
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleUp(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleDown(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ assertThat(
+ manager.createZone(
+ createZoneBuilder(ZONE_NAME)
+ .dataNodesAutoAdjust(666)
+ .dataNodesAutoAdjustScaleUp(666)
+ .dataNodesAutoAdjustScaleDown(666)
+ .build()
+ ),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+ manager.createZone(
+ createZoneBuilder(ZONE_NAME + 0)
+ .dataNodesAutoAdjust(666)
+
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+ .build()
+ ),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(
+ createZoneBuilder(ZONE_NAME + 1)
+ .dataNodesAutoAdjust(666)
+
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+ .build()
+ ),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(
+ createZoneBuilder(ZONE_NAME + 2)
+ .dataNodesAutoAdjust(666)
+
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+ .build()
+ ),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateDataNodesAutoAdjustCompatibilityParametersOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleUp(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjust(666).dataNodesAutoAdjustScaleDown(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ assertThat(
+ manager.alterZone(
+ alterZoneBuilder(ZONE_NAME)
+ .dataNodesAutoAdjust(666)
+ .dataNodesAutoAdjustScaleUp(666)
+ .dataNodesAutoAdjustScaleDown(666)
+ .build()
+ ),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+ manager.alterZone(
+ alterZoneBuilder(ZONE_NAME)
+ .dataNodesAutoAdjust(666)
+
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+ .build()
+ ),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.alterZone(
+ alterZoneBuilder(ZONE_NAME)
+ .dataNodesAutoAdjust(666)
+
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+ .build()
+ ),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.alterZone(
+ alterZoneBuilder(ZONE_NAME)
+ .dataNodesAutoAdjust(666)
+
.dataNodesAutoAdjustScaleUp(INFINITE_TIMER_VALUE)
+
.dataNodesAutoAdjustScaleDown(INFINITE_TIMER_VALUE)
+ .build()
+ ),
+ willBe(nullValue())
+ );
+
+ // Let's check the compatibility of the parameters and what is already
stored in the catalog.
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleDown(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).dataNodesAutoAdjustScaleUp(666).dataNodesAutoAdjustScaleDown(666).build()),
+ willThrowFast(CatalogValidationException.class, "Not
compatible parameters")
+ );
+ }
+
+ @Test
+ void testValidateFilterOnCreateZone() {
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME).filter("not a
JsonPath").build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
filter")
+ );
+
+ // Missing ']' after 'nodeAttributes'.
+ assertThat(
+
manager.createZone(createZoneBuilder(ZONE_NAME).filter("['nodeAttributes'[?(@.['region']
== 'EU')]").build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
filter")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
0).filter("['nodeAttributes'][?(@.['region'] == 'EU')]").build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+ manager.createZone(createZoneBuilder(ZONE_NAME +
1).filter(DEFAULT_FILTER).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateFilterOnAlterZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+ manager.alterZone(alterZoneBuilder(ZONE_NAME).filter("not a
JsonPath").build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
filter")
+ );
+
+ // Missing ']' after 'nodeAttributes'.
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).filter("['nodeAttributes'[?(@.['region']
== 'EU')]").build()),
+ willThrowFast(CatalogValidationException.class, "Invalid
filter")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).filter("['nodeAttributes'][?(@.['region']
== 'EU')]").build()),
+ willBe(nullValue())
+ );
+
+ assertThat(
+
manager.alterZone(alterZoneBuilder(ZONE_NAME).filter(DEFAULT_FILTER).build()),
+ willBe(nullValue())
+ );
+ }
+
+ @Test
+ void testValidateZoneNameOnDropZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+ manager.dropZone(DropZoneParams.builder().build()),
+ willThrowFast(CatalogValidationException.class, "Missing zone
name")
+ );
+
+ // Let's check the success cases.
+
assertThat(manager.dropZone(DropZoneParams.builder().zoneName(ZONE_NAME).build()),
willBe(nullValue()));
+ }
+
+ @Test
+ void testValidateZoneNamesOnRenameZone() {
+ assertThat(manager.createZone(createZoneBuilder(ZONE_NAME).build()),
willBe(nullValue()));
+
+ assertThat(
+ manager.renameZone(RenameZoneParams.builder().build()),
+ willThrowFast(CatalogValidationException.class, "Missing zone
name")
+ );
+
+ assertThat(
+
manager.renameZone(RenameZoneParams.builder().zoneName(ZONE_NAME).build()),
+ willThrowFast(CatalogValidationException.class, "Missing new
zone name")
+ );
+
+ // Let's check the success cases.
+ assertThat(
+
manager.renameZone(RenameZoneParams.builder().zoneName(ZONE_NAME).newZoneName(ZONE_NAME
+ 0).build()),
+ willBe(nullValue())
+ );
+ }
+
+ private static CreateZoneParams.Builder createZoneBuilder(String zoneName)
{
+ return CreateZoneParams.builder().zoneName(zoneName);
+ }
+
+ private static AlterZoneParams.Builder alterZoneBuilder(String zoneName) {
+ return AlterZoneParams.builder().zoneName(zoneName);
+ }
+}
diff --git
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
index 73f5b04b6d..7067e634ee 100644
---
a/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
+++
b/modules/core/src/main/java/org/apache/ignite/lang/IgniteInternalException.java
@@ -201,6 +201,19 @@ public class IgniteInternalException extends
RuntimeException implements Traceab
this(code, IgniteStringFormatter.format(messagePattern, params));
}
+ /**
+ * Creates a new exception with the given error code and detail message.
+ *
+ * @param code Full error code.
+ * @param messagePattern Error message pattern.
+ * @param cause Non-null throwable cause.
+ * @param params Error message params.
+ * @see IgniteStringFormatter#format(String, Object...)
+ */
+ public IgniteInternalException(int code, String messagePattern, Throwable
cause, Object... params) {
+ this(code, IgniteStringFormatter.format(messagePattern, params),
cause);
+ }
+
/**
* Returns a group name of this error.
*
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
index 912c66fe3b..eb812d6970 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandlerWrapper.java
@@ -124,28 +124,28 @@ public class DdlCommandHandlerWrapper extends
DdlCommandHandler {
CreateZoneCommand zoneCommand = (CreateZoneCommand) cmd;
return ddlCommandFuture
- .thenCompose(res ->
catalogManager.createDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+ .thenCompose(res ->
catalogManager.createZone(DdlToCatalogCommandConverter.convert(zoneCommand))
.handle(handleModificationResult(zoneCommand.ifNotExists(),
DistributionZoneAlreadyExistsException.class))
);
} else if (cmd instanceof DropZoneCommand) {
DropZoneCommand zoneCommand = (DropZoneCommand) cmd;
return ddlCommandFuture
- .thenCompose(res ->
catalogManager.dropDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+ .thenCompose(res ->
catalogManager.dropZone(DdlToCatalogCommandConverter.convert(zoneCommand))
.handle(handleModificationResult(zoneCommand.ifExists(),
DistributionZoneNotFoundException.class))
);
} else if (cmd instanceof AlterZoneRenameCommand) {
AlterZoneRenameCommand zoneCommand = (AlterZoneRenameCommand) cmd;
return ddlCommandFuture
- .thenCompose(res ->
catalogManager.renameDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+ .thenCompose(res ->
catalogManager.renameZone(DdlToCatalogCommandConverter.convert(zoneCommand))
.handle(handleModificationResult(zoneCommand.ifExists(),
DistributionZoneNotFoundException.class))
);
} else if (cmd instanceof AlterZoneSetCommand) {
AlterZoneSetCommand zoneCommand = (AlterZoneSetCommand) cmd;
return ddlCommandFuture
- .thenCompose(res ->
catalogManager.alterDistributionZone(DdlToCatalogCommandConverter.convert(zoneCommand))
+ .thenCompose(res ->
catalogManager.alterZone(DdlToCatalogCommandConverter.convert(zoneCommand))
.handle(handleModificationResult(zoneCommand.ifExists(),
DistributionZoneNotFoundException.class))
);
}