From 9b6395d9550de0507d0cedb1b7feb6bfa2abedf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Andr=C3=A9?= <117994893+luiscga@users.noreply.github.com> Date: Sat, 16 Aug 2025 19:41:53 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20feat:=20Configurable=20Redis=20C?= =?UTF-8?q?luster=20Mode=20with=20Single=20URI=20Support=20(#9039)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat: Add support for enabling Redis cluster configuration * ✨ feat: Enhance Redis client initialization to support cluster configuration without multiple URIs * ✨ feat: Add tests for USE_REDIS_CLUSTER configuration and validation * 🐞 fix: Remove unnecessary blank line in cacheConfig tests --- api/cache/cacheConfig.js | 3 ++- api/cache/cacheConfig.spec.js | 33 +++++++++++++++++++++++++++++++++ api/cache/redisClients.js | 4 ++-- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/api/cache/cacheConfig.js b/api/cache/cacheConfig.js index 1ca3e902e7..79cba9fc54 100644 --- a/api/cache/cacheConfig.js +++ b/api/cache/cacheConfig.js @@ -52,7 +52,8 @@ const cacheConfig = { REDIS_CONNECT_TIMEOUT: math(process.env.REDIS_CONNECT_TIMEOUT, 10000), /** Queue commands when disconnected */ REDIS_ENABLE_OFFLINE_QUEUE: isEnabled(process.env.REDIS_ENABLE_OFFLINE_QUEUE ?? 'true'), - + /** Enable redis cluster without the need of multiple URIs */ + USE_REDIS_CLUSTER: isEnabled(process.env.USE_REDIS_CLUSTER ?? 'false'), CI: isEnabled(process.env.CI), DEBUG_MEMORY_CACHE: isEnabled(process.env.DEBUG_MEMORY_CACHE), diff --git a/api/cache/cacheConfig.spec.js b/api/cache/cacheConfig.spec.js index 7d4078a840..dcaaaa067f 100644 --- a/api/cache/cacheConfig.spec.js +++ b/api/cache/cacheConfig.spec.js @@ -14,6 +14,7 @@ describe('cacheConfig', () => { delete process.env.REDIS_KEY_PREFIX_VAR; delete process.env.REDIS_KEY_PREFIX; delete process.env.USE_REDIS; + delete process.env.USE_REDIS_CLUSTER; delete process.env.REDIS_PING_INTERVAL; delete process.env.FORCED_IN_MEMORY_CACHE_NAMESPACES; @@ -101,6 +102,38 @@ describe('cacheConfig', () => { }); }); + describe('USE_REDIS_CLUSTER configuration', () => { + test('should default to false when USE_REDIS_CLUSTER is not set', () => { + const { cacheConfig } = require('./cacheConfig'); + expect(cacheConfig.USE_REDIS_CLUSTER).toBe(false); + }); + + test('should be false when USE_REDIS_CLUSTER is set to false', () => { + process.env.USE_REDIS_CLUSTER = 'false'; + + const { cacheConfig } = require('./cacheConfig'); + expect(cacheConfig.USE_REDIS_CLUSTER).toBe(false); + }); + + test('should be true when USE_REDIS_CLUSTER is set to true', () => { + process.env.USE_REDIS_CLUSTER = 'true'; + + const { cacheConfig } = require('./cacheConfig'); + expect(cacheConfig.USE_REDIS_CLUSTER).toBe(true); + }); + + test('should work with USE_REDIS enabled and REDIS_URI set', () => { + process.env.USE_REDIS_CLUSTER = 'true'; + process.env.USE_REDIS = 'true'; + process.env.REDIS_URI = 'redis://localhost:6379'; + + const { cacheConfig } = require('./cacheConfig'); + expect(cacheConfig.USE_REDIS_CLUSTER).toBe(true); + expect(cacheConfig.USE_REDIS).toBe(true); + expect(cacheConfig.REDIS_URI).toBe('redis://localhost:6379'); + }); + }); + describe('REDIS_CA file reading', () => { test('should be null when REDIS_CA is not set', () => { const { cacheConfig } = require('./cacheConfig'); diff --git a/api/cache/redisClients.js b/api/cache/redisClients.js index b6a89cdaa5..83af0c38e3 100644 --- a/api/cache/redisClients.js +++ b/api/cache/redisClients.js @@ -48,7 +48,7 @@ if (cacheConfig.USE_REDIS) { }; ioredisClient = - urls.length === 1 + urls.length === 1 && !cacheConfig.USE_REDIS_CLUSTER ? new IoRedis(cacheConfig.REDIS_URI, redisOptions) : new IoRedis.Cluster( urls.map((url) => ({ host: url.hostname, port: parseInt(url.port, 10) || 6379 })), @@ -148,7 +148,7 @@ if (cacheConfig.USE_REDIS) { }; keyvRedisClient = - urls.length === 1 + urls.length === 1 && !cacheConfig.USE_REDIS_CLUSTER ? createClient({ url: cacheConfig.REDIS_URI, ...redisOptions }) : createCluster({ rootNodes: urls.map((url) => ({ url: url.href })),