merge: fix race conditions in check_connect.js (!715)

View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/715

Approved-by: Marie <github@yuugi.dev>
Approved-by: dakkar <dakkar@thenautilus.net>
This commit is contained in:
dakkar 2024-10-27 12:05:48 +00:00
commit d72c40d157

View File

@ -12,27 +12,49 @@ const config = loadConfig();
// createPostgresDataSource handels primaries and replicas automatically. // createPostgresDataSource handels primaries and replicas automatically.
// usually, it only opens connections first use, so we force it using // usually, it only opens connections first use, so we force it using
// .initialize() // .initialize()
createPostgresDataSource(config) async function connectToPostgres(){
.initialize() const source = createPostgresDataSource(config);
.then(c => { c.destroy() }) await source.initialize();
.catch(e => { throw e }); await source.destroy();
}
// Connect to all redis servers // Connect to all redis servers
function connectToRedis(redisOptions) { async function connectToRedis(redisOptions) {
const redis = new Redis(redisOptions); return await new Promise(async (resolve, reject) => {
redis.on('connect', () => redis.disconnect()); const redis = new Redis({
redis.on('error', (e) => { ...redisOptions,
throw e; 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. // 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. // so we use a Set to only try connecting once to each **uniq** redis.
(new Set([ const promises = Array
config.redis, .from(new Set([
config.redisForPubsub, config.redis,
config.redisForJobQueue, config.redisForPubsub,
config.redisForTimelines, config.redisForJobQueue,
config.redisForReactions, config.redisForTimelines,
])).forEach(connectToRedis); config.redisForReactions,
]))
.map(connectToRedis)
.concat([
connectToPostgres()
]);
await Promise.allSettled(promises);