11import mongoose from "mongoose"
2+ const { default : cacheService } = await import ( "../services/cacheService.js" ) ;
3+ const { warmupLeaderboardCache } = await import ( "../utils/leaderBoardCache.js" ) ;
24
35const connectDB = async ( ) => {
46 try {
@@ -16,16 +18,25 @@ const connectDB = async () => {
1618 mongoose . connection . on ( 'error' , ( error ) => {
1719 console . error ( 'Database connection error:' , error . message ) ;
1820 } ) ;
19-
20- // Warmup leaderboard cache after DB is ready (with delay for Redis connection)
21- setTimeout ( async ( ) => {
22- try {
23- const { warmupLeaderboardCache } = await import ( "../utils/leaderBoardCache.js" ) ;
24- warmupLeaderboardCache ( ) ;
25- } catch ( error ) {
26- console . error ( 'Failed to warmup leaderboard cache:' , error . message ) ;
21+
22+ async function waitForRedisAndWarmup ( attempt = 1 ) {
23+ const maxAttempts = 5 ;
24+ const delay = Math . min ( 1000 * Math . pow ( 2 , attempt - 1 ) , 10000 ) ; // exponential backoff, max 10s
25+
26+ if ( cacheService . isRedisConnected ( ) ) {
27+ try {
28+ await warmupLeaderboardCache ( ) ;
29+ } catch ( error ) {
30+ console . error ( 'Failed to warmup leaderboard cache:' , error . message ) ;
31+ }
32+ } else if ( attempt < maxAttempts ) {
33+ setTimeout ( ( ) => waitForRedisAndWarmup ( attempt + 1 ) , delay ) ;
34+ } else {
35+ console . error ( 'Redis was not ready after maximum attempts. Skipping leaderboard cache warmup.' ) ;
2736 }
28- } , 2000 ) ; // 2 second delay
37+ }
38+
39+ waitForRedisAndWarmup ( ) ;
2940
3041 } catch ( error ) {
3142 console . error ( 'Database connection failed:' , error . message ) ;
0 commit comments