This is an automated email from the ASF dual-hosted git repository.

sergeychugunov 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 b84064e193 IGNITE-20914 Make ScaleCube's metadataTimeout configurable 
(#2875)
b84064e193 is described below

commit b84064e193ef0ec1ed0101b87cf443bd4e5d0dc1
Author: Roman Puchkovskiy <roman.puchkovs...@gmail.com>
AuthorDate: Mon Nov 27 12:44:10 2023 +0400

    IGNITE-20914 Make ScaleCube's metadataTimeout configurable (#2875)
    
    Signed-off-by: Sergey Chugunov <sergey.chugu...@gmail.com>
---
 .../testframework/TestIgnitionManager.java         | 49 ++++++++++++++++++----
 .../ScaleCubeConfigurationSchema.java              | 15 +++++++
 .../scalecube/ScaleCubeClusterServiceFactory.java  |  6 ++-
 3 files changed, 61 insertions(+), 9 deletions(-)

diff --git 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
index fd50c0550d..91dda231aa 100644
--- 
a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
+++ 
b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
@@ -17,12 +17,14 @@
 
 package org.apache.ignite.internal.testframework;
 
+import com.typesafe.config.ConfigException;
 import com.typesafe.config.parser.ConfigDocument;
 import com.typesafe.config.parser.ConfigDocumentFactory;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
+import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgnitionManager;
@@ -37,6 +39,8 @@ public class TestIgnitionManager {
     /** Default name of configuration file. */
     public static final String DEFAULT_CONFIG_NAME = "ignite-config.conf";
 
+    private static final int DEFAULT_SCALECUBE_METADATA_TIMEOUT = 10_000;
+
     /** Default DelayDuration in ms used for tests that is set on node init. */
     public static final int DEFAULT_DELAY_DURATION_MS = 100;
 
@@ -48,6 +52,8 @@ public class TestIgnitionManager {
     /**
      * Starts an Ignite node with an optional bootstrap configuration from an 
input stream with HOCON configs.
      *
+     * <p>Test defaults are mixed to the configuration (only if the 
corresponding config keys are not explicitly defined).
+     *
      * <p>When this method returns, the node is partially started and ready to 
accept the init command (that is, its
      * REST endpoint is functional).
      *
@@ -73,23 +79,50 @@ public class TestIgnitionManager {
      * @throws IgniteException If error occurs while reading node 
configuration.
      */
     public static CompletableFuture<Ignite> start(String nodeName, @Nullable 
String configStr, Path workDir) {
+        String enrichedConfig = enrichValidConfigWithTestDefaults(configStr);
+
         try {
             Files.createDirectories(workDir);
             Path configPath = workDir.resolve(DEFAULT_CONFIG_NAME);
             if (configStr == null) {
+                // Null config might mean that this is a restart, so we should 
not rewrite the existing config file.
                 if (Files.notExists(configPath)) {
                     Files.createFile(configPath);
                 }
             } else {
-                Files.writeString(configPath, configStr,
+                assert enrichedConfig != null;
+
+                Files.writeString(configPath, enrichedConfig,
                         StandardOpenOption.SYNC, StandardOpenOption.CREATE, 
StandardOpenOption.TRUNCATE_EXISTING);
             }
+
             return IgnitionManager.start(nodeName, configPath, workDir);
         } catch (IOException e) {
             throw new IgniteException("Couldn't write node config.", e);
         }
     }
 
+    private static @Nullable String 
enrichValidConfigWithTestDefaults(@Nullable String configStr) {
+        try {
+            return enrichConfigWithTestDefaults(configStr);
+        } catch (ConfigException e) {
+            // Config is invalid, let Ignite itself reject it in a predictable 
way.
+            return configStr;
+        }
+    }
+
+    private static String enrichConfigWithTestDefaults(@Nullable String 
configStr) {
+        ConfigDocument configDocument = parseNullableConfigString(configStr);
+
+        configDocument = applyTestDefault(
+                configDocument,
+                "network.membership.scaleCube.metadataTimeout",
+                Integer.toString(DEFAULT_SCALECUBE_METADATA_TIMEOUT)
+        );
+
+        return configDocument.render();
+    }
+
     /**
      * Initializes a cluster using test defaults for cluster configuration 
values that are not
      * specified explicitly.
@@ -108,13 +141,7 @@ public class TestIgnitionManager {
                 .metaStorageNodeNames(params.metaStorageNodeNames())
                 .cmgNodeNames(params.cmgNodeNames());
 
-        ConfigDocument configDocument;
-
-        if (params.clusterConfiguration() == null) {
-            configDocument = ConfigDocumentFactory.parseString("{}");
-        } else {
-            configDocument = 
ConfigDocumentFactory.parseString(params.clusterConfiguration());
-        }
+        ConfigDocument configDocument = 
parseNullableConfigString(params.clusterConfiguration());
 
         configDocument = applyTestDefault(
                 configDocument,
@@ -137,6 +164,12 @@ public class TestIgnitionManager {
         return builder.build();
     }
 
+    private static ConfigDocument parseNullableConfigString(@Nullable String 
configString) {
+        String configToParse = Objects.requireNonNullElse(configString, "{}");
+
+        return ConfigDocumentFactory.parseString(configToParse);
+    }
+
     private static ConfigDocument applyTestDefault(ConfigDocument document, 
String path, String value) {
         if (document.hasPath(path)) {
             return document;
diff --git 
a/modules/network/src/main/java/org/apache/ignite/internal/network/configuration/ScaleCubeConfigurationSchema.java
 
b/modules/network/src/main/java/org/apache/ignite/internal/network/configuration/ScaleCubeConfigurationSchema.java
index 2d10aafbe1..0f0c060044 100644
--- 
a/modules/network/src/main/java/org/apache/ignite/internal/network/configuration/ScaleCubeConfigurationSchema.java
+++ 
b/modules/network/src/main/java/org/apache/ignite/internal/network/configuration/ScaleCubeConfigurationSchema.java
@@ -45,4 +45,19 @@ public class ScaleCubeConfigurationSchema {
      */
     @Value(hasDefault = true)
     public final int gossipInterval = 200;
+
+    /**
+     * Gossip repeat multiplier.
+     *
+     * @see <a href="https://en.wikipedia.org/wiki/Gossip_protocol";>Gossip 
Protocol</a>
+     */
+    @Value(hasDefault = true)
+    public final int gossipRepeatMult = 3;
+
+    /**
+     * Metadata timeout (milliseconds). This is the timeout on metadata update 
operation (when one node requests metadata from
+     * another node).
+     */
+    @Value(hasDefault = true)
+    public final int metadataTimeout = 3_000;
 }
diff --git 
a/modules/network/src/main/java/org/apache/ignite/network/scalecube/ScaleCubeClusterServiceFactory.java
 
b/modules/network/src/main/java/org/apache/ignite/network/scalecube/ScaleCubeClusterServiceFactory.java
index ede2c9b20b..68e0de4097 100644
--- 
a/modules/network/src/main/java/org/apache/ignite/network/scalecube/ScaleCubeClusterServiceFactory.java
+++ 
b/modules/network/src/main/java/org/apache/ignite/network/scalecube/ScaleCubeClusterServiceFactory.java
@@ -241,7 +241,11 @@ public class ScaleCubeClusterServiceFactory {
                         opts.pingInterval(cfg.failurePingInterval())
                                 
.pingReqMembers(scaleCube.failurePingRequestMembers())
                 )
-                .gossip(opts -> 
opts.gossipInterval(scaleCube.gossipInterval()));
+                .gossip(opts ->
+                        opts.gossipInterval(scaleCube.gossipInterval())
+                                .gossipRepeatMult(scaleCube.gossipRepeatMult())
+                )
+                .metadataTimeout(scaleCube.metadataTimeout());
     }
 
     /**

Reply via email to