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/18 13:58:10 UTC
[ignite-3] branch main updated: IGNITE-18540 Fixed processing of the default distribution zone. (#1532)
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 17473a4502 IGNITE-18540 Fixed processing of the default distribution zone. (#1532)
17473a4502 is described below
commit 17473a450292d7ddd2f0a46a47f399d7f7c44d54
Author: Sergey Uttsel <ut...@gmail.com>
AuthorDate: Wed Jan 18 16:58:05 2023 +0300
IGNITE-18540 Fixed processing of the default distribution zone. (#1532)
---
.../distributionzones/DistributionZoneManager.java | 194 +++++++++++++--------
...ibutionZoneManagerConfigurationChangesTest.java | 28 ++-
.../DistributionZoneManagerTest.java | 94 ++++++----
.../DistributionZoneManagerWatchListenerTest.java | 117 ++++++++-----
4 files changed, 277 insertions(+), 156 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 db891433e3..bd830de458 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
@@ -289,54 +289,45 @@ public class DistributionZoneManager implements IgniteComponent {
try {
CompletableFuture<Void> fut = new CompletableFuture<>();
- zonesConfiguration.change(zonesChange -> zonesChange.changeDistributionZones(zonesListChange -> {
- NamedListChange<DistributionZoneView, DistributionZoneChange> renameChange;
-
- try {
- renameChange = zonesListChange.rename(name, distributionZoneCfg.name());
- } catch (IllegalArgumentException e) {
- throw new DistributionZoneRenameException(name, distributionZoneCfg.name(), e);
- }
+ CompletableFuture<Void> change;
+
+ if (DEFAULT_ZONE_NAME.equals(name)) {
+ change = zonesConfiguration.change(
+ zonesChange -> zonesChange.changeDefaultDistributionZone(
+ zoneChange -> updateZoneChange(zoneChange, distributionZoneCfg)
+ )
+ );
+ } else {
+ change = zonesConfiguration.change(zonesChange -> zonesChange.changeDistributionZones(zonesListChange -> {
+ NamedListChange<DistributionZoneView, DistributionZoneChange> renameChange;
- try {
- renameChange
- .update(
- distributionZoneCfg.name(), zoneChange -> {
- if (distributionZoneCfg.dataNodesAutoAdjust() != null) {
- zoneChange.changeDataNodesAutoAdjust(distributionZoneCfg.dataNodesAutoAdjust());
- zoneChange.changeDataNodesAutoAdjustScaleUp(Integer.MAX_VALUE);
- zoneChange.changeDataNodesAutoAdjustScaleDown(Integer.MAX_VALUE);
- }
+ try {
+ renameChange = zonesListChange.rename(name, distributionZoneCfg.name());
+ } catch (IllegalArgumentException e) {
+ throw new DistributionZoneRenameException(name, distributionZoneCfg.name(), e);
+ }
- if (distributionZoneCfg.dataNodesAutoAdjustScaleUp() != null) {
- zoneChange.changeDataNodesAutoAdjustScaleUp(
- distributionZoneCfg.dataNodesAutoAdjustScaleUp());
- zoneChange.changeDataNodesAutoAdjust(Integer.MAX_VALUE);
- }
+ try {
+ renameChange.update(distributionZoneCfg.name(), zoneChange -> updateZoneChange(zoneChange, distributionZoneCfg));
+ } catch (IllegalArgumentException e) {
+ throw new DistributionZoneNotFoundException(distributionZoneCfg.name(), e);
+ }
+ }));
+ }
- if (distributionZoneCfg.dataNodesAutoAdjustScaleDown() != null) {
- zoneChange.changeDataNodesAutoAdjustScaleDown(
- distributionZoneCfg.dataNodesAutoAdjustScaleDown());
- zoneChange.changeDataNodesAutoAdjust(Integer.MAX_VALUE);
- }
- });
- } catch (IllegalArgumentException e) {
- throw new DistributionZoneNotFoundException(distributionZoneCfg.name(), e);
+ change.whenComplete((res, e) -> {
+ if (e != null) {
+ fut.completeExceptionally(
+ unwrapDistributionZoneException(
+ e,
+ DistributionZoneRenameException.class,
+ DistributionZoneNotFoundException.class,
+ ConfigurationValidationException.class)
+ );
+ } else {
+ fut.complete(null);
}
- }))
- .whenComplete((res, e) -> {
- if (e != null) {
- fut.completeExceptionally(
- unwrapDistributionZoneException(
- e,
- DistributionZoneRenameException.class,
- DistributionZoneNotFoundException.class,
- ConfigurationValidationException.class)
- );
- } else {
- fut.complete(null);
- }
- });
+ });
return fut;
} finally {
@@ -439,7 +430,11 @@ public class DistributionZoneManager implements IgniteComponent {
}
try {
- zonesConfiguration.distributionZones().listenElements(new ZonesConfigurationListener());
+ ZonesConfigurationListener zonesConfigurationListener = new ZonesConfigurationListener();
+
+ zonesConfiguration.distributionZones().listenElements(zonesConfigurationListener);
+
+ zonesConfiguration.defaultDistributionZone().listen(zonesConfigurationListener);
logicalTopologyService.addEventListener(topologyEventListener);
@@ -590,6 +585,32 @@ public class DistributionZoneManager implements IgniteComponent {
}
}
+ /**
+ * Updates {@link DistributionZoneChange} according to distribution zone configuration.
+ *
+ * @param zoneChange Zone change.
+ * @param distributionZoneCfg Distribution zone configuration.
+ */
+ private static void updateZoneChange(DistributionZoneChange zoneChange, DistributionZoneConfigurationParameters distributionZoneCfg) {
+ if (distributionZoneCfg.dataNodesAutoAdjust() != null) {
+ zoneChange.changeDataNodesAutoAdjust(distributionZoneCfg.dataNodesAutoAdjust());
+ zoneChange.changeDataNodesAutoAdjustScaleUp(Integer.MAX_VALUE);
+ zoneChange.changeDataNodesAutoAdjustScaleDown(Integer.MAX_VALUE);
+ }
+
+ if (distributionZoneCfg.dataNodesAutoAdjustScaleUp() != null) {
+ zoneChange.changeDataNodesAutoAdjustScaleUp(
+ distributionZoneCfg.dataNodesAutoAdjustScaleUp());
+ zoneChange.changeDataNodesAutoAdjust(Integer.MAX_VALUE);
+ }
+
+ if (distributionZoneCfg.dataNodesAutoAdjustScaleDown() != null) {
+ zoneChange.changeDataNodesAutoAdjustScaleDown(
+ distributionZoneCfg.dataNodesAutoAdjustScaleDown());
+ zoneChange.changeDataNodesAutoAdjust(Integer.MAX_VALUE);
+ }
+ }
+
/**
* Updates {@link DistributionZonesUtil#zonesLogicalTopologyKey()} and {@link DistributionZonesUtil#zonesLogicalTopologyVersionKey()}
* in meta storage.
@@ -747,6 +768,8 @@ public class DistributionZoneManager implements IgniteComponent {
saveDataNodesToMetaStorage(zoneId, vaultEntry.value(), vaultAppliedRevision);
});
+
+ saveDataNodesToMetaStorage(DEFAULT_ZONE_ID, vaultEntry.value(), vaultAppliedRevision);
}
} finally {
busyLock.leaveBusy();
@@ -781,7 +804,11 @@ public class DistributionZoneManager implements IgniteComponent {
Entry newEntry = evt.entryEvent().newEntry();
- Set<String> newLogicalTopology = ByteUtils.fromBytes(newEntry.value());
+ long revision = newEntry.revision();
+
+ byte[] newLogicalTopologyBytes = newEntry.value();
+
+ Set<String> newLogicalTopology = ByteUtils.fromBytes(newLogicalTopologyBytes);
List<String> removedNodes =
logicalTopology.stream().filter(node -> !newLogicalTopology.contains(node)).collect(toList());
@@ -791,37 +818,18 @@ public class DistributionZoneManager implements IgniteComponent {
logicalTopology = newLogicalTopology;
- zonesConfiguration.distributionZones().value().namedListKeys()
- .forEach(zoneName -> {
- DistributionZoneConfiguration zoneCfg = zonesConfiguration.distributionZones().get(zoneName);
-
- int autoAdjust = zoneCfg.dataNodesAutoAdjust().value();
- int autoAdjustScaleDown = zoneCfg.dataNodesAutoAdjustScaleDown().value();
- int autoAdjustScaleUp = zoneCfg.dataNodesAutoAdjustScaleUp().value();
-
- Integer zoneId = zoneCfg.zoneId().value();
-
- if ((!addedNodes.isEmpty() || !removedNodes.isEmpty()) && autoAdjust != Integer.MAX_VALUE) {
- //TODO: IGNITE-18134 Create scheduler with dataNodesAutoAdjust timer.
- saveDataNodesToMetaStorage(
- zoneId, newEntry.value(), newEntry.revision()
- );
- } else {
- if (!addedNodes.isEmpty() && autoAdjustScaleUp != Integer.MAX_VALUE) {
- //TODO: IGNITE-18121 Create scale up scheduler with dataNodesAutoAdjustScaleUp timer.
- saveDataNodesToMetaStorage(
- zoneId, newEntry.value(), newEntry.revision()
- );
- }
+ NamedConfigurationTree<DistributionZoneConfiguration, DistributionZoneView, DistributionZoneChange> zones =
+ zonesConfiguration.distributionZones();
- if (!removedNodes.isEmpty() && autoAdjustScaleDown != Integer.MAX_VALUE) {
- //TODO: IGNITE-18132 Create scale down scheduler with dataNodesAutoAdjustScaleDown timer.
- saveDataNodesToMetaStorage(
- zoneId, newEntry.value(), newEntry.revision()
- );
- }
- }
- });
+ for (int i = 0; i < zones.value().size(); i++) {
+ DistributionZoneView zoneView = zones.value().get(i);
+
+ scheduleTimers(zoneView, addedNodes, removedNodes, newLogicalTopologyBytes, revision);
+ }
+
+ DistributionZoneView defaultZoneView = zonesConfiguration.value().defaultDistributionZone();
+
+ scheduleTimers(defaultZoneView, addedNodes, removedNodes, newLogicalTopologyBytes, revision);
return true;
} finally {
@@ -837,6 +845,40 @@ public class DistributionZoneManager implements IgniteComponent {
.thenAccept(id -> watchListenerId = id);
}
+ private void scheduleTimers(
+ DistributionZoneView zoneCfg,
+ List<String> addedNodes, List<String> removedNodes,
+ byte[] newLogicalTopologyBytes,
+ long revision
+ ) {
+ int autoAdjust = zoneCfg.dataNodesAutoAdjust();
+ int autoAdjustScaleDown = zoneCfg.dataNodesAutoAdjustScaleDown();
+ int autoAdjustScaleUp = zoneCfg.dataNodesAutoAdjustScaleUp();
+
+ int zoneId = zoneCfg.zoneId();
+
+ if ((!addedNodes.isEmpty() || !removedNodes.isEmpty()) && autoAdjust != Integer.MAX_VALUE) {
+ //TODO: IGNITE-18134 Create scheduler with dataNodesAutoAdjust timer.
+ saveDataNodesToMetaStorage(
+ zoneId, newLogicalTopologyBytes, revision
+ );
+ } else {
+ if (!addedNodes.isEmpty() && autoAdjustScaleUp != Integer.MAX_VALUE) {
+ //TODO: IGNITE-18121 Create scale up scheduler with dataNodesAutoAdjustScaleUp timer.
+ saveDataNodesToMetaStorage(
+ zoneId, newLogicalTopologyBytes, revision
+ );
+ }
+
+ if (!removedNodes.isEmpty() && autoAdjustScaleDown != Integer.MAX_VALUE) {
+ //TODO: IGNITE-18132 Create scale down scheduler with dataNodesAutoAdjustScaleDown timer.
+ saveDataNodesToMetaStorage(
+ zoneId, newLogicalTopologyBytes, revision
+ );
+ }
+ }
+ }
+
/**
* Method updates data nodes value for the specified zone,
* also sets {@code revision} to the {@link DistributionZonesUtil#zonesChangeTriggerKey()} if it passes the condition.
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
index fc675e0592..f2787d6a64 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerConfigurationChangesTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.distributionzones;
import static java.util.concurrent.CompletableFuture.completedFuture;
import static org.apache.ignite.configuration.annotation.ConfigurationType.DISTRIBUTED;
+import static org.apache.ignite.internal.distributionzones.DistributionZoneManager.DEFAULT_ZONE_NAME;
import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.zoneDataNodesKey;
import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.zonesChangeTriggerKey;
import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.zonesLogicalTopologyKey;
@@ -235,21 +236,32 @@ public class DistributionZoneManagerConfigurationChangesTest extends IgniteAbstr
}
@Test
- void testTriggerKeyPropagationAfterZoneUpdate() throws Exception {
+ void testTriggerKeyPropagationAfterDefaultZoneUpdate() throws Exception {
+ testTriggerKeyPropagationAfterZoneUpdate(DEFAULT_ZONE_NAME);
+ }
+
+ @Test
+ void testTriggerKeyPropagationAfterNotDefaultZoneUpdate() throws Exception {
+ testTriggerKeyPropagationAfterZoneUpdate(ZONE_NAME);
+ }
+
+ void testTriggerKeyPropagationAfterZoneUpdate(String zoneName) throws Exception {
assertNull(keyValueStorage.get(zonesChangeTriggerKey().bytes()).value());
- distributionZoneManager.createZone(new DistributionZoneConfigurationParameters.Builder(ZONE_NAME).build()).get();
+ int triggerKey = 0;
- assertZonesChangeTriggerKey(1);
+ if (!DEFAULT_ZONE_NAME.equals(zoneName)) {
+ distributionZoneManager.createZone(new DistributionZoneConfigurationParameters.Builder(zoneName).build()).get();
+
+ assertZonesChangeTriggerKey(++triggerKey);
+ }
distributionZoneManager.alterZone(
- ZONE_NAME,
- new DistributionZoneConfigurationParameters.Builder(ZONE_NAME).dataNodesAutoAdjust(100).build()
+ zoneName,
+ new DistributionZoneConfigurationParameters.Builder(zoneName).dataNodesAutoAdjust(100).build()
).get();
- assertZonesChangeTriggerKey(2);
-
- assertDataNodesForZone(1, nodes);
+ assertZonesChangeTriggerKey(++triggerKey);
}
@Test
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 328df83319..0b0a19086d 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
@@ -226,59 +226,87 @@ class DistributionZoneManagerTest extends IgniteAbstractTest {
}
@Test
- public void testUpdateZone() throws Exception {
- distributionZoneManager.createZone(
- new DistributionZoneConfigurationParameters.Builder(ZONE_NAME).dataNodesAutoAdjust(100).build()
- )
- .get(5, TimeUnit.SECONDS);
+ public void testUpdateDefaultZone() throws Exception {
+ testUpdateZone(DEFAULT_ZONE_NAME);
+ }
- DistributionZoneConfiguration zone1 = registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones()
- .get(ZONE_NAME);
+ @Test
+ public void testUpdateNotDefaultZone() throws Exception {
+ testUpdateZone(ZONE_NAME);
+ }
- assertNotNull(zone1, "Zone was not created.");
- assertEquals(ZONE_NAME, zone1.name().value(), "Zone name is wrong.");
- assertEquals(Integer.MAX_VALUE, zone1.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
- assertEquals(Integer.MAX_VALUE, zone1.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
- assertEquals(100, zone1.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
+ private void testUpdateZone(String zoneName) throws Exception {
+ if (DEFAULT_ZONE_NAME.equals(zoneName)) {
+ distributionZoneManager.alterZone(
+ zoneName,
+ new DistributionZoneConfigurationParameters.Builder(zoneName).dataNodesAutoAdjust(100).build()
+ )
+ .get(5, TimeUnit.SECONDS);
+ } else {
+ distributionZoneManager.createZone(
+ new DistributionZoneConfigurationParameters.Builder(zoneName).dataNodesAutoAdjust(100).build()
+ )
+ .get(5, TimeUnit.SECONDS);
+ }
+
+ DistributionZoneConfiguration zone = getZoneFromRegistry(zoneName);
+
+ assertNotNull(zone, "Zone was not created.");
+ assertEquals(zoneName, zone.name().value(), "Zone name is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
+ assertEquals(100, zone.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
+ assertNotNull(zone, "Zone was not created.");
+ assertEquals(zoneName, zone.name().value(), "Zone name is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
+ assertEquals(100, zone.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
- distributionZoneManager.alterZone(ZONE_NAME, new DistributionZoneConfigurationParameters.Builder(ZONE_NAME)
+
+ distributionZoneManager.alterZone(zoneName, new DistributionZoneConfigurationParameters.Builder(zoneName)
.dataNodesAutoAdjustScaleUp(200).dataNodesAutoAdjustScaleDown(300).build())
.get(5, TimeUnit.SECONDS);
- zone1 = registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones()
- .get(ZONE_NAME);
+ zone = getZoneFromRegistry(zoneName);
- assertNotNull(zone1, "Zone was not created.");
- assertEquals(200, zone1.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
- assertEquals(300, zone1.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
- assertEquals(Integer.MAX_VALUE, zone1.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
+ assertNotNull(zone, "Zone was not created.");
+ assertEquals(200, zone.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
+ assertEquals(300, zone.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
- distributionZoneManager.alterZone(ZONE_NAME, new DistributionZoneConfigurationParameters.Builder(ZONE_NAME)
+ distributionZoneManager.alterZone(zoneName, new DistributionZoneConfigurationParameters.Builder(zoneName)
.dataNodesAutoAdjustScaleUp(400).build())
.get(5, TimeUnit.SECONDS);
- zone1 = registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones()
- .get(ZONE_NAME);
+ zone = getZoneFromRegistry(zoneName);
- assertNotNull(zone1, "Zone was not created.");
- assertEquals(400, zone1.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
- assertEquals(300, zone1.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
- assertEquals(Integer.MAX_VALUE, zone1.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
+ assertNotNull(zone, "Zone was not created.");
+ assertEquals(400, zone.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
+ assertEquals(300, zone.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
- distributionZoneManager.alterZone(ZONE_NAME, new DistributionZoneConfigurationParameters.Builder(ZONE_NAME)
+ distributionZoneManager.alterZone(zoneName, new DistributionZoneConfigurationParameters.Builder(zoneName)
.dataNodesAutoAdjust(500).build())
.get(5, TimeUnit.SECONDS);
- zone1 = registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones()
- .get(ZONE_NAME);
+ zone = getZoneFromRegistry(zoneName);
- assertNotNull(zone1, "Zone was not created.");
- assertEquals(Integer.MAX_VALUE, zone1.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
- assertEquals(Integer.MAX_VALUE, zone1.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
- assertEquals(500, zone1.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
+ assertNotNull(zone, "Zone was not created.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjustScaleUp().value(), "dataNodesAutoAdjustScaleUp is wrong.");
+ assertEquals(Integer.MAX_VALUE, zone.dataNodesAutoAdjustScaleDown().value(), "dataNodesAutoAdjustScaleDown is wrong.");
+ assertEquals(500, zone.dataNodesAutoAdjust().value(), "dataNodesAutoAdjust is wrong.");
+ }
+
+ private DistributionZoneConfiguration getZoneFromRegistry(String zoneName) {
+ if (DEFAULT_ZONE_NAME.equals(zoneName)) {
+ return registry.getConfiguration(DistributionZonesConfiguration.KEY).defaultDistributionZone();
+ } else {
+ return registry.getConfiguration(DistributionZonesConfiguration.KEY).distributionZones()
+ .get(zoneName);
+ }
}
@Test
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
index adc099b5aa..7e8480f9da 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/DistributionZoneManagerWatchListenerTest.java
@@ -19,6 +19,8 @@ package org.apache.ignite.internal.distributionzones;
import static java.util.concurrent.CompletableFuture.completedFuture;
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.apache.ignite.internal.distributionzones.DistributionZonesUtil.zoneDataNodesKey;
import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.zonesChangeTriggerKey;
import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.zonesLogicalTopologyKey;
@@ -27,6 +29,7 @@ import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
import static org.apache.ignite.internal.util.ByteUtils.longToBytes;
import static org.apache.ignite.internal.util.ByteUtils.toBytes;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
@@ -56,6 +59,7 @@ import org.apache.ignite.internal.distributionzones.configuration.DistributionZo
import org.apache.ignite.internal.distributionzones.configuration.DistributionZoneConfiguration;
import org.apache.ignite.internal.distributionzones.configuration.DistributionZoneView;
import org.apache.ignite.internal.distributionzones.configuration.DistributionZonesConfiguration;
+import org.apache.ignite.internal.distributionzones.configuration.DistributionZonesView;
import org.apache.ignite.internal.metastorage.Entry;
import org.apache.ignite.internal.metastorage.EntryEvent;
import org.apache.ignite.internal.metastorage.MetaStorageManager;
@@ -90,6 +94,7 @@ import org.junit.jupiter.api.Test;
/**
* Tests distribution zones logical topology changes and reaction to that changes.
*/
+//TODO: IGNITE-18564 Add tests with not default distribution zones, when distributionZones.change.trigger per zone will be created.
public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest {
private static final String ZONE_NAME_1 = "zone1";
@@ -164,6 +169,8 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
return completedFuture(null);
});
+ mockDefaultZoneConfiguration();
+ mockDefaultZoneView();
mockEmptyZonesList();
AtomicLong raftIndex = new AtomicLong();
@@ -240,56 +247,40 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
}
@Test
- void testDataNodesUpdatedOnWatchListenerEvent() {
+ void testDataNodesOfDefaultZoneUpdatedOnWatchListenerEvent() {
mockVaultZonesLogicalTopologyKey(Set.of());
distributionZoneManager.start();
- //TODO: Add second distribution zone, when distributionZones.change.trigger per zone will be created.
- mockZones(mockZoneWithAutoAdjust());
-
//first event
Set<String> nodes = Set.of("node1", "node2");
- watchListenerOnUpdate(nodes, 1);
+ watchListenerOnUpdate(nodes, 2);
- verify(keyValueStorage, timeout(1000).times(1)).invoke(any());
+ verify(keyValueStorage, timeout(1000).times(2)).invoke(any());
- checkDataNodesOfZone(1, nodes);
+ checkDataNodesOfZone(DEFAULT_ZONE_ID, nodes);
//second event
nodes = Set.of("node1", "node3");
- watchListenerOnUpdate(nodes, 2);
+ watchListenerOnUpdate(nodes, 3);
- verify(keyValueStorage, timeout(1000).times(2)).invoke(any());
+ verify(keyValueStorage, timeout(1000).times(3)).invoke(any());
- checkDataNodesOfZone(1, nodes);
+ checkDataNodesOfZone(DEFAULT_ZONE_ID, nodes);
//third event
nodes = Collections.emptySet();
- watchListenerOnUpdate(nodes, 3);
-
- verify(keyValueStorage, timeout(1000).times(3)).invoke(any());
-
- checkDataNodesOfZone(1, nodes);
- }
-
- private void checkDataNodesOfZone(int zoneId, Set<String> nodes) {
- Entry entry = keyValueStorage.get(zoneDataNodesKey(zoneId).bytes());
+ watchListenerOnUpdate(nodes, 4);
- if (nodes == null) {
- assertNull(entry.value());
- } else {
- Set<String> newDataNodes = fromBytes(entry.value());
+ verify(keyValueStorage, timeout(1000).times(4)).invoke(any());
- assertTrue(newDataNodes.containsAll(nodes));
- assertEquals(nodes.size(), newDataNodes.size());
- }
+ checkDataNodesOfZone(DEFAULT_ZONE_ID, nodes);
}
@Test
@@ -298,8 +289,6 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
distributionZoneManager.start();
- mockZones(mockZoneWithAutoAdjust());
-
mockVaultAppliedRevision(1);
long revision = 100;
@@ -310,15 +299,13 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
watchListenerOnUpdate(nodes, revision);
- verify(keyValueStorage, timeout(1000).times(1)).invoke(any());
+ verify(keyValueStorage, timeout(1000).times(2)).invoke(any());
- checkDataNodesOfZone(1, null);
+ checkDataNodesOfZone(DEFAULT_ZONE_ID, Collections.emptySet());
}
@Test
void testStaleVaultRevisionOnZoneManagerStart() {
- mockZones(mockZoneWithAutoAdjust());
-
long revision = 100;
keyValueStorage.put(zonesChangeTriggerKey().bytes(), longToBytes(revision));
@@ -338,8 +325,6 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
@Test
void testDataNodesUpdatedOnZoneManagerStart() {
- mockZones(mockZoneWithAutoAdjust());
-
mockVaultAppliedRevision(2);
Set<String> nodes = Set.of("node1", "node2");
@@ -350,7 +335,7 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
verify(keyValueStorage, timeout(1000).times(1)).invoke(any());
- checkDataNodesOfZone(1, nodes);
+ checkDataNodesOfZone(DEFAULT_ZONE_ID, nodes);
}
@Test
@@ -366,9 +351,24 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
verify(keyValueStorage, after(500).never()).invoke(any());
- Entry entry = keyValueStorage.get(zoneDataNodesKey(1).bytes());
+ assertNull(keyValueStorage.get(zoneDataNodesKey(DEFAULT_ZONE_ID).bytes()).value());
+ assertNull(keyValueStorage.get(zoneDataNodesKey(1).bytes()).value());
+ }
+
+ private void checkDataNodesOfZone(int zoneId, Set<String> nodes) {
+ Entry entry = keyValueStorage.get(zoneDataNodesKey(zoneId).bytes());
+
+ if (nodes == null) {
+ assertNull(entry.value(), () -> "Actual node list: " + fromBytes(entry.value()));
+ } else {
+ assertNotNull(entry);
+ assertNotNull(entry.value());
+
+ Set<String> newDataNodes = fromBytes(entry.value());
- assertNull(entry.value());
+ assertTrue(newDataNodes.containsAll(nodes));
+ assertEquals(nodes.size(), newDataNodes.size());
+ }
}
private void mockEmptyZonesList() {
@@ -401,7 +401,7 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
when(namedListView.namedListKeys()).thenReturn(names);
}
- private DistributionZoneConfiguration mockZone(
+ private DistributionZoneConfiguration mockZoneConfiguration(
Integer zoneId,
String name,
Integer dataNodesAutoAdjustTime,
@@ -433,8 +433,47 @@ public class DistributionZoneManagerWatchListenerTest extends IgniteAbstractTest
return distributionZoneConfiguration;
}
+ private DistributionZoneView mockZoneView(
+ Integer zoneId,
+ String name,
+ Integer dataNodesAutoAdjustTime,
+ Integer dataNodesAutoAdjustScaleUpTime,
+ Integer dataNodesAutoAdjustScaleDownTime
+ ) {
+ DistributionZoneView distributionZoneView = mock(DistributionZoneView.class);
+
+ when(distributionZoneView.name()).thenReturn(name);
+ when(distributionZoneView.zoneId()).thenReturn(zoneId);
+ when(distributionZoneView.dataNodesAutoAdjust()).thenReturn(dataNodesAutoAdjustTime);
+ when(distributionZoneView.dataNodesAutoAdjustScaleUp()).thenReturn(dataNodesAutoAdjustScaleUpTime);
+ when(distributionZoneView.dataNodesAutoAdjustScaleDown()).thenReturn(dataNodesAutoAdjustScaleDownTime);
+
+ return distributionZoneView;
+ }
+
private DistributionZoneConfiguration mockZoneWithAutoAdjust() {
- return mockZone(1, ZONE_NAME_1, 100, Integer.MAX_VALUE, Integer.MAX_VALUE);
+ return mockZoneConfiguration(1, ZONE_NAME_1, 100, Integer.MAX_VALUE, Integer.MAX_VALUE);
+ }
+
+ private DistributionZoneConfiguration mockDefaultZoneConfiguration() {
+ DistributionZoneConfiguration defaultZone = mockZoneConfiguration(DEFAULT_ZONE_ID, DEFAULT_ZONE_NAME, 100, Integer.MAX_VALUE,
+ Integer.MAX_VALUE);
+
+ when(zonesConfiguration.defaultDistributionZone()).thenReturn(defaultZone);
+
+ return defaultZone;
+ }
+
+ private DistributionZoneView mockDefaultZoneView() {
+ DistributionZoneView defaultZone = mockZoneView(DEFAULT_ZONE_ID, DEFAULT_ZONE_NAME, 100, Integer.MAX_VALUE,
+ Integer.MAX_VALUE);
+
+ DistributionZonesView zonesView = mock(DistributionZonesView.class);
+
+ when(zonesView.defaultDistributionZone()).thenReturn(defaultZone);
+ when(zonesConfiguration.value()).thenReturn(zonesView);
+
+ return defaultZone;
}
private void mockVaultZonesLogicalTopologyKey(Set<String> nodes) {