This is an automated email from the ASF dual-hosted git repository.
vpyatkov 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 75d93a2482 IGNITE-23449 Add support of the new flag HA in zone
description (#4667)
75d93a2482 is described below
commit 75d93a2482463c5461cb095790348791399038ab
Author: Cyrill <[email protected]>
AuthorDate: Thu Nov 7 09:34:02 2024 +0300
IGNITE-23449 Add support of the new flag HA in zone description (#4667)
---
.../apache/ignite/catalog/annotations/Zone.java | 7 ++
.../ignite/catalog/definitions/ZoneDefinition.java | 35 +++++-
.../ignite/internal/catalog/ItCatalogDslTest.java | 3 +
.../internal/matcher/ZoneDefinitionMatcher.java | 18 +++-
.../catalog/sql/CreateFromAnnotationsImpl.java | 4 +
.../catalog/sql/CreateFromDefinitionImpl.java | 4 +
.../internal/catalog/sql/CreateZoneImpl.java | 15 +++
.../internal/catalog/sql/IgniteCatalogSqlImpl.java | 7 +-
.../apache/ignite/internal/catalog/sql/Option.java | 4 +
.../catalog/sql/CreateFromAnnotationsTest.java | 49 ++++++++-
.../catalog/sql/CreateFromDefinitionTest.java | 22 +++-
.../catalog/CatalogParamsValidationUtils.java | 13 +++
.../catalog/commands/AlterZoneCommand.java | 3 +-
.../internal/catalog/commands/CatalogUtils.java | 3 +
.../catalog/commands/CreateZoneCommand.java | 26 ++++-
.../catalog/commands/CreateZoneCommandBuilder.java | 9 ++
.../catalog/commands/RenameZoneCommand.java | 3 +-
.../catalog/descriptors/CatalogZoneDescriptor.java | 27 ++++-
.../catalog/descriptors/ConsistencyMode.java | 66 ++++++++++++
.../systemviews/ZonesSystemViewProvider.java | 1 +
.../commands/AbstractCommandValidationTest.java | 13 ++-
.../commands/CreateZoneCommandValidationTest.java | 10 ++
.../descriptors/CatalogZoneDescriptorTest.java | 4 +-
.../storage/CatalogEntrySerializationTest.java | 4 +-
.../ignite/client/handler/FakeCatalogService.java | 14 ++-
.../internal/sql/engine/ItZonesSystemViewTest.java | 118 +++++++++++++++++++--
.../prepare/ddl/DdlSqlToCommandConverter.java | 22 +++-
.../sql/engine/prepare/ddl/ZoneOptionEnum.java | 5 +-
.../DistributionZoneSqlToCommandConverterTest.java | 57 ++++++++++
.../sql/DistributionZoneSqlDdlParserTest.java | 7 +-
30 files changed, 537 insertions(+), 36 deletions(-)
diff --git
a/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
b/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
index ce0d9db8c7..db2ad910ba 100644
--- a/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
+++ b/modules/api/src/main/java/org/apache/ignite/catalog/annotations/Zone.java
@@ -90,4 +90,11 @@ public @interface Zone {
* @return Nodes filter.
*/
String filter() default "";
+
+ /**
+ * Consistency mode.
+ *
+ * @return Consistency mode.
+ */
+ String consistencyMode() default "";
}
diff --git
a/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
b/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
index 605f4c2918..5259f1f539 100644
---
a/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
+++
b/modules/api/src/main/java/org/apache/ignite/catalog/definitions/ZoneDefinition.java
@@ -43,6 +43,8 @@ public class ZoneDefinition {
private final String storageProfiles;
+ private final String consistencyMode;
+
private ZoneDefinition(
String zoneName,
boolean ifNotExists,
@@ -53,7 +55,8 @@ public class ZoneDefinition {
Integer dataNodesAutoAdjustScaleUp,
Integer dataNodesAutoAdjustScaleDown,
String filter,
- String storageProfiles
+ String storageProfiles,
+ String consistencyMode
) {
this.zoneName = zoneName;
this.ifNotExists = ifNotExists;
@@ -65,6 +68,7 @@ public class ZoneDefinition {
this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
this.filter = filter;
this.storageProfiles = storageProfiles;
+ this.consistencyMode = consistencyMode;
}
/**
@@ -167,6 +171,15 @@ public class ZoneDefinition {
return storageProfiles;
}
+ /**
+ * Returns consistency mode.
+ *
+ * @return Consistency mode.
+ */
+ public String consistencyMode() {
+ return consistencyMode;
+ }
+
/**
* Returns new builder using this definition.
*
@@ -189,6 +202,7 @@ public class ZoneDefinition {
+ ", dataNodesAutoAdjustScaleDown=" +
dataNodesAutoAdjustScaleDown
+ ", filter='" + filter + '\''
+ ", storageProfiles='" + storageProfiles + '\''
+ + ", consistencyMode='" + consistencyMode + '\''
+ '}';
}
@@ -216,6 +230,8 @@ public class ZoneDefinition {
private String storageProfiles;
+ private String consistencyMode;
+
private Builder() {}
private Builder(ZoneDefinition definition) {
@@ -229,6 +245,7 @@ public class ZoneDefinition {
dataNodesAutoAdjustScaleDown =
definition.dataNodesAutoAdjustScaleDown;
filter = definition.filter;
storageProfiles = definition.storageProfiles;
+ consistencyMode = definition.consistencyMode;
}
/**
@@ -370,6 +387,19 @@ public class ZoneDefinition {
return this;
}
+ /**
+ * Sets consistency mode.
+ *
+ * @param consistencyMode Consistency mode.
+ * @return This builder instance.
+ */
+ public Builder consistencyMode(String consistencyMode) {
+ Objects.requireNonNull(consistencyMode, "Consistency mode must not
be null.");
+
+ this.consistencyMode = consistencyMode;
+ return this;
+ }
+
/**
* Builds the zone definition.
*
@@ -386,7 +416,8 @@ public class ZoneDefinition {
dataNodesAutoAdjustScaleUp,
dataNodesAutoAdjustScaleDown,
filter,
- storageProfiles
+ storageProfiles,
+ consistencyMode
);
}
}
diff --git
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
index fd00e0546b..5dad3db755 100644
---
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
+++
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/catalog/ItCatalogDslTest.java
@@ -40,6 +40,7 @@ import org.apache.ignite.catalog.definitions.ColumnDefinition;
import org.apache.ignite.catalog.definitions.TableDefinition;
import org.apache.ignite.catalog.definitions.ZoneDefinition;
import org.apache.ignite.internal.ClusterPerClassIntegrationTest;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.matcher.TableDefinitionMatcher;
import org.apache.ignite.internal.matcher.ZoneDefinitionMatcher;
import org.apache.ignite.sql.SqlException;
@@ -300,6 +301,7 @@ class ItCatalogDslTest extends
ClusterPerClassIntegrationTest {
.dataNodesAutoAdjustScaleUp(1)
.filter("$..*")
.distributionAlgorithm("distributionAlgorithm")
+ .consistencyMode(ConsistencyMode.HIGH_AVAILABILITY.name())
.build();
assertThat(catalog().createZoneAsync(zoneDefinition),
willCompleteSuccessfully());
@@ -314,6 +316,7 @@ class ItCatalogDslTest extends
ClusterPerClassIntegrationTest {
.withDataNodesAutoAdjustScaleDown(zoneDefinition.dataNodesAutoAdjustScaleDown())
.withDataNodesAutoAdjustScaleUp(zoneDefinition.dataNodesAutoAdjustScaleUp())
.withFilter(zoneDefinition.filter())
+ .withConsistencyMode(zoneDefinition.consistencyMode())
// TODO: https://issues.apache.org/jira/browse/IGNITE-22162
// .withDistributionAlgorithm(zoneDefinition.distributionAlgorithm())
);
diff --git
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
index d8003438a6..eae4488314 100644
---
a/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
+++
b/modules/catalog-dsl/src/integrationTest/java/org/apache/ignite/internal/matcher/ZoneDefinitionMatcher.java
@@ -49,6 +49,8 @@ public class ZoneDefinitionMatcher extends
TypeSafeMatcher<ZoneDefinition> {
private Matcher<String> storageProfiles = AnythingMatcher.anything();
+ private Matcher<String> consistencyMode = AnythingMatcher.anything();
+
public ZoneDefinitionMatcher withZoneNameMatcher(Matcher<String>
zoneNameMatcher) {
this.zoneNameMatcher = zoneNameMatcher;
return this;
@@ -141,6 +143,15 @@ public class ZoneDefinitionMatcher extends
TypeSafeMatcher<ZoneDefinition> {
return withStorageProfilesMatcher(equalTo(storageProfiles));
}
+ public ZoneDefinitionMatcher withConsistencyModeMatcher(Matcher<String>
consistenyMode) {
+ this.consistencyMode = consistenyMode;
+ return this;
+ }
+
+ public ZoneDefinitionMatcher withConsistencyMode(String consistencyMode) {
+ return withConsistencyModeMatcher(equalTo(consistencyMode));
+ }
+
public static ZoneDefinitionMatcher isZoneDefinition() {
return new ZoneDefinitionMatcher();
}
@@ -157,7 +168,8 @@ public class ZoneDefinitionMatcher extends
TypeSafeMatcher<ZoneDefinition> {
&&
dataNodesAutoAdjustScaleUpMatcher.matches(zoneDefinition.dataNodesAutoAdjustScaleUp())
&&
dataNodesAutoAdjustScaleDownMatcher.matches(zoneDefinition.dataNodesAutoAdjustScaleDown())
&& filterMatcher.matches(zoneDefinition.filter())
- && storageProfiles.matches(zoneDefinition.storageProfiles());
+ && storageProfiles.matches(zoneDefinition.storageProfiles())
+ && consistencyMode.matches(zoneDefinition.consistencyMode());
}
@Override
@@ -181,6 +193,8 @@ public class ZoneDefinitionMatcher extends
TypeSafeMatcher<ZoneDefinition> {
.appendText(System.lineSeparator())
.appendText("filter ").appendDescriptionOf(filterMatcher)
.appendText(System.lineSeparator())
- .appendText("storage profiles
").appendDescriptionOf(storageProfiles);
+ .appendText("storage profiles
").appendDescriptionOf(storageProfiles)
+ .appendText(System.lineSeparator())
+ .appendText("consistency mode
").appendDescriptionOf(consistencyMode);
}
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
index 460f979e79..744e3fafae 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsImpl.java
@@ -143,6 +143,10 @@ class CreateFromAnnotationsImpl extends
AbstractCatalogQuery<TableZoneId> {
if (!zone.filter().isEmpty()) {
createZone.filter(zone.filter());
}
+
+ if (!zone.consistencyMode().isEmpty()) {
+ createZone.consistencyMode(zone.consistencyMode());
+ }
}
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
index 7fb190cbdb..381d806265 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionImpl.java
@@ -84,6 +84,10 @@ class CreateFromDefinitionImpl extends
AbstractCatalogQuery<TableZoneId> {
if (!StringUtils.nullOrBlank(def.filter())) {
createZone.filter(def.filter());
}
+
+ if (!StringUtils.nullOrBlank(def.consistencyMode())) {
+ createZone.consistencyMode(def.consistencyMode());
+ }
return this;
}
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
index 1a35774b4b..dfdb07921e 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/CreateZoneImpl.java
@@ -116,6 +116,21 @@ class CreateZoneImpl extends AbstractCatalogQuery<Name> {
return this;
}
+ CreateZoneImpl consistencyMode(String consistencyMode) {
+ Objects.requireNonNull(consistencyMode, "Consistency mode must not be
null");
+
+ if (!isValidConsistencyMode(consistencyMode)) {
+ throw new IllegalArgumentException("Invalid consistency mode: " +
consistencyMode);
+ }
+
+ withOptions.add(Option.consistencyMode(consistencyMode));
+ return this;
+ }
+
+ private static boolean isValidConsistencyMode(String consistencyMode) {
+ return "HIGH_AVAILABILITY".equals(consistencyMode) ||
"STRONG_CONSISTENCY".equals(consistencyMode);
+ }
+
@Override
protected void accept(QueryContext ctx) {
ctx.sql("CREATE ZONE ");
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
index c749203cbc..717a908d4c 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/IgniteCatalogSqlImpl.java
@@ -123,7 +123,8 @@ public class IgniteCatalogSqlImpl implements IgniteCatalog {
"REPLICAS",
"DATA_NODES_AUTO_ADJUST_SCALE_UP",
"DATA_NODES_AUTO_ADJUST_SCALE_DOWN",
- "DATA_NODES_FILTER"
+ "DATA_NODES_FILTER",
+ "CONSISTENCY_MODE"
);
return new SelectFromView<>(sql, zoneViewColumns, "ZONES",
name(zoneName), row -> toZoneDefinitionBuilder(zoneName, row))
.executeAsync()
@@ -217,13 +218,15 @@ public class IgniteCatalogSqlImpl implements
IgniteCatalog {
int dataNodesAutoAdjustScaleUp =
row.intValue("DATA_NODES_AUTO_ADJUST_SCALE_UP");
int dataNodesAutoAdjustScaleDown =
row.intValue("DATA_NODES_AUTO_ADJUST_SCALE_DOWN");
String filter = row.stringValue("DATA_NODES_FILTER");
+ String consistencyMode = row.stringValue("CONSISTENCY_MODE");
return ZoneDefinition.builder(zoneName)
.partitions(partitions)
.replicas(replicas)
.dataNodesAutoAdjustScaleUp(dataNodesAutoAdjustScaleUp)
.dataNodesAutoAdjustScaleDown(dataNodesAutoAdjustScaleDown)
- .filter(filter);
+ .filter(filter)
+ .consistencyMode(consistencyMode);
}
private static <R> R join(CompletableFuture<R> future) {
diff --git
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
index 5f1b8ae955..14836cc32c 100644
---
a/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
+++
b/modules/catalog-dsl/src/main/java/org/apache/ignite/internal/catalog/sql/Option.java
@@ -59,6 +59,10 @@ class Option extends QueryPart {
return new Option("STORAGE_PROFILES", storageProfiles);
}
+ public static Option consistencyMode(String consistencyMode) {
+ return new Option("CONSISTENCY_MODE", consistencyMode);
+ }
+
public static Option name(String name) {
return new Option("NAME", name);
}
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
index e72376cf8e..9368ec9204 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromAnnotationsTest.java
@@ -75,6 +75,7 @@ class CreateFromAnnotationsTest {
.dataNodesAutoAdjustScaleUp(3)
.filter("filter")
.storageProfiles("default")
+ .consistencyMode("HIGH_AVAILABILITY")
.build();
Query query2 = new CreateFromDefinitionImpl(null).from(zoneDefinition);
String sqlZoneFromDefinition = query2.toString();
@@ -104,7 +105,7 @@ class CreateFromAnnotationsTest {
is("CREATE ZONE IF NOT EXISTS zone_test WITH
STORAGE_PROFILES='default', PARTITIONS=1, REPLICAS=3,"
+ " DISTRIBUTION_ALGORITHM='partitionDistribution',"
+ " DATA_NODES_AUTO_ADJUST=1,
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
- + " DATA_NODES_FILTER='filter';"
+ + " DATA_NODES_FILTER='filter',
CONSISTENCY_MODE='HIGH_AVAILABILITY';"
+ System.lineSeparator()
+ "CREATE TABLE IF NOT EXISTS PUBLIC.pojo_value_test
(id int, f_name varchar, l_name varchar, str varchar,"
+ " PRIMARY KEY (id)) COLOCATE BY (id, id_str) ZONE
ZONE_TEST;"
@@ -122,7 +123,7 @@ class CreateFromAnnotationsTest {
is("CREATE ZONE IF NOT EXISTS zone_test WITH
STORAGE_PROFILES='default', PARTITIONS=1, REPLICAS=3,"
+ " DISTRIBUTION_ALGORITHM='partitionDistribution',"
+ " DATA_NODES_AUTO_ADJUST=1,
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
- + " DATA_NODES_FILTER='filter';"
+ + " DATA_NODES_FILTER='filter',
CONSISTENCY_MODE='HIGH_AVAILABILITY';"
+ System.lineSeparator()
+ "CREATE TABLE IF NOT EXISTS PUBLIC.pojo_value_test
(id int, id_str varchar(20), f_name varchar, l_name varchar,"
+ " str varchar, PRIMARY KEY (id, id_str)) COLOCATE BY
(id, id_str) ZONE ZONE_TEST;"
@@ -139,7 +140,7 @@ class CreateFromAnnotationsTest {
is("CREATE ZONE IF NOT EXISTS zone_test WITH
STORAGE_PROFILES='default', PARTITIONS=1, REPLICAS=3,"
+ " DISTRIBUTION_ALGORITHM='partitionDistribution',"
+ " DATA_NODES_AUTO_ADJUST=1,
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
- + " DATA_NODES_FILTER='filter';"
+ + " DATA_NODES_FILTER='filter',
CONSISTENCY_MODE='STRONG_CONSISTENCY';"
+ System.lineSeparator()
+ "CREATE TABLE IF NOT EXISTS PUBLIC.pojo_test"
+ " (id int, id_str varchar(20), f_name varchar(20)
not null default 'a',"
@@ -150,6 +151,11 @@ class CreateFromAnnotationsTest {
);
}
+ @Test
+ void createFromKeyValueClassesInvalid() {
+ assertThrows(IllegalArgumentException.class, () ->
createTable().processKeyValueClasses(Integer.class, PojoValueInvalid.class));
+ }
+
@Test
void nameGeneration() {
CreateFromAnnotationsImpl query =
createTable().processRecordClass(NameGeneration.class);
@@ -216,7 +222,8 @@ class CreateFromAnnotationsTest {
dataNodesAutoAdjustScaleDown = 2,
dataNodesAutoAdjustScaleUp = 3,
filter = "filter",
- storageProfiles = "default"
+ storageProfiles = "default",
+ consistencyMode = "HIGH_AVAILABILITY"
),
colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
indexes = @Index(value = "ix_pojo", columns = {
@@ -246,7 +253,8 @@ class CreateFromAnnotationsTest {
dataNodesAutoAdjustScaleDown = 2,
dataNodesAutoAdjustScaleUp = 3,
filter = "filter",
- storageProfiles = "default"
+ storageProfiles = "default",
+ consistencyMode = "STRONG_CONSISTENCY"
),
colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
indexes = @Index(value = "ix_pojo", columns = {
@@ -271,6 +279,37 @@ class CreateFromAnnotationsTest {
String str;
}
+ @SuppressWarnings("unused")
+ @Table(
+ value = "pojo_invalid_test",
+ zone = @Zone(
+ value = "zone_test",
+ partitions = 1,
+ replicas = 3,
+ distributionAlgorithm = "partitionDistribution",
+ dataNodesAutoAdjust = 1,
+ dataNodesAutoAdjustScaleDown = 2,
+ dataNodesAutoAdjustScaleUp = 3,
+ filter = "filter",
+ storageProfiles = "default",
+ consistencyMode = "MY_CONSISTENCY"
+ ),
+ colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
+ indexes = @Index(value = "ix_pojo", columns = {
+ @ColumnRef("f_name"),
+ @ColumnRef(value = "l_name", sort = SortOrder.DESC),
+ })
+ )
+ private static class PojoValueInvalid {
+ @Column("f_name")
+ String firstName;
+
+ @Column("l_name")
+ String lastName;
+
+ String str;
+ }
+
@Table(indexes = @Index(columns = {@ColumnRef("col1"),
@ColumnRef("col2")}))
private static class NameGeneration {
Integer col1;
diff --git
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
index 4643619f89..23635f610e 100644
---
a/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
+++
b/modules/catalog-dsl/src/test/java/org/apache/ignite/internal/catalog/sql/CreateFromDefinitionTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.catalog.annotations.Id;
import org.apache.ignite.catalog.definitions.TableDefinition;
import org.apache.ignite.catalog.definitions.ZoneDefinition;
import org.apache.ignite.internal.catalog.sql.CreateFromAnnotationsTest.Pojo;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@SuppressWarnings("ThrowableNotThrown")
@@ -56,6 +57,7 @@ class CreateFromDefinitionTest {
.dataNodesAutoAdjustScaleUp(3)
.filter("filter")
.storageProfiles("default")
+ .consistencyMode("HIGH_AVAILABILITY")
.build();
assertThat(
@@ -63,10 +65,28 @@ class CreateFromDefinitionTest {
is("CREATE ZONE IF NOT EXISTS zone_test WITH
STORAGE_PROFILES='default', PARTITIONS=3, REPLICAS=3,"
+ " DISTRIBUTION_ALGORITHM='partitionDistribution',"
+ " DATA_NODES_AUTO_ADJUST=1,
DATA_NODES_AUTO_ADJUST_SCALE_UP=3, DATA_NODES_AUTO_ADJUST_SCALE_DOWN=2,"
- + " DATA_NODES_FILTER='filter';")
+ + " DATA_NODES_FILTER='filter',
CONSISTENCY_MODE='HIGH_AVAILABILITY';")
);
}
+ @Test
+ void testDefinitionInvalidConsistencyMode() {
+ ZoneDefinition zoneDefinition = ZoneDefinition.builder("zone_test")
+ .ifNotExists()
+ .partitions(1)
+ .replicas(3)
+ .distributionAlgorithm("partitionDistribution")
+ .dataNodesAutoAdjust(1)
+ .dataNodesAutoAdjustScaleDown(2)
+ .dataNodesAutoAdjustScaleUp(3)
+ .filter("filter")
+ .storageProfiles("default")
+ .consistencyMode("MY_CONSISTENCY")
+ .build();
+
+ Assertions.assertThrows(IllegalArgumentException.class, () -> new
CreateFromDefinitionImpl(null).from(zoneDefinition));
+ }
+
@Test
void invalidTableDefinition() {
assertThrows(IllegalArgumentException.class,
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
index 8d2061fca8..12292227f6 100644
---
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
@@ -29,6 +29,7 @@ import
org.apache.ignite.internal.catalog.commands.StorageProfileParams;
import org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
import
org.apache.ignite.internal.catalog.descriptors.CatalogStorageProfileDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.util.StringUtils;
import org.jetbrains.annotations.Nullable;
@@ -120,6 +121,18 @@ public class CatalogParamsValidationUtils {
}
}
+ /**
+ * Validates that given consistency mode is has only the expected values.
+ *
+ * @param consistencyMode Consistency mode to validate.
+ */
+ public static void validateConsistencyMode(@Nullable ConsistencyMode
consistencyMode) {
+ if (consistencyMode != null
+ && !(consistencyMode == ConsistencyMode.HIGH_AVAILABILITY ||
consistencyMode == ConsistencyMode.STRONG_CONSISTENCY)) {
+ throw new CatalogValidationException("Consistency mode is not
supported: [mode={}]", consistencyMode);
+ }
+ }
+
/**
* Validates that given partitions number is null, meaning that altering
of a partitions number is forbidden.
*
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
index 31b88c1f28..872c6ac088 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/AlterZoneCommand.java
@@ -139,7 +139,8 @@ public class AlterZoneCommand extends AbstractZoneCommand {
Objects.requireNonNullElse(scaleUp,
previous.dataNodesAutoAdjustScaleUp()),
Objects.requireNonNullElse(scaleDown,
previous.dataNodesAutoAdjustScaleDown()),
Objects.requireNonNullElse(filter, previous.filter()),
- storageProfiles
+ storageProfiles,
+ previous.consistencyMode()
);
}
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 d398425439..3db8bc06ab 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
@@ -45,6 +45,7 @@ import
org.apache.ignite.internal.catalog.descriptors.CatalogStorageProfilesDesc
import
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.hlc.HybridTimestamp;
import org.apache.ignite.internal.type.NativeTypes;
import org.apache.ignite.sql.ColumnType;
@@ -120,6 +121,8 @@ public class CatalogUtils {
*/
public static final int DEFAULT_VARLEN_LENGTH = 2 << 15;
+ public static final ConsistencyMode DEFAULT_CONSISTENCY_MODE =
ConsistencyMode.STRONG_CONSISTENCY;
+
private static final Map<ColumnType, Set<ColumnType>>
ALTER_COLUMN_TYPE_TRANSITIONS = new EnumMap<>(ColumnType.class);
/**
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
index 9b21663526..6e96b05550 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommand.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.catalog.commands;
+import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateConsistencyMode;
import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateField;
import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateStorageProfiles;
import static
org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.validateZoneDataNodesAutoAdjustParametersCompatibility;
@@ -28,6 +29,7 @@ import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.IMMEDIATE
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.catalog.commands.CatalogUtils.fromParams;
+import static
org.apache.ignite.internal.catalog.descriptors.ConsistencyMode.STRONG_CONSISTENCY;
import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
import java.util.List;
@@ -37,6 +39,7 @@ import org.apache.ignite.internal.catalog.CatalogCommand;
import org.apache.ignite.internal.catalog.CatalogValidationException;
import
org.apache.ignite.internal.catalog.DistributionZoneExistsValidationException;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.catalog.storage.NewZoneEntry;
import org.apache.ignite.internal.catalog.storage.ObjectIdGenUpdateEntry;
import org.apache.ignite.internal.catalog.storage.UpdateEntry;
@@ -67,6 +70,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
private final List<StorageProfileParams> storageProfileParams;
+ private final @Nullable ConsistencyMode consistencyMode;
+
/**
* Constructor.
*
@@ -90,7 +95,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
@Nullable Integer dataNodesAutoAdjustScaleUp,
@Nullable Integer dataNodesAutoAdjustScaleDown,
@Nullable String filter,
- List<StorageProfileParams> storageProfileParams
+ List<StorageProfileParams> storageProfileParams,
+ @Nullable ConsistencyMode consistencyMode
) throws CatalogValidationException {
super(zoneName);
this.ifNotExists = ifNotExists;
@@ -101,6 +107,7 @@ public class CreateZoneCommand extends AbstractZoneCommand {
this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
this.filter = filter;
this.storageProfileParams = storageProfileParams;
+ this.consistencyMode = consistencyMode;
validate();
}
@@ -136,7 +143,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
),
Objects.requireNonNullElse(dataNodesAutoAdjustScaleDown,
INFINITE_TIMER_VALUE),
Objects.requireNonNullElse(filter, DEFAULT_FILTER),
- fromParams(storageProfileParams)
+ fromParams(storageProfileParams),
+ Objects.requireNonNullElse(consistencyMode, STRONG_CONSISTENCY)
);
return zone;
@@ -157,6 +165,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
validateZoneFilter(filter);
+ validateConsistencyMode(consistencyMode);
+
validateStorageProfiles(storageProfileParams);
}
@@ -180,6 +190,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
private @Nullable String filter;
+ private @Nullable ConsistencyMode consistencyMode;
+
private List<StorageProfileParams> storageProfileParams;
@Override
@@ -245,6 +257,13 @@ public class CreateZoneCommand extends AbstractZoneCommand
{
return this;
}
+ @Override
+ public CreateZoneCommandBuilder consistencyModeParams(@Nullable
ConsistencyMode params) {
+ this.consistencyMode = params;
+
+ return this;
+ }
+
@Override
public CatalogCommand build() {
return new CreateZoneCommand(
@@ -256,7 +275,8 @@ public class CreateZoneCommand extends AbstractZoneCommand {
dataNodesAutoAdjustScaleUp,
dataNodesAutoAdjustScaleDown,
filter,
- storageProfileParams
+ storageProfileParams,
+ consistencyMode
);
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
index 84770586ff..21c9d088ce 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandBuilder.java
@@ -18,6 +18,7 @@
package org.apache.ignite.internal.catalog.commands;
import java.util.List;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.jetbrains.annotations.Nullable;
/**
@@ -85,4 +86,12 @@ public interface CreateZoneCommandBuilder extends
AbstractZoneCommandBuilder<Cre
* @return This instance.
*/
CreateZoneCommandBuilder storageProfilesParams(List<StorageProfileParams>
params);
+
+ /**
+ * Sets consistency mode.
+ *
+ * @param params Optional consistency mode params.
+ * @return This instance.
+ */
+ CreateZoneCommandBuilder consistencyModeParams(@Nullable ConsistencyMode
params);
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
index 89e0d89cdf..c6c2748d1d 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/commands/RenameZoneCommand.java
@@ -81,7 +81,8 @@ public class RenameZoneCommand extends AbstractZoneCommand {
zone.dataNodesAutoAdjustScaleUp(),
zone.dataNodesAutoAdjustScaleDown(),
zone.filter(),
- zone.storageProfiles()
+ zone.storageProfiles(),
+ zone.consistencyMode()
);
return List.of(new AlterZoneEntry(descriptor));
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
index 29b0f3246d..6af1345473 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptor.java
@@ -52,6 +52,11 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
/** Storage profiles descriptor. */
private final CatalogStorageProfilesDescriptor storageProfiles;
+ /**
+ * Specifies the consistency mode of the zone, determining how the system
balances data consistency and availability.
+ */
+ private final ConsistencyMode consistencyMode;
+
/**
* Constructs a distribution zone descriptor.
*
@@ -64,6 +69,7 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
* @param dataNodesAutoAdjustScaleDown Data nodes auto adjust scale down
timeout.
* @param filter Nodes filter.
* @param storageProfiles Storage profiles descriptor.
+ * @param consistencyMode Consistency mode of the zone.
*/
public CatalogZoneDescriptor(
int id,
@@ -74,10 +80,11 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
int dataNodesAutoAdjustScaleUp,
int dataNodesAutoAdjustScaleDown,
String filter,
- CatalogStorageProfilesDescriptor storageProfiles
+ CatalogStorageProfilesDescriptor storageProfiles,
+ ConsistencyMode consistencyMode
) {
this(id, name, partitions, replicas, dataNodesAutoAdjust,
dataNodesAutoAdjustScaleUp, dataNodesAutoAdjustScaleDown,
- filter, storageProfiles, INITIAL_CAUSALITY_TOKEN);
+ filter, storageProfiles, INITIAL_CAUSALITY_TOKEN,
consistencyMode);
}
/**
@@ -103,7 +110,8 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
int dataNodesAutoAdjustScaleDown,
String filter,
CatalogStorageProfilesDescriptor storageProfiles,
- long causalityToken
+ long causalityToken,
+ ConsistencyMode consistencyMode
) {
super(id, Type.ZONE, name, causalityToken);
@@ -114,6 +122,7 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
this.dataNodesAutoAdjustScaleDown = dataNodesAutoAdjustScaleDown;
this.filter = filter;
this.storageProfiles = storageProfiles;
+ this.consistencyMode = consistencyMode;
}
/**
@@ -164,6 +173,13 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
return filter;
}
+ /**
+ * Specifies the consistency mode of the zone, determining how the system
balances data consistency and availability.
+ */
+ public ConsistencyMode consistencyMode() {
+ return consistencyMode;
+ }
+
/**
* Returns the storage profiles descriptor.
*/
@@ -194,6 +210,7 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
int dataNodesAutoAdjustScaleUp = input.readInt();
int dataNodesAutoAdjustScaleDown = input.readInt();
String filter = input.readUTF();
+ ConsistencyMode consistencyMode =
ConsistencyMode.forId(input.readByte());
return new CatalogZoneDescriptor(
id,
@@ -205,7 +222,8 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
dataNodesAutoAdjustScaleDown,
filter,
catalogStorageProfilesDescriptor,
- updateToken
+ updateToken,
+ consistencyMode
);
}
@@ -223,6 +241,7 @@ public class CatalogZoneDescriptor extends
CatalogObjectDescriptor {
output.writeInt(descriptor.dataNodesAutoAdjustScaleUp());
output.writeInt(descriptor.dataNodesAutoAdjustScaleDown());
output.writeUTF(descriptor.filter());
+ output.writeByte(descriptor.consistencyMode().id());
}
}
}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/ConsistencyMode.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/ConsistencyMode.java
new file mode 100644
index 0000000000..0404294ebf
--- /dev/null
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/descriptors/ConsistencyMode.java
@@ -0,0 +1,66 @@
+/*
+ * 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.descriptors;
+
+/**
+ * Specifies the consistency mode of the zone, determining how the system
balances data consistency and availability.
+ */
+public enum ConsistencyMode {
+ /**
+ * Ensures strong consistency by requiring a majority of nodes for
operations. Partitions become unavailable if the majority of assigned
+ * nodes are lost.
+ */
+ STRONG_CONSISTENCY(0),
+
+ /**
+ * Prioritizes availability over strict consistency, allowing partitions
to remain available for read-write operations even when the
+ * majority of assigned nodes are offline. The system reconfigures the
RAFT group to include only the available nodes without changing
+ * the assignments.
+ */
+ HIGH_AVAILABILITY(1);
+
+ private static final ConsistencyMode[] VALS = new
ConsistencyMode[values().length];
+
+ private final int id;
+
+ ConsistencyMode(int id) {
+ this.id = id;
+ }
+
+ public int id() {
+ return id;
+ }
+
+
+ static {
+ for (ConsistencyMode mode : values()) {
+ assert VALS[mode.id] == null : "Found duplicate id " + mode.id;
+
+ VALS[mode.id()] = mode;
+ }
+ }
+
+ /** Returns index status by identifier. */
+ static ConsistencyMode forId(int id) {
+ if (id >= 0 && id < VALS.length) {
+ return VALS[id];
+ }
+
+ throw new IllegalArgumentException("Incorrect consistency mode
identifier: " + id);
+ }
+}
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
index c5579f2f47..5433fffd06 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/systemviews/ZonesSystemViewProvider.java
@@ -58,6 +58,7 @@ public final class ZonesSystemViewProvider implements
CatalogSystemViewProvider
.addColumn("DATA_NODES_AUTO_ADJUST_SCALE_DOWN", INT32, wrapper
-> wrapper.zone.dataNodesAutoAdjustScaleDown())
.addColumn("DATA_NODES_FILTER", STRING, wrapper ->
wrapper.zone.filter())
.addColumn("IS_DEFAULT_ZONE", BOOLEAN, wrapper ->
wrapper.isDefault)
+ .addColumn("CONSISTENCY_MODE", STRING, wrapper ->
wrapper.zone.consistencyMode().name())
.dataProvider(SubscriptionUtils.fromIterable(() -> {
Catalog catalog = catalogSupplier.get();
CatalogZoneDescriptor defaultZone =
catalog.defaultZone();
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
index 46208e131c..50ea51d5c1 100644
---
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/AbstractCommandValidationTest.java
@@ -45,6 +45,7 @@ import
org.apache.ignite.internal.catalog.descriptors.CatalogSystemViewDescripto
import
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.catalog.storage.UpdateEntry;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
import org.junit.jupiter.params.provider.Arguments;
@@ -63,8 +64,16 @@ abstract class AbstractCommandValidationTest extends
BaseIgniteAbstractTest {
.build();
private static final CatalogZoneDescriptor DEFAULT_ZONE = new
CatalogZoneDescriptor(
- 0, ZONE_NAME, 1, -1, -1, -1, -1, "",
-
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build()))
+ 0,
+ ZONE_NAME,
+ 1,
+ -1,
+ -1,
+ -1,
+ -1,
+ "",
+
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build())),
+ ConsistencyMode.STRONG_CONSISTENCY
);
static Stream<Arguments> nullAndBlankStrings() {
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
index 8f18f9d44c..777e5b8408 100644
---
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/commands/CreateZoneCommandValidationTest.java
@@ -31,6 +31,7 @@ import java.util.List;
import org.apache.ignite.internal.catalog.Catalog;
import org.apache.ignite.internal.catalog.CatalogCommand;
import org.apache.ignite.internal.catalog.CatalogValidationException;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.jetbrains.annotations.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -249,6 +250,15 @@ public class CreateZoneCommandValidationTest extends
AbstractCommandValidationTe
List.of(StorageProfileParams.builder().storageProfile("lru_rocks").build())).build();
}
+ @Test
+ void zoneConsistencyMode() {
+ // Let's check the success case.
+
createZoneBuilder(ZONE_NAME).consistencyModeParams(ConsistencyMode.STRONG_CONSISTENCY).build();
+
createZoneBuilder(ZONE_NAME).consistencyModeParams(ConsistencyMode.HIGH_AVAILABILITY).build();
+ // STRONG_CONSISTENCY is used in this case.
+ createZoneBuilder(ZONE_NAME).consistencyModeParams(null).build();
+ }
+
@Test
void exceptionIsThrownIfZoneAlreadyExist() {
CreateZoneCommandBuilder builder = CreateZoneCommand.builder();
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
index e8a9cb3de1..c185fdc1c7 100644
---
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/descriptors/CatalogZoneDescriptorTest.java
@@ -39,7 +39,8 @@ class CatalogZoneDescriptorTest {
5,
6,
"the-filter",
-
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build()))
+
fromParams(List.of(StorageProfileParams.builder().storageProfile(DEFAULT_STORAGE_PROFILE).build())),
+ ConsistencyMode.STRONG_CONSISTENCY
);
String toString = descriptor.toString();
@@ -54,5 +55,6 @@ class CatalogZoneDescriptorTest {
assertThat(toString, containsString("dataNodesAutoAdjustScaleDown=6"));
assertThat(toString, containsString("filter=the-filter"));
assertThat(toString,
containsString("storageProfiles=CatalogStorageProfilesDescriptor ["));
+ assertThat(toString,
containsString("consistencyMode=STRONG_CONSISTENCY"));
}
}
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
index 87ae97584d..0a54dfed3e 100644
---
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/CatalogEntrySerializationTest.java
@@ -54,6 +54,7 @@ import
org.apache.ignite.internal.catalog.descriptors.CatalogSystemViewDescripto
import
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import
org.apache.ignite.internal.catalog.storage.serialization.MarshallableEntryType;
import
org.apache.ignite.internal.catalog.storage.serialization.UpdateLogMarshallerImpl;
import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
@@ -424,7 +425,8 @@ public class CatalogEntrySerializationTest extends
BaseIgniteAbstractTest {
2,
3,
DEFAULT_FILTER,
- profiles
+ profiles,
+ ConsistencyMode.STRONG_CONSISTENCY
);
}
diff --git
a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
index 6e9722f695..03182e0ce2 100644
---
a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
+++
b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakeCatalogService.java
@@ -31,6 +31,7 @@ import
org.apache.ignite.internal.catalog.descriptors.CatalogSchemaDescriptor;
import
org.apache.ignite.internal.catalog.descriptors.CatalogTableColumnDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogTableDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.catalog.events.CatalogEvent;
import org.apache.ignite.internal.catalog.events.CatalogEventParameters;
import org.apache.ignite.internal.event.EventListener;
@@ -118,7 +119,18 @@ public class FakeCatalogService implements CatalogService {
@Override
public CatalogZoneDescriptor zone(int zoneId, long timestamp) {
- return new CatalogZoneDescriptor(zoneId, "zone", partitions, 0, 0, 0,
0, "", fromParams(Collections.emptyList()));
+ return new CatalogZoneDescriptor(
+ zoneId,
+ "zone",
+ partitions,
+ 0,
+ 0,
+ 0,
+ 0,
+ "",
+ fromParams(Collections.emptyList()),
+ ConsistencyMode.STRONG_CONSISTENCY
+ );
}
@Override
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
index 5930bedc9b..cff2bb5e1c 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItZonesSystemViewTest.java
@@ -19,18 +19,22 @@ package org.apache.ignite.internal.sql.engine;
import static org.apache.ignite.internal.TestWrappers.unwrapIgniteImpl;
import static
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_STORAGE_PROFILE;
+import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_CONSISTENCY_MODE;
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.testframework.IgniteTestUtils.assertThrows;
import java.util.Objects;
import org.apache.ignite.internal.app.IgniteImpl;
import org.apache.ignite.internal.catalog.Catalog;
import org.apache.ignite.internal.catalog.CatalogManager;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
import org.apache.ignite.internal.testframework.IgniteTestUtils;
+import org.apache.ignite.sql.SqlException;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
@@ -62,7 +66,8 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
IMMEDIATE_TIMER_VALUE,
INFINITE_TIMER_VALUE,
DEFAULT_FILTER,
- true
+ true,
+ DEFAULT_CONSISTENCY_MODE.name()
).check();
}
@@ -77,7 +82,8 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
3,
4,
DEFAULT_FILTER,
- false
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
).check();
sql("DROP ZONE " + ZONE_NAME);
@@ -94,7 +100,8 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
3,
4,
DEFAULT_FILTER,
- false
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
).check();
sql("ALTER ZONE " + ZONE_NAME + " SET REPLICAS = 100");
@@ -106,7 +113,8 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
3,
4,
DEFAULT_FILTER,
- false
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
).check();
sql("DROP ZONE " + ZONE_NAME);
@@ -123,7 +131,8 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
3,
4,
DEFAULT_FILTER,
- false
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
).check();
sql("ALTER ZONE " + ZONE_NAME + " RENAME TO " + ALTER_ZONE_NAME);
@@ -135,7 +144,8 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
3,
4,
DEFAULT_FILTER,
- false
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
).check();
assertQuery("SELECT COUNT(*) FROM SYSTEM.ZONES").returns(2L).check();
@@ -156,6 +166,71 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
assertQuery("SELECT COUNT(*) FROM SYSTEM.ZONES").returns(1L).check();
}
+ @Test
+ public void systemViewCustomConsistencyMode() {
+ sql(createZoneSql(ZONE_NAME, 1, 2, 3, 4, DEFAULT_FILTER,
ConsistencyMode.HIGH_AVAILABILITY));
+
+ assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+ ZONE_NAME,
+ 1,
+ 2,
+ 3,
+ 4,
+ DEFAULT_FILTER,
+ false,
+ ConsistencyMode.HIGH_AVAILABILITY.name()
+ ).check();
+
+ sql("ALTER ZONE " + ZONE_NAME + " SET REPLICAS = 100");
+
+ assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+ ZONE_NAME,
+ 1,
+ 100,
+ 3,
+ 4,
+ DEFAULT_FILTER,
+ false,
+ ConsistencyMode.HIGH_AVAILABILITY.name()
+ ).check();
+
+ sql("DROP ZONE " + ZONE_NAME);
+ }
+
+ @Test
+ public void systemViewAlterConsistencyMode() {
+ sql(createZoneSql(ZONE_NAME, 1, 2, 3, 4, DEFAULT_FILTER));
+
+ assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+ ZONE_NAME,
+ 1,
+ 2,
+ 3,
+ 4,
+ DEFAULT_FILTER,
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
+ ).check();
+
+ assertThrows(
+ SqlException.class,
+ () -> sql("ALTER ZONE " + ZONE_NAME + " SET CONSISTENCY_MODE =
'HIGH_AVAILABILITY'"),
+ "CONSISTENCY_MODE");
+
+ assertQuery(selectFromZonesSystemView(ZONE_NAME)).returns(
+ ZONE_NAME,
+ 1,
+ 2,
+ 3,
+ 4,
+ DEFAULT_FILTER,
+ false,
+ DEFAULT_CONSISTENCY_MODE.name()
+ ).check();
+
+ sql("DROP ZONE " + ZONE_NAME);
+ }
+
private static String createZoneSql(String zoneName, int partitions, int
replicas, int scaleUp, int scaleDown, String filter) {
String sqlFormat = "CREATE ZONE \"%s\" WITH "
+ "\"PARTITIONS\" = %d, "
@@ -168,6 +243,37 @@ public class ItZonesSystemViewTest extends
BaseSqlIntegrationTest {
return String.format(sqlFormat, zoneName, partitions, replicas,
scaleUp, scaleDown, filter, DEFAULT_STORAGE_PROFILE);
}
+ private static String createZoneSql(
+ String zoneName,
+ int partitions,
+ int replicas,
+ int scaleUp,
+ int scaleDown,
+ String filter,
+ ConsistencyMode consistencyMode
+ ) {
+ String sqlFormat = "CREATE ZONE \"%s\" WITH "
+ + "\"PARTITIONS\" = %d, "
+ + "\"REPLICAS\" = %d, "
+ + "\"DATA_NODES_AUTO_ADJUST_SCALE_UP\" = %d, "
+ + "\"DATA_NODES_AUTO_ADJUST_SCALE_DOWN\" = %d,"
+ + "\"DATA_NODES_FILTER\" = '%s',"
+ + "\"STORAGE_PROFILES\" = '%s',"
+ + "\"CONSISTENCY_MODE\" = '%s'";
+
+ return String.format(
+ sqlFormat,
+ zoneName,
+ partitions,
+ replicas,
+ scaleUp,
+ scaleDown,
+ filter,
+ DEFAULT_STORAGE_PROFILE,
+ consistencyMode
+ );
+ }
+
private static String selectFromZonesSystemView(String zoneName) {
String sqlFormat = "SELECT * FROM SYSTEM.ZONES WHERE NAME = '%s'";
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
index 31e9676f43..f6db68d67b 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DdlSqlToCommandConverter.java
@@ -23,6 +23,7 @@ import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_L
import static
org.apache.ignite.internal.catalog.commands.CatalogUtils.defaultLength;
import static
org.apache.ignite.internal.distributionzones.DistributionZonesUtil.parseStorageProfiles;
import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
+import static
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.CONSISTENCY_MODE;
import static
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.DATA_NODES_AUTO_ADJUST;
import static
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.DATA_NODES_AUTO_ADJUST_SCALE_DOWN;
import static
org.apache.ignite.internal.sql.engine.prepare.ddl.ZoneOptionEnum.DATA_NODES_AUTO_ADJUST_SCALE_UP;
@@ -46,6 +47,7 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashSet;
@@ -108,6 +110,7 @@ import
org.apache.ignite.internal.catalog.commands.TableHashPrimaryKey;
import org.apache.ignite.internal.catalog.commands.TablePrimaryKey;
import org.apache.ignite.internal.catalog.commands.TableSortedPrimaryKey;
import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.sql.engine.prepare.IgnitePlanner;
import org.apache.ignite.internal.sql.engine.prepare.IgniteSqlValidator;
import org.apache.ignite.internal.sql.engine.prepare.PlanningContext;
@@ -172,7 +175,9 @@ public class DdlSqlToCommandConverter {
DATA_NODES_AUTO_ADJUST_SCALE_DOWN,
new DdlOptionInfo<>(Integer.class, this::checkPositiveNumber,
CreateZoneCommandBuilder::dataNodesAutoAdjustScaleDown),
STORAGE_PROFILES, new DdlOptionInfo<>(String.class,
this::checkEmptyString,
- (builder, params) ->
builder.storageProfilesParams(parseStorageProfiles(params)))
+ (builder, params) ->
builder.storageProfilesParams(parseStorageProfiles(params))),
+ CONSISTENCY_MODE, new DdlOptionInfo<>(String.class,
this::checkEmptyString,
+ (builder, params) ->
builder.consistencyModeParams(parseConsistencyMode(params)))
));
// ALTER ZONE options.
@@ -189,6 +194,21 @@ public class DdlSqlToCommandConverter {
));
}
+ /**
+ * Parse string representation of consistency mode.
+ *
+ * @param consistencyMode String representation of consistency mode.
+ * @return Consistency mode
+ */
+ public static ConsistencyMode parseConsistencyMode(String consistencyMode)
{
+ try {
+ return ConsistencyMode.valueOf(consistencyMode);
+ } catch (IllegalArgumentException e) {
+ throw new SqlException(STMT_VALIDATION_ERR, "Failed to parse
consistency mode: " + consistencyMode
+ + ". Valid values are: " +
Arrays.toString(ConsistencyMode.values()));
+ }
+ }
+
/**
* Converts a given ddl AST to a catalog command.
*
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
index f3135c07d3..4c6cc37746 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/ddl/ZoneOptionEnum.java
@@ -43,5 +43,8 @@ public enum ZoneOptionEnum {
DATA_NODES_AUTO_ADJUST_SCALE_DOWN,
/** Storage profiles. */
- STORAGE_PROFILES
+ STORAGE_PROFILES,
+
+ /** Consistency mode. */
+ CONSISTENCY_MODE
}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
index 2b66e7cb0f..9a48095d3b 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/ddl/DistributionZoneSqlToCommandConverterTest.java
@@ -42,12 +42,14 @@ import
org.apache.ignite.internal.catalog.commands.DropZoneCommand;
import org.apache.ignite.internal.catalog.commands.RenameZoneCommand;
import
org.apache.ignite.internal.catalog.descriptors.CatalogStorageProfileDescriptor;
import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
+import org.apache.ignite.internal.catalog.descriptors.ConsistencyMode;
import org.apache.ignite.internal.catalog.storage.AlterZoneEntry;
import org.apache.ignite.internal.catalog.storage.DropZoneEntry;
import org.apache.ignite.internal.catalog.storage.NewZoneEntry;
import org.apache.ignite.internal.catalog.storage.SetDefaultZoneEntry;
import org.apache.ignite.lang.ErrorGroups.Sql;
import org.apache.ignite.lang.IgniteException;
+import org.apache.ignite.sql.SqlException;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
@@ -82,6 +84,61 @@ public class DistributionZoneSqlToCommandConverterTest
extends AbstractDdlSqlToC
assertThat(newZoneEntry.descriptor().name(), equalTo("TEST"));
}
+ @Test
+ public void testCreateZoneWithConsistencyModeNotSet() throws
SqlParseException {
+ SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" +
DEFAULT_STORAGE_PROFILE + "'");
+
+ assertThat(node, instanceOf(SqlDdl.class));
+
+ CatalogCommand cmd = converter.convert((SqlDdl) node, createContext());
+
+ CatalogZoneDescriptor desc = invokeAndGetFirstEntry(cmd,
NewZoneEntry.class).descriptor();
+
+ assertThat(desc.consistencyMode(),
equalTo(ConsistencyMode.STRONG_CONSISTENCY));
+ }
+
+ @Test
+ public void testCreateZoneWithConsistencyModeStrongConsistency() throws
SqlParseException {
+ SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" +
DEFAULT_STORAGE_PROFILE + "',"
+ + " CONSISTENCY_MODE='" +
ConsistencyMode.STRONG_CONSISTENCY.name() + "'");
+
+ assertThat(node, instanceOf(SqlDdl.class));
+
+ CatalogCommand cmd = converter.convert((SqlDdl) node, createContext());
+
+ CatalogZoneDescriptor desc = invokeAndGetFirstEntry(cmd,
NewZoneEntry.class).descriptor();
+
+ assertThat(desc.consistencyMode(),
equalTo(ConsistencyMode.STRONG_CONSISTENCY));
+ }
+
+ @Test
+ public void testCreateZoneWithConsistencyModeHighAvailability() throws
SqlParseException {
+ SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" +
DEFAULT_STORAGE_PROFILE + "',"
+ + " CONSISTENCY_MODE='" +
ConsistencyMode.HIGH_AVAILABILITY.name() + "'");
+
+ assertThat(node, instanceOf(SqlDdl.class));
+
+ CatalogCommand cmd = converter.convert((SqlDdl) node, createContext());
+
+ CatalogZoneDescriptor desc = invokeAndGetFirstEntry(cmd,
NewZoneEntry.class).descriptor();
+
+ assertThat(desc.consistencyMode(),
equalTo(ConsistencyMode.HIGH_AVAILABILITY));
+ }
+
+ @Test
+ public void testCreateZoneWithConsistencyModeInvalid() throws
SqlParseException {
+ SqlNode node = parse("CREATE ZONE test0 WITH STORAGE_PROFILES='" +
DEFAULT_STORAGE_PROFILE + "',"
+ + " CONSISTENCY_MODE='" + "MY_CUSTOM_MODE" + "'");
+
+ assertThat(node, instanceOf(SqlDdl.class));
+
+ assertThrows(
+ SqlException.class,
+ () -> converter.convert((SqlDdl) node, createContext()),
+ "Failed to parse consistency mode: MY_CUSTOM_MODE. Valid
values are: [STRONG_CONSISTENCY, HIGH_AVAILABILITY]"
+ );
+ }
+
@Test
public void testCreateZoneWithOptions() throws SqlParseException {
// Check non-conflicting options.
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
index 125b81fd63..8654739d99 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/sql/DistributionZoneSqlDdlParserTest.java
@@ -96,7 +96,8 @@ public class DistributionZoneSqlDdlParserTest extends
AbstractParserTest {
+ "distribution_algorithm='test_Distribution', "
+ "data_nodes_auto_adjust=1, "
+ "data_nodes_auto_adjust_scale_up=2, "
- + "data_nodes_auto_adjust_scale_down=3"
+ + "data_nodes_auto_adjust_scale_down=3,"
+ + "consistency_mode='HIGH_AVAILABILITY'"
);
assertNotNull(createZone.createOptionList());
@@ -108,6 +109,7 @@ public class DistributionZoneSqlDdlParserTest extends
AbstractParserTest {
assertThatZoneOptionPresent(optList,
ZoneOptionEnum.DISTRIBUTION_ALGORITHM, "test_Distribution");
assertThatZoneOptionPresent(optList, ZoneOptionEnum.DATA_NODES_FILTER,
"(\"US\" || \"EU\") && \"SSD\"");
assertThatZoneOptionPresent(optList,
ZoneOptionEnum.DATA_NODES_AUTO_ADJUST, 1);
+ assertThatZoneOptionPresent(optList, ZoneOptionEnum.CONSISTENCY_MODE,
"HIGH_AVAILABILITY");
expectUnparsed(createZone, "CREATE ZONE \"TEST_ZONE\" WITH "
+ "\"REPLICAS\" = 2, "
@@ -116,7 +118,8 @@ public class DistributionZoneSqlDdlParserTest extends
AbstractParserTest {
+ "\"DISTRIBUTION_ALGORITHM\" = 'test_Distribution', "
+ "\"DATA_NODES_AUTO_ADJUST\" = 1, "
+ "\"DATA_NODES_AUTO_ADJUST_SCALE_UP\" = 2, "
- + "\"DATA_NODES_AUTO_ADJUST_SCALE_DOWN\" = 3");
+ + "\"DATA_NODES_AUTO_ADJUST_SCALE_DOWN\" = 3, "
+ + "\"CONSISTENCY_MODE\" = 'HIGH_AVAILABILITY'");
}
/**