You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sa...@apache.org on 2023/01/11 07:31:26 UTC
[ignite-3] branch main updated: IGNITE-18089 Added default distribution zone. (#1497)
This is an automated email from the ASF dual-hosted git repository.
sanpwc 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 c184773f8b IGNITE-18089 Added default distribution zone. (#1497)
c184773f8b is described below
commit c184773f8b23ee07fb8fff4ef1a19494855ff90b
Author: Sergey Uttsel <ut...@gmail.com>
AuthorDate: Wed Jan 11 10:31:21 2023 +0300
IGNITE-18089 Added default distribution zone. (#1497)
---
.../distributionzones/DistributionZoneManager.java | 44 ++++++-
.../DistributionZoneConfigurationSchema.java | 6 +-
.../DistributionZonesConfigurationSchema.java | 16 ++-
.../DistributionZoneAlreadyExistsException.java | 9 ++
.../DistributionZoneManagerTest.java | 127 ++++++++++++++++++++-
.../sql/engine/exec/ddl/DdlCommandHandler.java | 3 +
.../sql/engine/exec/MockedStructuresTest.java | 2 +-
7 files changed, 196 insertions(+), 11 deletions(-)
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
index 3d9ce9c16f..db891433e3 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
@@ -88,6 +88,12 @@ import org.jetbrains.annotations.NotNull;
* Distribution zones manager.
*/
public class DistributionZoneManager implements IgniteComponent {
+ /** Name of the default distribution zone. */
+ public static final String DEFAULT_ZONE_NAME = "Default";
+
+ /** Id of the default distribution zone. */
+ public static final int DEFAULT_ZONE_ID = 0;
+
/** The logger. */
private static final IgniteLogger LOG = Loggers.forClass(DistributionZoneManager.class);
@@ -170,7 +176,8 @@ public class DistributionZoneManager implements IgniteComponent {
* @return Future representing pending completion of the operation. Future can be completed with:
* {@link DistributionZoneAlreadyExistsException} if a zone with the given name already exists,
* {@link ConfigurationValidationException} if {@code distributionZoneCfg} is broken,
- * {@link IllegalArgumentException} if distribution zone configuration is null,
+ * {@link IllegalArgumentException} if distribution zone configuration is null
+ * or distribution zone name is {@code DEFAULT_ZONE_NAME},
* {@link NodeStoppingException} if the node is stopping.
*/
public CompletableFuture<Void> createZone(DistributionZoneConfigurationParameters distributionZoneCfg) {
@@ -178,6 +185,12 @@ public class DistributionZoneManager implements IgniteComponent {
return failedFuture(new IllegalArgumentException("Distribution zone configuration is null"));
}
+ if (DEFAULT_ZONE_NAME.equals(distributionZoneCfg.name())) {
+ return failedFuture(
+ new IllegalArgumentException("It's not possible to create distribution zone with [name= " + DEFAULT_ZONE_NAME + ']')
+ );
+ }
+
if (!busyLock.enterBusy()) {
return failedFuture(new NodeStoppingException());
}
@@ -244,7 +257,8 @@ public class DistributionZoneManager implements IgniteComponent {
* or zone with name for renaming already exists,
* {@link DistributionZoneNotFoundException} if a zone with the given name doesn't exist,
* {@link ConfigurationValidationException} if {@code distributionZoneCfg} is broken,
- * {@link IllegalArgumentException} if {@code name} or {@code distributionZoneCfg} is {@code null},
+ * {@link IllegalArgumentException} if {@code name} or {@code distributionZoneCfg} is {@code null}
+ * or it is an attempt to rename default distribution zone,
* {@link NodeStoppingException} if the node is stopping.
*/
public CompletableFuture<Void> alterZone(String name, DistributionZoneConfigurationParameters distributionZoneCfg) {
@@ -256,6 +270,18 @@ public class DistributionZoneManager implements IgniteComponent {
return failedFuture(new IllegalArgumentException("Distribution zone configuration is null"));
}
+ if (DEFAULT_ZONE_NAME.equals(name) && !DEFAULT_ZONE_NAME.equals(distributionZoneCfg.name())) {
+ return failedFuture(
+ new IllegalArgumentException("It's not possible to rename default distribution zone")
+ );
+ }
+
+ if (!DEFAULT_ZONE_NAME.equals(name) && DEFAULT_ZONE_NAME.equals(distributionZoneCfg.name())) {
+ return failedFuture(
+ new IllegalArgumentException("It's not possible to rename distribution zone to [name= " + DEFAULT_ZONE_NAME + ']')
+ );
+ }
+
if (!busyLock.enterBusy()) {
return failedFuture(new NodeStoppingException());
}
@@ -324,7 +350,7 @@ public class DistributionZoneManager implements IgniteComponent {
* @param name Distribution zone name.
* @return Future representing pending completion of the operation. Future can be completed with:
* {@link DistributionZoneNotFoundException} if a zone with the given name doesn't exist,
- * {@link IllegalArgumentException} if {@code name} is {@code null},
+ * {@link IllegalArgumentException} if {@code name} is {@code null} or distribution zone name is {@code DEFAULT_ZONE_NAME},
* {@link DistributionZoneBindTableException} if the zone is bound to table,
* {@link NodeStoppingException} if the node is stopping.
*/
@@ -333,6 +359,10 @@ public class DistributionZoneManager implements IgniteComponent {
return failedFuture(new IllegalArgumentException("Distribution zone name is null or empty [name=" + name + ']'));
}
+ if (DEFAULT_ZONE_NAME.equals(name)) {
+ return failedFuture(new IllegalArgumentException("Default distribution zone cannot be dropped."));
+ }
+
if (!busyLock.enterBusy()) {
return failedFuture(new NodeStoppingException());
}
@@ -388,6 +418,10 @@ public class DistributionZoneManager implements IgniteComponent {
* @throws DistributionZoneNotFoundException If the zone is not exist..
*/
public int getZoneId(String name) {
+ if (DEFAULT_ZONE_NAME.equals(name)) {
+ return DEFAULT_ZONE_ID;
+ }
+
DistributionZoneConfiguration zoneCfg = zonesConfiguration.distributionZones().get(name);
if (zoneCfg != null) {
@@ -741,7 +775,9 @@ public class DistributionZoneManager implements IgniteComponent {
}
try {
- assert evt.single();
+ assert evt.single() : "Expected an event with one entry but was an event with several entries with keys: "
+ + evt.entryEvents().stream().map(entry -> entry.newEntry() == null ? "null" : entry.newEntry().key())
+ .collect(toList());
Entry newEntry = evt.entryEvent().newEntry();
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZoneConfigurationSchema.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZoneConfigurationSchema.java
index c5dfaa6257..cf45714db7 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZoneConfigurationSchema.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZoneConfigurationSchema.java
@@ -17,6 +17,8 @@
package org.apache.ignite.internal.distributionzones.configuration;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_ID;
+
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.InjectedName;
import org.apache.ignite.configuration.annotation.Value;
@@ -34,9 +36,9 @@ public class DistributionZoneConfigurationSchema {
/** Integer zone id. */
@Immutable
- @Range(min = 1)
+ @Range(min = DEFAULT_ZONE_ID)
@Value(hasDefault = true)
- public int zoneId = 1;
+ public int zoneId = DEFAULT_ZONE_ID;
/** Timeout in seconds between node added or node left topology event itself and data nodes switch. */
@Range(min = 0)
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZonesConfigurationSchema.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZonesConfigurationSchema.java
index d1be021425..7773662b41 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZonesConfigurationSchema.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/configuration/DistributionZonesConfigurationSchema.java
@@ -17,10 +17,16 @@
package org.apache.ignite.internal.distributionzones.configuration;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_ID;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
+
+import org.apache.ignite.configuration.annotation.ConfigValue;
import org.apache.ignite.configuration.annotation.ConfigurationRoot;
import org.apache.ignite.configuration.annotation.ConfigurationType;
+import org.apache.ignite.configuration.annotation.Name;
import org.apache.ignite.configuration.annotation.NamedConfigValue;
import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.validation.ExceptKeys;
/**
* Distribution zones configuration schema.
@@ -29,9 +35,15 @@ import org.apache.ignite.configuration.annotation.Value;
public class DistributionZonesConfigurationSchema {
/** Global integer id counter. Used as an auto-increment counter to generate integer identifiers for distribution zone. */
@Value(hasDefault = true)
- public int globalIdCounter = 0;
+ public int globalIdCounter = DEFAULT_ZONE_ID;
+
+ /** Default distribution zone. */
+ @Name(DEFAULT_ZONE_NAME)
+ @ConfigValue
+ public DistributionZoneConfigurationSchema defaultDistributionZone;
- /** List of configured distribution zones. */
+ /** Other distribution zones. */
+ @ExceptKeys(DEFAULT_ZONE_NAME)
@NamedConfigValue
public DistributionZoneConfigurationSchema distributionZones;
}
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/exception/DistributionZoneAlreadyExistsException.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/exception/DistributionZoneAlreadyExistsException.java
index 13e2ff5ea5..2ea37adedb 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/exception/DistributionZoneAlreadyExistsException.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/exception/DistributionZoneAlreadyExistsException.java
@@ -27,6 +27,15 @@ import org.apache.ignite.lang.IgniteInternalException;
* because a distribution zone with same name already exists.
*/
public class DistributionZoneAlreadyExistsException extends IgniteInternalException {
+ /**
+ * The constructor.
+ *
+ * @param zoneName Zone name.
+ */
+ public DistributionZoneAlreadyExistsException(String zoneName) {
+ this(zoneName, null);
+ }
+
/**
* The constructor.
*
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java
index c732d72c84..3ec98e0945 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerTest.java
@@ -18,6 +18,8 @@
package org.apache.ignite.internal.distributionzones;
import static org.apache.ignite.configuration.annotation.ConfigurationType.DISTRIBUTED;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_ID;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -561,9 +563,28 @@ class DistributionZoneManagerTest extends IgniteAbstractTest {
)
.get(5, TimeUnit.SECONDS);
- int zoneId = distributionZoneManager.getZoneId(ZONE_NAME);
+ assertEquals(DEFAULT_ZONE_ID + 1, distributionZoneManager.getZoneId(ZONE_NAME));
+ assertEquals(DEFAULT_ZONE_ID + 1,
+ registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones().get(ZONE_NAME).zoneId().value(),
+ "Default distribution zone has wrong id.");
- assertTrue(zoneId > 0, "Expected zone id must be higher then zero.");
+ distributionZoneManager.dropZone(ZONE_NAME).get(5, TimeUnit.SECONDS);
+
+ distributionZoneManager.createZone(
+ new DistributionZoneConfigurationParameters.Builder(NEW_ZONE_NAME).build()
+ )
+ .get(5, TimeUnit.SECONDS);
+
+ assertEquals(DEFAULT_ZONE_ID, distributionZoneManager.getZoneId(DEFAULT_ZONE_NAME),
+ "Default distribution zone has wrong id.");
+ assertEquals(DEFAULT_ZONE_ID,
+ registry.getConfiguration(DistributionZonesConfiguration.KEY).defaultDistributionZone().zoneId().value(),
+ "Default distribution zone has wrong id.");
+
+ assertEquals(DEFAULT_ZONE_ID + 2, distributionZoneManager.getZoneId(NEW_ZONE_NAME));
+ assertEquals(DEFAULT_ZONE_ID + 2,
+ registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones().get(NEW_ZONE_NAME).zoneId().value(),
+ "Default distribution zone has wrong id.");
}
@Test
@@ -603,6 +624,108 @@ class DistributionZoneManagerTest extends IgniteAbstractTest {
);
}
+ @Test
+ public void testTryCreateDefaultZone() {
+ Exception e = null;
+
+ CompletableFuture<Void> fut = distributionZoneManager.createZone(
+ new DistributionZoneConfigurationParameters.Builder(DEFAULT_ZONE_NAME).build()
+ );
+
+ try {
+ fut.get(5, TimeUnit.SECONDS);
+ } catch (Exception e0) {
+ e = e0;
+ }
+
+ assertTrue(e != null, "Expected exception was not thrown.");
+ assertTrue(
+ e.getCause() instanceof IllegalArgumentException,
+ "Unexpected type of exception (requires IllegalArgumentException): " + e
+ );
+ assertEquals(
+ "It's not possible to create distribution zone with [name= " + DEFAULT_ZONE_NAME + ']',
+ e.getCause().getMessage(),
+ "Unexpected exception message: " + e.getCause().getMessage()
+ );
+ }
+
+ @Test
+ public void testTryRenameDefaultZone() {
+ Exception e = null;
+
+ CompletableFuture<Void> fut = distributionZoneManager.alterZone(DEFAULT_ZONE_NAME,
+ new DistributionZoneConfigurationParameters.Builder(NEW_ZONE_NAME).build()
+ );
+
+ try {
+ fut.get(5, TimeUnit.SECONDS);
+ } catch (Exception e0) {
+ e = e0;
+ }
+
+ assertTrue(e != null, "Expected exception was not thrown.");
+ assertTrue(
+ e.getCause() instanceof IllegalArgumentException,
+ "Unexpected type of exception (requires IllegalArgumentException): " + e
+ );
+ assertEquals(
+ "It's not possible to rename default distribution zone",
+ e.getCause().getMessage(),
+ "Unexpected exception message: " + e.getCause().getMessage()
+ );
+ }
+
+ @Test
+ public void testTryRenameToDefaultZoneName() {
+ Exception e = null;
+
+ CompletableFuture<Void> fut = distributionZoneManager.alterZone(NEW_ZONE_NAME,
+ new DistributionZoneConfigurationParameters.Builder(DEFAULT_ZONE_NAME).build()
+ );
+
+ try {
+ fut.get(5, TimeUnit.SECONDS);
+ } catch (Exception e0) {
+ e = e0;
+ }
+
+ assertTrue(e != null, "Expected exception was not thrown.");
+ assertTrue(
+ e.getCause() instanceof IllegalArgumentException,
+ "Unexpected type of exception (requires IllegalArgumentException): " + e
+ );
+ assertEquals(
+ "It's not possible to rename distribution zone to [name= " + DEFAULT_ZONE_NAME + ']',
+ e.getCause().getMessage(),
+ "Unexpected exception message: " + e.getCause().getMessage()
+ );
+ }
+
+ @Test
+ public void testTryDropDefaultZone() {
+ Exception e = null;
+
+ CompletableFuture<Void> fut = distributionZoneManager.dropZone(DEFAULT_ZONE_NAME);
+
+ try {
+ fut.get(5, TimeUnit.SECONDS);
+ } catch (Exception e0) {
+ e = e0;
+ }
+
+ assertTrue(e != null, "Expected exception was not thrown.");
+ assertTrue(
+ e.getCause() instanceof IllegalArgumentException,
+ "Unexpected type of exception (requires IllegalArgumentException): " + e
+ );
+ assertEquals(
+ "Default distribution zone cannot be dropped.",
+ e.getCause().getMessage(),
+ "Unexpected exception message: " + e.getCause().getMessage()
+ );
+ }
+
private void bindZoneToTable(String zoneName) {
int zoneId = distributionZoneManager.getZoneId(zoneName);
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index 9682820706..c79b5616e6 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.sql.engine.exec.ddl;
import static java.util.concurrent.CompletableFuture.completedFuture;
import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_ID;
import static org.apache.ignite.internal.sql.engine.SqlQueryProcessor.DEFAULT_SCHEMA_NAME;
import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
import static org.apache.ignite.lang.ErrorGroups.Sql.DEL_PK_COMUMN_CONSTRAINT_ERR;
@@ -211,6 +212,8 @@ public class DdlCommandHandler {
if (cmd.zone() != null) {
//TODO: IGNITE-18516 Access to other configuration must be thread safe.
tableChange.changeZoneId(distributionZoneManager.getZoneId(cmd.zone()));
+ } else {
+ tableChange.changeZoneId(DEFAULT_ZONE_ID);
}
};
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
index ced4940c42..4bd7c9f201 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/MockedStructuresTest.java
@@ -336,7 +336,7 @@ public class MockedStructuresTest extends IgniteAbstractTest {
readFirst(queryProc.queryAsync("PUBLIC", newTblSql));
- assertEquals(1, tblsCfg.tables().get(tableName).zoneId().value());
+ assertEquals(DistributionZoneManager.DEFAULT_ZONE_ID, tblsCfg.tables().get(tableName).zoneId().value());
readFirst(queryProc.queryAsync("PUBLIC", "DROP TABLE " + tableName));