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

Reply via email to