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));