diff --git a/src/module.c b/src/module.c index 15ab927cb..647272b59 100644 --- a/src/module.c +++ b/src/module.c @@ -5469,8 +5469,11 @@ int moduleTimerHandler(struct aeEventLoop *eventLoop, long long id, void *client } else { /* We call ustime() again instead of using the cached 'now' so that * 'next_period' isn't affected by the time it took to execute - * previous calls to 'callback. */ - next_period = (expiretime-ustime())/1000; /* Scale to milliseconds. */ + * previous calls to 'callback. + * We need to cast 'expiretime' so that the compiler will not treat + * the difference as unsigned (Causing next_period to be huge) in + * case expiretime < ustime() */ + next_period = ((long long)expiretime-ustime())/1000; /* Scale to milliseconds. */ break; } } @@ -5519,7 +5522,8 @@ RedisModuleTimerID RM_CreateTimer(RedisModuleCtx *ctx, mstime_t period, RedisMod /* We need to install the main event loop timer if it's not already * installed, or we may need to refresh its period if we just installed - * a timer that will expire sooner than any other else. */ + * a timer that will expire sooner than any other else (i.e. the timer + * we just installed is the first timer in the Timers rax). */ if (aeTimer != -1) { raxIterator ri; raxStart(&ri,Timers);