You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by st...@apache.org on 2022/10/27 14:30:08 UTC

[sling-org-apache-sling-discovery-oak] branch master updated: SLING-11619 : safeguard int/long configs

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

stefanegli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-oak.git


The following commit(s) were added to refs/heads/master by this push:
     new d737409  SLING-11619 : safeguard int/long configs
d737409 is described below

commit d737409babab4c816ac39bfd2716d3566e2557db
Author: stefan-egli <st...@apache.org>
AuthorDate: Thu Oct 27 16:30:03 2022 +0200

    SLING-11619 : safeguard int/long configs
    
    * SLING-11619 : safeguard backoff factors config
    
    * SLING-11619 : fix code smells
    
    * SLING-11619 : guarding all ints and longs
---
 .../org/apache/sling/discovery/oak/Config.java     | 44 +++++++---
 .../org/apache/sling/discovery/oak/ConfigTest.java | 99 ++++++++++++++++++++++
 2 files changed, 131 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/apache/sling/discovery/oak/Config.java b/src/main/java/org/apache/sling/discovery/oak/Config.java
index d596311..a00994d 100644
--- a/src/main/java/org/apache/sling/discovery/oak/Config.java
+++ b/src/main/java/org/apache/sling/discovery/oak/Config.java
@@ -22,6 +22,8 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.function.ToIntFunction;
+import java.util.function.ToLongFunction;
 
 import org.apache.sling.discovery.base.connectors.BaseConfig;
 import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteConfig;
@@ -160,28 +162,28 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
     }
 
     protected void configure(final DiscoveryServiceCentralConfig config) {
-        this.connectorPingTimeout = config.connectorPingTimeout();
+        this.connectorPingTimeout = guardLong(c -> config.connectorPingTimeout(), "connectorPingTimeout", DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT);
         logger.debug("configure: connectorPingTimeout='{}'", this.connectorPingTimeout);
 
-        this.connectorPingInterval = config.connectorPingInterval();
+        this.connectorPingInterval = guardLong(c -> config.connectorPingInterval(), "connectorPingInterval", DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL);
         logger.debug("configure: connectorPingInterval='{}'", this.connectorPingInterval);
 
-        this.discoveryLiteCheckInterval = config.discoveryLiteCheckInterval();
+        this.discoveryLiteCheckInterval = guardLong(c -> config.discoveryLiteCheckInterval(), "discoveryLiteCheckInterval", DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL);
         logger.debug("configure: discoveryLiteCheckInterval='{}'", this.discoveryLiteCheckInterval);
 
-        this.clusterSyncServiceTimeout = config.clusterSyncServiceTimeout();
+        this.clusterSyncServiceTimeout = guardLong(c -> config.clusterSyncServiceTimeout(), "clusterSyncServiceTimeout", DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT);
         logger.debug("configure: clusterSyncServiceTimeout='{}'", this.clusterSyncServiceTimeout);
 
-        this.clusterSyncServiceInterval = config.clusterSyncServiceInterval();
+        this.clusterSyncServiceInterval = guardLong(c -> config.clusterSyncServiceInterval(), "clusterSyncServiceInterval", DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL);
         logger.debug("configure: clusterSyncServiceInterval='{}'", this.clusterSyncServiceInterval);
 
-        this.minEventDelay = config.minEventDelay();
+        this.minEventDelay = guardInt(c -> config.minEventDelay(), "minEventDelay", DEFAULT_MIN_EVENT_DELAY);
         logger.debug("configure: minEventDelay='{}'", this.minEventDelay);
 
-        this.socketConnectTimeout = config.socketConnectTimeout();
+        this.socketConnectTimeout = guardInt(c -> config.socketConnectTimeout(), "socketConnectTimeout", DEFAULT_SOCKET_CONNECT_TIMEOUT);
         logger.debug("configure: socketConnectTimeout='{}'", this.socketConnectTimeout);
 
-        this.soTimeout = config.soTimeout();
+        this.soTimeout = guardInt(c -> config.soTimeout(), "soTimeout", DEFAULT_SO_TIMEOUT);
         logger.debug("configure: soTimeout='{}'", this.soTimeout);
 
         String[] topologyConnectorUrlsStr = config.topologyConnectorUrls();
@@ -235,8 +237,8 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
         sharedKey = config.sharedKey();
         keyInterval = config.hmacSharedKeyTTL();
 
-        backoffStandbyFactor = config.backoffStandbyFactor();
-        backoffStableFactor = config.backoffStableFactor();
+        backoffStandbyFactor = guardInt(c -> config.backoffStandbyFactor(), "backoffStandbyFactor", DEFAULT_BACKOFF_STANDBY_FACTOR);
+        backoffStableFactor = guardInt(c -> config.backoffStableFactor(), "backoffStableFactor", DEFAULT_BACKOFF_STABLE_FACTOR);
 
         this.invertLeaderElectionPrefixOrder = config.invertLeaderElectionPrefixOrder();
         logger.debug("configure: invertLeaderElectionPrefixOrder='{}'", this.invertLeaderElectionPrefixOrder);
@@ -247,13 +249,31 @@ public class Config implements BaseConfig, DiscoveryLiteConfig {
         this.suppressPartiallyStartedInstance = config.suppressPartiallyStartedInstance();
         logger.debug("configure: suppressPartiallyStartedInstance='{}'", this.suppressPartiallyStartedInstance);
 
-        this.suppressionTimeoutSeconds = config.suppressionTimeoutSeconds();
+        this.suppressionTimeoutSeconds = guardLong(c -> config.suppressionTimeoutSeconds(), "suppressionTimeoutSeconds", DEFAULT_SUPPRESSION_TIMEOUT_SECONDS);
         logger.debug("configure: suppressionTimeoutSeconds='{}'", this.suppressionTimeoutSeconds);
 
-        this.joinerDelaySeconds = config.joinerDelaySeconds();
+        this.joinerDelaySeconds = guardLong(c -> config.joinerDelaySeconds(), "joinerDelaySeconds", DEFAULT_JOINER_DELAY_SECONDS);
         logger.debug("configure: joinerDelaySeconds='{}'", this.joinerDelaySeconds);
     }
 
+    private Integer guardInt(ToIntFunction<Void> injectedConfig, String key, int def) {
+        try {
+            return injectedConfig.applyAsInt(null);
+        } catch(RuntimeException re) {
+            logger.info("configure: got RuntimeException for {} , using default: {}", key, re.getMessage());
+            return def;
+        }
+    }
+
+    private Long guardLong(ToLongFunction<Void> injectedConfig, String key, long def) {
+        try {
+            return injectedConfig.applyAsLong(null);
+        } catch(RuntimeException re) {
+            logger.info("configure: got RuntimeException for {} , using default: {}", key, re.getMessage());
+            return def;
+        }
+    }
+
     /**
      * Returns the socket connect() timeout used by the topology connector, 0 disables the timeout
      *
diff --git a/src/test/java/org/apache/sling/discovery/oak/ConfigTest.java b/src/test/java/org/apache/sling/discovery/oak/ConfigTest.java
index eb28a1b..f3f1d39 100644
--- a/src/test/java/org/apache/sling/discovery/oak/ConfigTest.java
+++ b/src/test/java/org/apache/sling/discovery/oak/ConfigTest.java
@@ -26,6 +26,19 @@ import org.junit.Test;
 import java.util.Dictionary;
 import java.util.Hashtable;
 
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_BACKOFF_STANDBY_FACTOR;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_BACKOFF_STABLE_FACTOR;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_MIN_EVENT_DELAY;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SOCKET_CONNECT_TIMEOUT;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SO_TIMEOUT;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_SUPPRESSION_TIMEOUT_SECONDS;
+import static org.apache.sling.discovery.oak.DiscoveryServiceCentralConfig.DEFAULT_JOINER_DELAY_SECONDS;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 public class ConfigTest {
@@ -46,4 +59,90 @@ public class ConfigTest {
     public void testIfServiceActive() {
         assertNotNull(config);
     }
+
+    @Test
+    public void testEmptyValues() {
+        Dictionary<String, Object> properties = new Hashtable<>();
+        properties.put("backoffStandbyFactor", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_BACKOFF_STANDBY_FACTOR, config.getBackoffStandbyFactor());
+        properties = new Hashtable<>();
+        properties.put("backoffStandbyFactor", "4");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(4, config.getBackoffStandbyFactor());
+        properties = new Hashtable<>();
+        properties.put("backoffStableFactor", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_BACKOFF_STABLE_FACTOR, config.getBackoffStandbyFactor());
+
+        properties.put("connectorPingTimeout", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_TOPOLOGY_CONNECTOR_TIMEOUT, config.getConnectorPingTimeout());
+        properties.put("connectorPingTimeout", "2");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(2, config.getConnectorPingTimeout());
+
+        properties.put("connectorPingInterval", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_TOPOLOGY_CONNECTOR_INTERVAL, config.getConnectorPingInterval());
+        properties.put("connectorPingInterval", "6");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(6, config.getConnectorPingInterval());
+
+        properties.put("discoveryLiteCheckInterval", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL, config.getDiscoveryLiteCheckInterval());
+        properties.put("discoveryLiteCheckInterval", "11");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(11, config.getDiscoveryLiteCheckInterval());
+
+        properties.put("clusterSyncServiceTimeout", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_CLUSTER_SYNC_SERVICE_TIMEOUT * 1000, config.getClusterSyncServiceTimeoutMillis());
+        properties.put("clusterSyncServiceTimeout", "12");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(12 * 1000, config.getClusterSyncServiceTimeoutMillis());
+
+        properties.put("clusterSyncServiceInterval", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_CLUSTER_SYNC_SERVICE_INTERVAL * 1000, config.getClusterSyncServiceIntervalMillis());
+        properties.put("clusterSyncServiceInterval", "13");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(13 * 1000, config.getClusterSyncServiceIntervalMillis());
+
+        properties.put("minEventDelay", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_MIN_EVENT_DELAY, config.getMinEventDelay());
+        properties.put("minEventDelay", "14");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(14, config.getMinEventDelay());
+
+        properties.put("socketConnectTimeout", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_SOCKET_CONNECT_TIMEOUT, config.getSocketConnectTimeout());
+        properties.put("socketConnectTimeout", "14");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(14, config.getSocketConnectTimeout());
+
+        properties.put("soTimeout", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_SO_TIMEOUT, config.getSoTimeout());
+        properties.put("soTimeout", "15");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(15, config.getSoTimeout());
+
+        properties.put("suppressionTimeoutSeconds", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_SUPPRESSION_TIMEOUT_SECONDS, config.getSuppressionTimeoutSeconds());
+        properties.put("suppressionTimeoutSeconds", "16");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(16, config.getSuppressionTimeoutSeconds());
+
+        properties.put("joinerDelaySeconds", "");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(DEFAULT_JOINER_DELAY_SECONDS * 1000, config.getJoinerDelayMillis());
+        properties.put("joinerDelaySeconds", "17");
+        config = context.registerInjectActivateService(new Config(), properties);
+        assertEquals(17 * 1000, config.getJoinerDelayMillis());
+    }
 }
\ No newline at end of file