X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/80e87a461a7d2ee54430127bdb6ac014778c54c5..5833cf1676a4351e3fc7ea57c59d3ccad2a15632:/src/redis.c diff --git a/src/redis.c b/src/redis.c index 0bedc25b..fa546ae6 100644 --- a/src/redis.c +++ b/src/redis.c @@ -29,6 +29,7 @@ #include "redis.h" #include "slowlog.h" +#include "bio.h" #ifdef HAVE_BACKTRACE #include @@ -57,7 +58,7 @@ struct sharedObjectsStruct shared; -/* Global vars that are actally used as constants. The following double +/* Global vars that are actually used as constants. The following double * values are used for double on-disk serialization, and are initialized * at runtime to avoid strange compiler optimizations. */ @@ -575,6 +576,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { * in objects at every object access, and accuracy is not needed. * To access a global var is faster than calling time(NULL) */ server.unixtime = time(NULL); + /* We have just 22 bits per object for LRU information. * So we use an (eventually wrapping) LRU clock with 10 seconds resolution. * 2^22 bits with 10 seconds resoluton is more or less 1.5 years. @@ -685,7 +687,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { server.auto_aofrewrite_perc && server.appendonly_current_size > server.auto_aofrewrite_min_size) { - int base = server.auto_aofrewrite_base_size ? + long long base = server.auto_aofrewrite_base_size ? server.auto_aofrewrite_base_size : 1; long long growth = (server.appendonly_current_size*100/base) - 100; if (growth >= server.auto_aofrewrite_perc) { @@ -695,6 +697,11 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { } } + + /* If we postponed an AOF buffer flush, let's try to do it every time the + * cron function is called. */ + if (server.aof_flush_postponed_start) flushAppendOnlyFile(0); + /* Expire a few keys per cycle, only if this is a master. * On slaves we wait for DEL operations synthesized by the master * in order to guarantee a strict consistency. */ @@ -733,7 +740,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) { } /* Write the AOF buffer on disk */ - flushAppendOnlyFile(); + flushAppendOnlyFile(0); } /* =========================== Server initialization ======================== */ @@ -820,6 +827,7 @@ void initServerConfig() { server.lastfsync = time(NULL); server.appendfd = -1; server.appendseldb = -1; /* Make sure the first time will not match */ + server.aof_flush_postponed_start = 0; server.pidfile = zstrdup("/var/run/redis.pid"); server.dbfilename = zstrdup("dump.rdb"); server.appendfilename = zstrdup("appendonly.aof"); @@ -903,7 +911,8 @@ void initServer() { if (server.port != 0) { server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr); if (server.ipfd == ANET_ERR) { - redisLog(REDIS_WARNING, "Opening port: %s", server.neterr); + redisLog(REDIS_WARNING, "Opening port %d: %s", + server.port, server.neterr); exit(1); } } @@ -965,6 +974,7 @@ void initServer() { if (server.cluster_enabled) clusterInit(); scriptingInit(); slowlogInit(); + bioInit(); srand(time(NULL)^getpid()); } @@ -1022,9 +1032,9 @@ void call(redisClient *c) { slowlogPushEntryIfNeeded(c->argv,c->argc,duration); c->cmd->calls++; - if (server.appendonly && dirty) + if (server.appendonly && dirty > 0) feedAppendOnlyFile(c->cmd,c->db->id,c->argv,c->argc); - if ((dirty || c->cmd->flags & REDIS_CMD_FORCE_REPLICATION) && + if ((dirty > 0 || c->cmd->flags & REDIS_CMD_FORCE_REPLICATION) && listLength(server.slaves)) replicationFeedSlaves(server.slaves,c->db->id,c->argv,c->argc); if (listLength(server.monitors)) @@ -1726,6 +1736,7 @@ void redisAsciiArt(void) { int main(int argc, char **argv) { long long start; + zmalloc_enable_thread_safeness(); initServerConfig(); if (argc == 2) { if (strcmp(argv[1], "-v") == 0 || @@ -1773,8 +1784,10 @@ static void *getMcontextEip(ucontext_t *uc) { #elif defined(__APPLE__) && !defined(MAC_OS_X_VERSION_10_6) #if __x86_64__ return (void*) uc->uc_mcontext->__ss.__rip; - #else + #elif __i386__ return (void*) uc->uc_mcontext->__ss.__eip; + #else + return (void*) uc->uc_mcontext->__ss.__srr0; #endif #elif defined(__APPLE__) && defined(MAC_OS_X_VERSION_10_6) #if defined(_STRUCT_X86_THREAD_STATE64) && !defined(__i386__)