This is an automated email from the ASF dual-hosted git repository.
ibessonov 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 58b89bc57f IGNITE-18908: Fixed configuration revision handling in case
of empty updates and local node recovery (#1722)
58b89bc57f is described below
commit 58b89bc57f57bab8ef0892c9c6cb67785da12617
Author: Ivan Gagarkin <[email protected]>
AuthorDate: Tue Feb 28 18:50:13 2023 +0400
IGNITE-18908: Fixed configuration revision handling in case of empty
updates and local node recovery (#1722)
---
.../configuration/ConfigurationChanger.java | 26 +++++++++-------------
.../notifications/ConfigurationListenerTest.java | 16 +++++++++++++
.../runner/app/ItIgniteNodeRestartTest.java | 20 +++++++++++++++++
.../storage/DistributedConfigurationStorage.java | 2 +-
4 files changed, 47 insertions(+), 17 deletions(-)
diff --git
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
index fca871f5dc..6a161ee804 100644
---
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
+++
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
@@ -634,22 +634,16 @@ public abstract class ConfigurationChanger implements
DynamicConfigurationChange
// Save revisions for recovery.
return storage.writeConfigurationRevision(oldStorageRoots.version,
storageRoots.version)
.thenCompose(unused -> {
- if (dataValuesPrefixMap.isEmpty()) {
- oldStorageRoots.changeFuture.complete(null);
-
- return CompletableFuture.completedFuture(null);
- } else {
- long notificationNumber =
notificationListenerCnt.incrementAndGet();
-
- return notificator.notify(oldSuperRoot, newSuperRoot,
newChangeId, notificationNumber)
- .whenComplete((v, t) -> {
- if (t == null) {
-
oldStorageRoots.changeFuture.complete(null);
- } else {
-
oldStorageRoots.changeFuture.completeExceptionally(t);
- }
- });
- }
+ long notificationNumber =
notificationListenerCnt.incrementAndGet();
+
+ return notificator.notify(oldSuperRoot, newSuperRoot,
newChangeId, notificationNumber)
+ .whenComplete((v, t) -> {
+ if (t == null) {
+
oldStorageRoots.changeFuture.complete(null);
+ } else {
+
oldStorageRoots.changeFuture.completeExceptionally(t);
+ }
+ });
});
}
diff --git
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
index d75f5ed1d1..6101732fad 100644
---
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
+++
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
@@ -1609,6 +1609,22 @@ public class ConfigurationListenerTest {
assertEquals(notificationCount + 2, registry.notificationCount());
}
+ @Test
+ void testGenerateNotificationWhenUpdateWithCurrentValue() throws Exception
{
+ long notificationCount = registry.notificationCount();
+
+ assertTrue(notificationCount >= 0);
+
+ String currentValue = config.child().str().value();
+ config.child().str().update(currentValue).get(1, SECONDS);
+
+ assertEquals(notificationCount + 1, registry.notificationCount());
+
+ registry.notifyCurrentConfigurationListeners().get(1, SECONDS);
+
+ assertEquals(notificationCount + 2, registry.notificationCount());
+ }
+
@Test
void testNotifyListenersOnNextUpdateConfiguration() throws Exception {
List<String> events = new ArrayList<>();
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index 340052a38a..ed9c349a38 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -89,6 +89,7 @@ import
org.apache.ignite.internal.schema.configuration.TablesConfiguration;
import org.apache.ignite.internal.storage.DataStorageManager;
import org.apache.ignite.internal.storage.DataStorageModule;
import org.apache.ignite.internal.storage.DataStorageModules;
+import
org.apache.ignite.internal.storage.rocksdb.configuration.schema.RocksDbStorageEngineConfiguration;
import org.apache.ignite.internal.table.TableImpl;
import org.apache.ignite.internal.table.distributed.TableManager;
import org.apache.ignite.internal.table.distributed.TableMessageGroup;
@@ -974,6 +975,25 @@ public class ItIgniteNodeRestartTest extends
IgniteAbstractTest {
checkTableWithData(newNode, "t2");
}
+ /**
+ * The test for updating cluster configuration with the default value.
+ * Check that new nodes will be able to synchronize the local cluster
configuration.
+ */
+ @Test
+ public void updateClusterCfgWithDefaultValue() {
+ IgniteImpl ignite = startNode(0);
+
+ RocksDbStorageEngineConfiguration dbStorageEngineConfiguration =
ignite.clusterConfiguration()
+ .getConfiguration(RocksDbStorageEngineConfiguration.KEY);
+ int defaultValue =
dbStorageEngineConfiguration.flushDelayMillis().value();
+ CompletableFuture<Void> update =
dbStorageEngineConfiguration.flushDelayMillis().update(defaultValue);
+ assertThat(update, willCompleteSuccessfully());
+
+ stopNode(0);
+
+ startNodes(3);
+ }
+
/**
* Checks the table exists and validates all data in it.
*
diff --git
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
index 6b0d4f2570..006c5729b7 100644
---
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
+++
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
@@ -264,7 +264,7 @@ public class DistributedConfigurationStorage implements
ConfigurationStorage {
assert data.isEmpty() || cfgRevision > 0;
- changeId.set(data.isEmpty() ? 0 : cfgRevision);
+ changeId.set(cfgRevision);
return new Data(data, cfgRevision);
}