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