🐛 fix: Redis Cluster Bug + 🧪 Enhance Test Coverage (#10518)
Some checks are pending
Docker Dev Branch Images Build / build (Dockerfile, lc-dev, node) (push) Waiting to run
Docker Dev Branch Images Build / build (Dockerfile.multi, lc-dev-api, api-build) (push) Waiting to run

*  feat: Implement scanIterator method for Redis cluster client
This resolves the bug where `ServerConfigsCacheRedis#getAll` returns an empty object when a Redis Cluster (instead of a single node server is used)

*  feat: Update cache integration tests for Redis cluster support
This commit is contained in:
Theo N. Truong 2025-11-16 09:58:52 -07:00 committed by GitHub
parent f228f2a91d
commit 8c531b921e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 81 additions and 134 deletions

View file

@ -121,8 +121,8 @@ describe('MCPServersInitializer Redis Integration Tests', () => {
// Ensure Redis is connected
if (!keyvRedisClient) throw new Error('Redis client is not initialized');
// Wait for Redis to be ready
if (!keyvRedisClient.isOpen) await keyvRedisClient.connect();
// Wait for connection and topology discovery to complete
await redisClients.keyvRedisClientReady;
// Become leader so we can perform write operations
leaderInstance = new LeaderElection();

View file

@ -50,8 +50,8 @@ describe('MCPServersRegistry Redis Integration Tests', () => {
// Ensure Redis is connected
if (!keyvRedisClient) throw new Error('Redis client is not initialized');
// Wait for Redis to be ready
if (!keyvRedisClient.isOpen) await keyvRedisClient.connect();
// Wait for connection and topology discovery to complete
await redisClients.keyvRedisClientReady;
// Become leader so we can perform write operations
leaderInstance = new LeaderElection();

View file

@ -73,6 +73,8 @@ export class ServerConfigsCacheRedis extends BaseRegistryCache {
entries.push([keyName, value as ParsedServerConfig]);
}
}
} else {
throw new Error('Redis client with scanIterator not available.');
}
return fromPairs(entries);

View file

@ -25,8 +25,8 @@ describe('RegistryStatusCache Integration Tests', () => {
// Ensure Redis is connected
if (!keyvRedisClient) throw new Error('Redis client is not initialized');
// Wait for Redis to be ready
if (!keyvRedisClient.isOpen) await keyvRedisClient.connect();
// Wait for connection and topology discovery to complete
await redisClients.keyvRedisClientReady;
// Become leader so we can perform write operations
leaderInstance = new LeaderElection();

View file

@ -31,7 +31,10 @@ describe('ServerConfigsCacheRedis Integration Tests', () => {
beforeAll(async () => {
// Set up environment variables for Redis (only if not already set)
process.env.USE_REDIS = process.env.USE_REDIS ?? 'true';
process.env.REDIS_URI = process.env.REDIS_URI ?? 'redis://127.0.0.1:6379';
process.env.USE_REDIS_CLUSTER = process.env.USE_REDIS_CLUSTER ?? 'true';
process.env.REDIS_URI =
process.env.REDIS_URI ??
'redis://127.0.0.1:7001,redis://127.0.0.1:7002,redis://127.0.0.1:7003';
process.env.REDIS_KEY_PREFIX =
process.env.REDIS_KEY_PREFIX ?? 'ServerConfigsCacheRedis-IntegrationTest';
@ -49,8 +52,8 @@ describe('ServerConfigsCacheRedis Integration Tests', () => {
// Ensure Redis is connected
if (!keyvRedisClient) throw new Error('Redis client is not initialized');
// Wait for Redis to be ready
if (!keyvRedisClient.isOpen) await keyvRedisClient.connect();
// Wait for connection and topology discovery to complete
await redisClients.keyvRedisClientReady;
// Clear any existing leader key to ensure clean state
await keyvRedisClient.del(LeaderElection.LEADER_KEY);