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