From 524ddb96770690455b82522104a543c5b0b1f3b3 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sat, 26 Oct 2024 08:57:26 -0400 Subject: [PATCH] fix race conditions in check_connect.js --- packages/backend/scripts/check_connect.js | 56 ++++++++++++++++------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/packages/backend/scripts/check_connect.js b/packages/backend/scripts/check_connect.js index 47be1c90d4..f33a450325 100644 --- a/packages/backend/scripts/check_connect.js +++ b/packages/backend/scripts/check_connect.js @@ -12,27 +12,49 @@ const config = loadConfig(); // createPostgresDataSource handels primaries and replicas automatically. // usually, it only opens connections first use, so we force it using // .initialize() -createPostgresDataSource(config) - .initialize() - .then(c => { c.destroy() }) - .catch(e => { throw e }); - +async function connectToPostgres(){ + const source = createPostgresDataSource(config); + await source.initialize(); + await source.destroy(); +} // Connect to all redis servers -function connectToRedis(redisOptions) { - const redis = new Redis(redisOptions); - redis.on('connect', () => redis.disconnect()); - redis.on('error', (e) => { - throw e; +async function connectToRedis(redisOptions) { + return await new Promise(async (resolve, reject) => { + const redis = new Redis({ + ...redisOptions, + lazyConnect: true, + reconnectOnError: false, + showFriendlyErrorStack: true, + }); + redis.on('error', e => reject(e)); + + try { + await redis.connect(); + resolve(); + + } catch (e) { + reject(e); + + } finally { + redis.disconnect(false); + } }); } // If not all of these are defined, the default one gets reused. // so we use a Set to only try connecting once to each **uniq** redis. -(new Set([ - config.redis, - config.redisForPubsub, - config.redisForJobQueue, - config.redisForTimelines, - config.redisForReactions, -])).forEach(connectToRedis); +const promises = Array + .from(new Set([ + config.redis, + config.redisForPubsub, + config.redisForJobQueue, + config.redisForTimelines, + config.redisForReactions, + ])) + .map(connectToRedis) + .concat([ + connectToPostgres() + ]); + +await Promise.allSettled(promises);