You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2024/07/30 04:24:27 UTC
(james-project) 01/02: JAMES-3693 Fixup RedisConfiguration - parsing correct `redisURL` when multiple redis sentinel endpoint
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d5801b862d917ec50262a5a3a7127170bdc41fd2
Author: Tung Tran <vt...@linagora.com>
AuthorDate: Thu Jul 25 08:50:11 2024 +0700
JAMES-3693 Fixup RedisConfiguration - parsing correct `redisURL` when multiple redis sentinel endpoint
---
.../james/backends/redis/RedisConfiguration.scala | 17 +++++++++----
.../backends/redis/RedisConfigurationTest.scala | 28 ++++++++++++++++++++++
.../backends/redis/RedisSentinelExtension.java | 2 +-
3 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala b/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala
index 5764c6f79f..2057232df3 100644
--- a/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala
+++ b/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala
@@ -26,7 +26,7 @@ import eu.timepit.refined.collection.NonEmpty
import io.lettuce.core.{ReadFrom, RedisURI}
import org.apache.commons.configuration2.Configuration
import org.apache.james.backends.redis.RedisConfiguration.{CLUSTER_TOPOLOGY, MASTER_REPLICA_TOPOLOGY, STANDALONE_TOPOLOGY}
-import org.apache.james.backends.redis.RedisUris.RedisUris
+import org.apache.james.backends.redis.RedisUris.{REDIS_URL_PROPERTY_NAME, RedisUris}
import org.slf4j.{Logger, LoggerFactory}
object RedisConfiguration {
@@ -54,6 +54,7 @@ object RedisConfiguration {
}
object RedisUris {
+ val REDIS_URL_PROPERTY_NAME: String = "redisURL"
type RedisUrisConstraint = NonEmpty
type RedisUris = List[RedisURI] Refined RedisUrisConstraint
@@ -84,7 +85,7 @@ trait RedisConfiguration {
object StandaloneRedisConfiguration {
def from(config: Configuration): StandaloneRedisConfiguration = from(
- config.getString("redisURL"),
+ config.getString(REDIS_URL_PROPERTY_NAME),
RedisConfiguration.redisIoThreadsFrom(config),
RedisConfiguration.redisWorkerThreadsFrom(config))
@@ -104,11 +105,17 @@ case class StandaloneRedisConfiguration(redisURI: RedisURI, ioThreads: Option[In
}
object MasterReplicaRedisConfiguration {
- def from(config: Configuration): MasterReplicaRedisConfiguration =
- from(config.getStringArray("redisURL"),
+ def from(config: Configuration): MasterReplicaRedisConfiguration = {
+ val redisUris: Array[String] = config.getString(REDIS_URL_PROPERTY_NAME) match {
+ case rawValue if rawValue.startsWith("redis-sentinel:") => Array(config.getStringArray(REDIS_URL_PROPERTY_NAME).mkString(","))
+ case _ => config.getStringArray(REDIS_URL_PROPERTY_NAME)
+ }
+
+ from(redisUris,
Option(config.getString("redis.readFrom", null)).map(ReadFrom.valueOf).getOrElse(ReadFrom.MASTER),
RedisConfiguration.redisIoThreadsFrom(config),
RedisConfiguration.redisWorkerThreadsFrom(config))
+ }
def from(redisUris: Array[String],
readFrom: ReadFrom,
@@ -132,7 +139,7 @@ case class MasterReplicaRedisConfiguration(redisURI: RedisUris, readFrom: ReadFr
object ClusterRedisConfiguration {
def from(config: Configuration): ClusterRedisConfiguration =
- from(config.getStringArray("redisURL"),
+ from(config.getStringArray(REDIS_URL_PROPERTY_NAME),
RedisConfiguration.redisIoThreadsFrom(config),
RedisConfiguration.redisWorkerThreadsFrom(config))
diff --git a/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisConfigurationTest.scala b/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisConfigurationTest.scala
index 3a36c85169..75cb595324 100644
--- a/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisConfigurationTest.scala
+++ b/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisConfigurationTest.scala
@@ -88,4 +88,32 @@ class RedisConfigurationTest extends AnyFlatSpec with Matchers {
RedisConfiguration.from(config)
}
}
+
+ it should "parse redisURL when multiple sentinel endpoint" in {
+ val config = new PropertiesConfiguration()
+ config.setListDelimiterHandler(new DefaultListDelimiterHandler(','))
+ config.addProperty("redisURL", "redis-sentinel://secret1@redis-sentinel-1:26379,redis-sentinel-2:26379,redis-sentinel-3:26379?sentinelMasterId=mymaster")
+ config.addProperty("redis.topology", "master-replica")
+
+ val redisConfig: RedisConfiguration = RedisConfiguration.from(config)
+ redisConfig.isInstanceOf[MasterReplicaRedisConfiguration] shouldEqual (true)
+ val redisMasterReplicaRedisConfiguration = redisConfig.asInstanceOf[MasterReplicaRedisConfiguration]
+
+ redisMasterReplicaRedisConfiguration.redisURI.value.size shouldEqual 1
+ redisMasterReplicaRedisConfiguration.redisURI.value.head.toString shouldEqual "redis-sentinel://*******@redis-sentinel-1,redis-sentinel-2,redis-sentinel-3?sentinelMasterId=mymaster"
+ }
+
+ it should "parse redisURL when single sentinel endpoint" in {
+ val config = new PropertiesConfiguration()
+ config.setListDelimiterHandler(new DefaultListDelimiterHandler(','))
+ config.addProperty("redisURL", "redis-sentinel://secret1@redis-sentinel-1:26379?sentinelMasterId=mymaster")
+ config.addProperty("redis.topology", "master-replica")
+
+ val redisConfig: RedisConfiguration = RedisConfiguration.from(config)
+ redisConfig.isInstanceOf[MasterReplicaRedisConfiguration] shouldEqual (true)
+ val redisMasterReplicaRedisConfiguration = redisConfig.asInstanceOf[MasterReplicaRedisConfiguration]
+
+ redisMasterReplicaRedisConfiguration.redisURI.value.size shouldEqual 1
+ redisMasterReplicaRedisConfiguration.redisURI.value.head.toString shouldEqual "redis-sentinel://*******@redis-sentinel-1?sentinelMasterId=mymaster"
+ }
}
\ No newline at end of file
diff --git a/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisSentinelExtension.java b/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisSentinelExtension.java
index 43cbb6fe4f..cfaf4a02d7 100644
--- a/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisSentinelExtension.java
+++ b/backends-common/redis/src/test/java/org/apache/james/backends/redis/RedisSentinelExtension.java
@@ -83,7 +83,7 @@ public class RedisSentinelExtension implements GuiceModuleTestExtension {
}
public MasterReplicaRedisConfiguration getRedisConfiguration() {
- return MasterReplicaRedisConfiguration.from(ImmutableList.of(createRedisSentinelURI(this.stream().toList().subList(0,1)))
+ return MasterReplicaRedisConfiguration.from(ImmutableList.of(createRedisSentinelURI(this))
.toArray(String[]::new),
ReadFrom.MASTER,
OptionConverters.toScala(Optional.empty()),
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org