X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/81f32c7b65c72a45fe1637ab0a661b144c54eb7c..f3e159bc931e8417df0ec432b8760bacc163530e:/src/redis.c diff --git a/src/redis.c b/src/redis.c index 39de86af..958827f7 100644 --- a/src/redis.c +++ b/src/redis.c @@ -599,7 +599,7 @@ void activeExpireCycle(void) { } void updateLRUClock(void) { - server.lruclock = (time(NULL)/REDIS_LRU_CLOCK_RESOLUTION) & + server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) & REDIS_LRU_CLOCK_MAX; } @@ -713,6 +713,10 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { REDIS_NOTUSED(id); REDIS_NOTUSED(clientData); + /* Software watchdog: deliver the SIGALRM that will reach the signal + * handler if we don't return here fast enough. */ + if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period); + /* We take a cached value of the unix time in the global state because * with virtual memory and aging there is to store the current time * in objects at every object access, and accuracy is not needed. @@ -808,15 +812,13 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { updateDictResizePolicy(); } } else { - time_t now = time(NULL); - /* If there is not a background saving/rewrite in progress check if * we have to save/rewrite now */ for (j = 0; j < server.saveparamslen; j++) { struct saveparam *sp = server.saveparams+j; if (server.dirty >= sp->changes && - now-server.lastsave > sp->seconds) { + server.unixtime-server.lastsave > sp->seconds) { redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...", sp->changes, sp->seconds); rdbSaveBackground(server.rdb_filename); @@ -1068,11 +1070,12 @@ void initServerConfig() { server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN; server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN; - /* Assert */ + /* Debugging */ server.assert_failed = ""; server.assert_file = ""; server.assert_line = 0; server.bug_report_start = 0; + server.watchdog_period = 0; } /* This function will try to raise the max number of open files accordingly to @@ -1641,7 +1644,7 @@ void bytesToHuman(char *s, unsigned long long n) { * on memory corruption problems. */ sds genRedisInfoString(char *section) { sds info = sdsempty(); - time_t uptime = time(NULL)-server.stat_starttime; + time_t uptime = server.unixtime-server.stat_starttime; int j, numcommands; struct rusage self_ru, c_ru; unsigned long lol, bib; @@ -1780,7 +1783,7 @@ sds genRedisInfoString(char *section) { perc = ((double)server.loading_loaded_bytes / server.loading_total_bytes) * 100; - elapsed = time(NULL)-server.loading_start_time; + elapsed = server.unixtime-server.loading_start_time; if (elapsed == 0) { eta = 1; /* A fake 1 second figure if we don't have enough info */ @@ -1851,7 +1854,7 @@ sds genRedisInfoString(char *section) { (server.repl_state == REDIS_REPL_CONNECTED) ? "up" : "down", server.master ? - ((int)(time(NULL)-server.master->lastinteraction)) : -1, + ((int)(server.unixtime-server.master->lastinteraction)) : -1, server.repl_state == REDIS_REPL_TRANSFER ); @@ -1860,14 +1863,14 @@ sds genRedisInfoString(char *section) { "master_sync_left_bytes:%ld\r\n" "master_sync_last_io_seconds_ago:%d\r\n" ,(long)server.repl_transfer_left, - (int)(time(NULL)-server.repl_transfer_lastio) + (int)(server.unixtime-server.repl_transfer_lastio) ); } if (server.repl_state != REDIS_REPL_CONNECTED) { info = sdscatprintf(info, "master_link_down_since_seconds:%ld\r\n", - (long)time(NULL)-server.repl_down_since); + (long)server.unixtime-server.repl_down_since); } } info = sdscatprintf(info,