2  * Copyright (c) 2009-2010, Salvatore Sanfilippo <antirez at gmail dot com> 
   5  * Redistribution and use in source and binary forms, with or without 
   6  * modification, are permitted provided that the following conditions are met: 
   8  *   * Redistributions of source code must retain the above copyright notice, 
   9  *     this list of conditions and the following disclaimer. 
  10  *   * Redistributions in binary form must reproduce the above copyright 
  11  *     notice, this list of conditions and the following disclaimer in the 
  12  *     documentation and/or other materials provided with the distribution. 
  13  *   * Neither the name of Redis nor the names of its contributors may be used 
  14  *     to endorse or promote products derived from this software without 
  15  *     specific prior written permission. 
  17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
  18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
  21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
  23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
  25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  27  * POSSIBILITY OF SUCH DAMAGE. 
  41 #include <arpa/inet.h> 
  45 #include <sys/resource.h> 
  50 #include <sys/resource.h> 
  51 #include <sys/utsname.h> 
  53 /* Our shared "common" objects */ 
  55 struct sharedObjectsStruct shared
; 
  57 /* Global vars that are actually used as constants. The following double 
  58  * values are used for double on-disk serialization, and are initialized 
  59  * at runtime to avoid strange compiler optimizations. */ 
  61 double R_Zero
, R_PosInf
, R_NegInf
, R_Nan
; 
  63 /*================================= Globals ================================= */ 
  66 struct redisServer server
; /* server global state */ 
  67 struct redisCommand 
*commandTable
; 
  71  * Every entry is composed of the following fields: 
  73  * name: a string representing the command name. 
  74  * function: pointer to the C function implementing the command. 
  75  * arity: number of arguments, it is possible to use -N to say >= N 
  76  * sflags: command flags as string. See below for a table of flags. 
  77  * flags: flags as bitmask. Computed by Redis using the 'sflags' field. 
  78  * get_keys_proc: an optional function to get key arguments from a command. 
  79  *                This is only used when the following three fields are not 
  80  *                enough to specify what arguments are keys. 
  81  * first_key_index: first argument that is a key 
  82  * last_key_index: last argument that is a key 
  83  * key_step: step to get all the keys from first to last argument. For instance 
  84  *           in MSET the step is two since arguments are key,val,key,val,... 
  85  * microseconds: microseconds of total execution time for this command. 
  86  * calls: total number of calls of this command. 
  88  * The flags, microseconds and calls fields are computed by Redis and should 
  89  * always be set to zero. 
  91  * Command flags are expressed using strings where every character represents 
  92  * a flag. Later the populateCommandTable() function will take care of 
  93  * populating the real 'flags' field using this characters. 
  95  * This is the meaning of the flags: 
  97  * w: write command (may modify the key space). 
  98  * r: read command  (will never modify the key space). 
  99  * m: may increase memory usage once called. Don't allow if out of memory. 
 100  * a: admin command, like SAVE or SHUTDOWN. 
 101  * p: Pub/Sub related command. 
 102  * f: force replication of this command, regarless of server.dirty. 
 103  * s: command not allowed in scripts. 
 104  * R: random command. Command is not deterministic, that is, the same command 
 105  *    with the same arguments, with the same key space, may have different 
 106  *    results. For instance SPOP and RANDOMKEY are two random commands. 
 107  * S: Sort command output array if called from script, so that the output 
 109  * l: Allow command while loading the database. 
 110  * t: Allow command while a slave has stale data but is not allowed to 
 111  *    server this data. Normally no command is accepted in this condition 
 114 struct redisCommand redisCommandTable
[] = { 
 115     {"get",getCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 116     {"set",setCommand
,3,"wm",0,noPreloadGetKeys
,1,1,1,0,0}, 
 117     {"setnx",setnxCommand
,3,"wm",0,noPreloadGetKeys
,1,1,1,0,0}, 
 118     {"setex",setexCommand
,4,"wm",0,noPreloadGetKeys
,1,1,1,0,0}, 
 119     {"psetex",psetexCommand
,4,"wm",0,noPreloadGetKeys
,1,1,1,0,0}, 
 120     {"append",appendCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 121     {"strlen",strlenCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 122     {"del",delCommand
,-2,"w",0,noPreloadGetKeys
,1,-1,1,0,0}, 
 123     {"exists",existsCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 124     {"setbit",setbitCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 125     {"getbit",getbitCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 126     {"setrange",setrangeCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 127     {"getrange",getrangeCommand
,4,"r",0,NULL
,1,1,1,0,0}, 
 128     {"substr",getrangeCommand
,4,"r",0,NULL
,1,1,1,0,0}, 
 129     {"incr",incrCommand
,2,"wm",0,NULL
,1,1,1,0,0}, 
 130     {"decr",decrCommand
,2,"wm",0,NULL
,1,1,1,0,0}, 
 131     {"mget",mgetCommand
,-2,"r",0,NULL
,1,-1,1,0,0}, 
 132     {"rpush",rpushCommand
,-3,"wm",0,NULL
,1,1,1,0,0}, 
 133     {"lpush",lpushCommand
,-3,"wm",0,NULL
,1,1,1,0,0}, 
 134     {"rpushx",rpushxCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 135     {"lpushx",lpushxCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 136     {"linsert",linsertCommand
,5,"wm",0,NULL
,1,1,1,0,0}, 
 137     {"rpop",rpopCommand
,2,"w",0,NULL
,1,1,1,0,0}, 
 138     {"lpop",lpopCommand
,2,"w",0,NULL
,1,1,1,0,0}, 
 139     {"brpop",brpopCommand
,-3,"ws",0,NULL
,1,1,1,0,0}, 
 140     {"brpoplpush",brpoplpushCommand
,4,"wms",0,NULL
,1,2,1,0,0}, 
 141     {"blpop",blpopCommand
,-3,"ws",0,NULL
,1,-2,1,0,0}, 
 142     {"llen",llenCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 143     {"lindex",lindexCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 144     {"lset",lsetCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 145     {"lrange",lrangeCommand
,4,"r",0,NULL
,1,1,1,0,0}, 
 146     {"ltrim",ltrimCommand
,4,"w",0,NULL
,1,1,1,0,0}, 
 147     {"lrem",lremCommand
,4,"w",0,NULL
,1,1,1,0,0}, 
 148     {"rpoplpush",rpoplpushCommand
,3,"wm",0,NULL
,1,2,1,0,0}, 
 149     {"sadd",saddCommand
,-3,"wm",0,NULL
,1,1,1,0,0}, 
 150     {"srem",sremCommand
,-3,"w",0,NULL
,1,1,1,0,0}, 
 151     {"smove",smoveCommand
,4,"w",0,NULL
,1,2,1,0,0}, 
 152     {"sismember",sismemberCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 153     {"scard",scardCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 154     {"spop",spopCommand
,2,"wRs",0,NULL
,1,1,1,0,0}, 
 155     {"srandmember",srandmemberCommand
,-2,"rR",0,NULL
,1,1,1,0,0}, 
 156     {"sinter",sinterCommand
,-2,"rS",0,NULL
,1,-1,1,0,0}, 
 157     {"sinterstore",sinterstoreCommand
,-3,"wm",0,NULL
,1,-1,1,0,0}, 
 158     {"sunion",sunionCommand
,-2,"rS",0,NULL
,1,-1,1,0,0}, 
 159     {"sunionstore",sunionstoreCommand
,-3,"wm",0,NULL
,1,-1,1,0,0}, 
 160     {"sdiff",sdiffCommand
,-2,"rS",0,NULL
,1,-1,1,0,0}, 
 161     {"sdiffstore",sdiffstoreCommand
,-3,"wm",0,NULL
,1,-1,1,0,0}, 
 162     {"smembers",sinterCommand
,2,"rS",0,NULL
,1,1,1,0,0}, 
 163     {"zadd",zaddCommand
,-4,"wm",0,NULL
,1,1,1,0,0}, 
 164     {"zincrby",zincrbyCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 165     {"zrem",zremCommand
,-3,"w",0,NULL
,1,1,1,0,0}, 
 166     {"zremrangebyscore",zremrangebyscoreCommand
,4,"w",0,NULL
,1,1,1,0,0}, 
 167     {"zremrangebyrank",zremrangebyrankCommand
,4,"w",0,NULL
,1,1,1,0,0}, 
 168     {"zunionstore",zunionstoreCommand
,-4,"wm",0,zunionInterGetKeys
,0,0,0,0,0}, 
 169     {"zinterstore",zinterstoreCommand
,-4,"wm",0,zunionInterGetKeys
,0,0,0,0,0}, 
 170     {"zrange",zrangeCommand
,-4,"r",0,NULL
,1,1,1,0,0}, 
 171     {"zrangebyscore",zrangebyscoreCommand
,-4,"r",0,NULL
,1,1,1,0,0}, 
 172     {"zrevrangebyscore",zrevrangebyscoreCommand
,-4,"r",0,NULL
,1,1,1,0,0}, 
 173     {"zcount",zcountCommand
,4,"r",0,NULL
,1,1,1,0,0}, 
 174     {"zrevrange",zrevrangeCommand
,-4,"r",0,NULL
,1,1,1,0,0}, 
 175     {"zcard",zcardCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 176     {"zscore",zscoreCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 177     {"zrank",zrankCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 178     {"zrevrank",zrevrankCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 179     {"hset",hsetCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 180     {"hsetnx",hsetnxCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 181     {"hget",hgetCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 182     {"hmset",hmsetCommand
,-4,"wm",0,NULL
,1,1,1,0,0}, 
 183     {"hmget",hmgetCommand
,-3,"r",0,NULL
,1,1,1,0,0}, 
 184     {"hincrby",hincrbyCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 185     {"hincrbyfloat",hincrbyfloatCommand
,4,"wm",0,NULL
,1,1,1,0,0}, 
 186     {"hdel",hdelCommand
,-3,"w",0,NULL
,1,1,1,0,0}, 
 187     {"hlen",hlenCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 188     {"hkeys",hkeysCommand
,2,"rS",0,NULL
,1,1,1,0,0}, 
 189     {"hvals",hvalsCommand
,2,"rS",0,NULL
,1,1,1,0,0}, 
 190     {"hgetall",hgetallCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 191     {"hexists",hexistsCommand
,3,"r",0,NULL
,1,1,1,0,0}, 
 192     {"incrby",incrbyCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 193     {"decrby",decrbyCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 194     {"incrbyfloat",incrbyfloatCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 195     {"getset",getsetCommand
,3,"wm",0,NULL
,1,1,1,0,0}, 
 196     {"mset",msetCommand
,-3,"wm",0,NULL
,1,-1,2,0,0}, 
 197     {"msetnx",msetnxCommand
,-3,"wm",0,NULL
,1,-1,2,0,0}, 
 198     {"randomkey",randomkeyCommand
,1,"rR",0,NULL
,0,0,0,0,0}, 
 199     {"select",selectCommand
,2,"r",0,NULL
,0,0,0,0,0}, 
 200     {"move",moveCommand
,3,"w",0,NULL
,1,1,1,0,0}, 
 201     {"rename",renameCommand
,3,"w",0,renameGetKeys
,1,2,1,0,0}, 
 202     {"renamenx",renamenxCommand
,3,"w",0,renameGetKeys
,1,2,1,0,0}, 
 203     {"expire",expireCommand
,3,"w",0,NULL
,1,1,1,0,0}, 
 204     {"expireat",expireatCommand
,3,"w",0,NULL
,1,1,1,0,0}, 
 205     {"pexpire",pexpireCommand
,3,"w",0,NULL
,1,1,1,0,0}, 
 206     {"pexpireat",pexpireatCommand
,3,"w",0,NULL
,1,1,1,0,0}, 
 207     {"keys",keysCommand
,2,"rS",0,NULL
,0,0,0,0,0}, 
 208     {"dbsize",dbsizeCommand
,1,"r",0,NULL
,0,0,0,0,0}, 
 209     {"auth",authCommand
,2,"rs",0,NULL
,0,0,0,0,0}, 
 210     {"ping",pingCommand
,1,"r",0,NULL
,0,0,0,0,0}, 
 211     {"echo",echoCommand
,2,"r",0,NULL
,0,0,0,0,0}, 
 212     {"save",saveCommand
,1,"ars",0,NULL
,0,0,0,0,0}, 
 213     {"bgsave",bgsaveCommand
,1,"ar",0,NULL
,0,0,0,0,0}, 
 214     {"bgrewriteaof",bgrewriteaofCommand
,1,"ar",0,NULL
,0,0,0,0,0}, 
 215     {"shutdown",shutdownCommand
,-1,"ar",0,NULL
,0,0,0,0,0}, 
 216     {"lastsave",lastsaveCommand
,1,"r",0,NULL
,0,0,0,0,0}, 
 217     {"type",typeCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 218     {"multi",multiCommand
,1,"rs",0,NULL
,0,0,0,0,0}, 
 219     {"exec",execCommand
,1,"s",0,NULL
,0,0,0,0,0}, 
 220     {"discard",discardCommand
,1,"rs",0,NULL
,0,0,0,0,0}, 
 221     {"sync",syncCommand
,1,"ars",0,NULL
,0,0,0,0,0}, 
 222     {"replconf",replconfCommand
,-1,"ars",0,NULL
,0,0,0,0,0}, 
 223     {"flushdb",flushdbCommand
,1,"w",0,NULL
,0,0,0,0,0}, 
 224     {"flushall",flushallCommand
,1,"w",0,NULL
,0,0,0,0,0}, 
 225     {"sort",sortCommand
,-2,"wm",0,NULL
,1,1,1,0,0}, 
 226     {"info",infoCommand
,-1,"rlt",0,NULL
,0,0,0,0,0}, 
 227     {"monitor",monitorCommand
,1,"ars",0,NULL
,0,0,0,0,0}, 
 228     {"ttl",ttlCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 229     {"pttl",pttlCommand
,2,"r",0,NULL
,1,1,1,0,0}, 
 230     {"persist",persistCommand
,2,"w",0,NULL
,1,1,1,0,0}, 
 231     {"slaveof",slaveofCommand
,3,"ast",0,NULL
,0,0,0,0,0}, 
 232     {"debug",debugCommand
,-2,"as",0,NULL
,0,0,0,0,0}, 
 233     {"config",configCommand
,-2,"ar",0,NULL
,0,0,0,0,0}, 
 234     {"subscribe",subscribeCommand
,-2,"rpslt",0,NULL
,0,0,0,0,0}, 
 235     {"unsubscribe",unsubscribeCommand
,-1,"rpslt",0,NULL
,0,0,0,0,0}, 
 236     {"psubscribe",psubscribeCommand
,-2,"rpslt",0,NULL
,0,0,0,0,0}, 
 237     {"punsubscribe",punsubscribeCommand
,-1,"rpslt",0,NULL
,0,0,0,0,0}, 
 238     {"publish",publishCommand
,3,"pflt",0,NULL
,0,0,0,0,0}, 
 239     {"watch",watchCommand
,-2,"rs",0,noPreloadGetKeys
,1,-1,1,0,0}, 
 240     {"unwatch",unwatchCommand
,1,"rs",0,NULL
,0,0,0,0,0}, 
 241     {"restore",restoreCommand
,4,"awm",0,NULL
,1,1,1,0,0}, 
 242     {"migrate",migrateCommand
,6,"aw",0,NULL
,0,0,0,0,0}, 
 243     {"dump",dumpCommand
,2,"ar",0,NULL
,1,1,1,0,0}, 
 244     {"object",objectCommand
,-2,"r",0,NULL
,2,2,2,0,0}, 
 245     {"client",clientCommand
,-2,"ar",0,NULL
,0,0,0,0,0}, 
 246     {"eval",evalCommand
,-3,"s",0,zunionInterGetKeys
,0,0,0,0,0}, 
 247     {"evalsha",evalShaCommand
,-3,"s",0,zunionInterGetKeys
,0,0,0,0,0}, 
 248     {"slowlog",slowlogCommand
,-2,"r",0,NULL
,0,0,0,0,0}, 
 249     {"script",scriptCommand
,-2,"ras",0,NULL
,0,0,0,0,0}, 
 250     {"time",timeCommand
,1,"rR",0,NULL
,0,0,0,0,0}, 
 251     {"bitop",bitopCommand
,-4,"wm",0,NULL
,2,-1,1,0,0}, 
 252     {"bitcount",bitcountCommand
,-2,"r",0,NULL
,1,1,1,0,0} 
 255 /*============================ Utility functions ============================ */ 
 257 /* Low level logging. To use only for very big messages, otherwise 
 258  * redisLog() is to prefer. */ 
 259 void redisLogRaw(int level
, const char *msg
) { 
 260     const int syslogLevelMap
[] = { LOG_DEBUG
, LOG_INFO
, LOG_NOTICE
, LOG_WARNING 
}; 
 261     const char *c 
= ".-*#"; 
 264     int rawmode 
= (level 
& REDIS_LOG_RAW
); 
 266     level 
&= 0xff; /* clear flags */ 
 267     if (level 
< server
.verbosity
) return; 
 269     fp 
= (server
.logfile 
== NULL
) ? stdout 
: fopen(server
.logfile
,"a"); 
 273         fprintf(fp
,"%s",msg
); 
 278         gettimeofday(&tv
,NULL
); 
 279         off 
= strftime(buf
,sizeof(buf
),"%d %b %H:%M:%S.",localtime(&tv
.tv_sec
)); 
 280         snprintf(buf
+off
,sizeof(buf
)-off
,"%03d",(int)tv
.tv_usec
/1000); 
 281         fprintf(fp
,"[%d] %s %c %s\n",(int)getpid(),buf
,c
[level
],msg
); 
 285     if (server
.logfile
) fclose(fp
); 
 287     if (server
.syslog_enabled
) syslog(syslogLevelMap
[level
], "%s", msg
); 
 290 /* Like redisLogRaw() but with printf-alike support. This is the funciton that 
 291  * is used across the code. The raw version is only used in order to dump 
 292  * the INFO output on crash. */ 
 293 void redisLog(int level
, const char *fmt
, ...) { 
 295     char msg
[REDIS_MAX_LOGMSG_LEN
]; 
 297     if ((level
&0xff) < server
.verbosity
) return; 
 300     vsnprintf(msg
, sizeof(msg
), fmt
, ap
); 
 303     redisLogRaw(level
,msg
); 
 306 /* Log a fixed message without printf-alike capabilities, in a way that is 
 307  * safe to call from a signal handler. 
 309  * We actually use this only for signals that are not fatal from the point 
 310  * of view of Redis. Signals that are going to kill the server anyway and 
 311  * where we need printf-alike features are served by redisLog(). */ 
 312 void redisLogFromHandler(int level
, const char *msg
) { 
 316     if ((level
&0xff) < server
.verbosity 
|| 
 317         (server
.logfile 
== NULL 
&& server
.daemonize
)) return; 
 318     fd 
= server
.logfile 
? 
 319         open(server
.logfile
, O_APPEND
|O_CREAT
|O_WRONLY
, 0644) : 
 321     if (fd 
== -1) return; 
 322     ll2string(buf
,sizeof(buf
),getpid()); 
 323     if (write(fd
,"[",1) == -1) goto err
; 
 324     if (write(fd
,buf
,strlen(buf
)) == -1) goto err
; 
 325     if (write(fd
," | signal handler] (",20) == -1) goto err
; 
 326     ll2string(buf
,sizeof(buf
),time(NULL
)); 
 327     if (write(fd
,buf
,strlen(buf
)) == -1) goto err
; 
 328     if (write(fd
,") ",2) == -1) goto err
; 
 329     if (write(fd
,msg
,strlen(msg
)) == -1) goto err
; 
 330     if (write(fd
,"\n",1) == -1) goto err
; 
 332     if (server
.logfile
) close(fd
); 
 335 /* Return the UNIX time in microseconds */ 
 336 long long ustime(void) { 
 340     gettimeofday(&tv
, NULL
); 
 341     ust 
= ((long long)tv
.tv_sec
)*1000000; 
 346 /* Return the UNIX time in milliseconds */ 
 347 long long mstime(void) { 
 348     return ustime()/1000; 
 351 /* After an RDB dump or AOF rewrite we exit from children using _exit() instead of 
 352  * exit(), because the latter may interact with the same file objects used by 
 353  * the parent process. However if we are testing the coverage normal exit() is 
 354  * used in order to obtain the right coverage information. */ 
 355 void exitFromChild(int retcode
) { 
 363 /*====================== Hash table type implementation  ==================== */ 
 365 /* This is an hash table type that uses the SDS dynamic strings libary as 
 366  * keys and radis objects as values (objects can hold SDS strings, 
 369 void dictVanillaFree(void *privdata
, void *val
) 
 371     DICT_NOTUSED(privdata
); 
 375 void dictListDestructor(void *privdata
, void *val
) 
 377     DICT_NOTUSED(privdata
); 
 378     listRelease((list
*)val
); 
 381 int dictSdsKeyCompare(void *privdata
, const void *key1
, 
 385     DICT_NOTUSED(privdata
); 
 387     l1 
= sdslen((sds
)key1
); 
 388     l2 
= sdslen((sds
)key2
); 
 389     if (l1 
!= l2
) return 0; 
 390     return memcmp(key1
, key2
, l1
) == 0; 
 393 /* A case insensitive version used for the command lookup table. */ 
 394 int dictSdsKeyCaseCompare(void *privdata
, const void *key1
, 
 397     DICT_NOTUSED(privdata
); 
 399     return strcasecmp(key1
, key2
) == 0; 
 402 void dictRedisObjectDestructor(void *privdata
, void *val
) 
 404     DICT_NOTUSED(privdata
); 
 406     if (val 
== NULL
) return; /* Values of swapped out keys as set to NULL */ 
 410 void dictSdsDestructor(void *privdata
, void *val
) 
 412     DICT_NOTUSED(privdata
); 
 417 int dictObjKeyCompare(void *privdata
, const void *key1
, 
 420     const robj 
*o1 
= key1
, *o2 
= key2
; 
 421     return dictSdsKeyCompare(privdata
,o1
->ptr
,o2
->ptr
); 
 424 unsigned int dictObjHash(const void *key
) { 
 426     return dictGenHashFunction(o
->ptr
, sdslen((sds
)o
->ptr
)); 
 429 unsigned int dictSdsHash(const void *key
) { 
 430     return dictGenHashFunction((unsigned char*)key
, sdslen((char*)key
)); 
 433 unsigned int dictSdsCaseHash(const void *key
) { 
 434     return dictGenCaseHashFunction((unsigned char*)key
, sdslen((char*)key
)); 
 437 int dictEncObjKeyCompare(void *privdata
, const void *key1
, 
 440     robj 
*o1 
= (robj
*) key1
, *o2 
= (robj
*) key2
; 
 443     if (o1
->encoding 
== REDIS_ENCODING_INT 
&& 
 444         o2
->encoding 
== REDIS_ENCODING_INT
) 
 445             return o1
->ptr 
== o2
->ptr
; 
 447     o1 
= getDecodedObject(o1
); 
 448     o2 
= getDecodedObject(o2
); 
 449     cmp 
= dictSdsKeyCompare(privdata
,o1
->ptr
,o2
->ptr
); 
 455 unsigned int dictEncObjHash(const void *key
) { 
 456     robj 
*o 
= (robj
*) key
; 
 458     if (o
->encoding 
== REDIS_ENCODING_RAW
) { 
 459         return dictGenHashFunction(o
->ptr
, sdslen((sds
)o
->ptr
)); 
 461         if (o
->encoding 
== REDIS_ENCODING_INT
) { 
 465             len 
= ll2string(buf
,32,(long)o
->ptr
); 
 466             return dictGenHashFunction((unsigned char*)buf
, len
); 
 470             o 
= getDecodedObject(o
); 
 471             hash 
= dictGenHashFunction(o
->ptr
, sdslen((sds
)o
->ptr
)); 
 478 /* Sets type hash table */ 
 479 dictType setDictType 
= { 
 480     dictEncObjHash
,            /* hash function */ 
 483     dictEncObjKeyCompare
,      /* key compare */ 
 484     dictRedisObjectDestructor
, /* key destructor */ 
 485     NULL                       
/* val destructor */ 
 488 /* Sorted sets hash (note: a skiplist is used in addition to the hash table) */ 
 489 dictType zsetDictType 
= { 
 490     dictEncObjHash
,            /* hash function */ 
 493     dictEncObjKeyCompare
,      /* key compare */ 
 494     dictRedisObjectDestructor
, /* key destructor */ 
 495     NULL                       
/* val destructor */ 
 498 /* Db->dict, keys are sds strings, vals are Redis objects. */ 
 499 dictType dbDictType 
= { 
 500     dictSdsHash
,                /* hash function */ 
 503     dictSdsKeyCompare
,          /* key compare */ 
 504     dictSdsDestructor
,          /* key destructor */ 
 505     dictRedisObjectDestructor   
/* val destructor */ 
 509 dictType keyptrDictType 
= { 
 510     dictSdsHash
,               /* hash function */ 
 513     dictSdsKeyCompare
,         /* key compare */ 
 514     NULL
,                      /* key destructor */ 
 515     NULL                       
/* val destructor */ 
 518 /* Command table. sds string -> command struct pointer. */ 
 519 dictType commandTableDictType 
= { 
 520     dictSdsCaseHash
,           /* hash function */ 
 523     dictSdsKeyCaseCompare
,     /* key compare */ 
 524     dictSdsDestructor
,         /* key destructor */ 
 525     NULL                       
/* val destructor */ 
 528 /* Hash type hash table (note that small hashes are represented with zimpaps) */ 
 529 dictType hashDictType 
= { 
 530     dictEncObjHash
,             /* hash function */ 
 533     dictEncObjKeyCompare
,       /* key compare */ 
 534     dictRedisObjectDestructor
,  /* key destructor */ 
 535     dictRedisObjectDestructor   
/* val destructor */ 
 538 /* Keylist hash table type has unencoded redis objects as keys and 
 539  * lists as values. It's used for blocking operations (BLPOP) and to 
 540  * map swapped keys to a list of clients waiting for this keys to be loaded. */ 
 541 dictType keylistDictType 
= { 
 542     dictObjHash
,                /* hash function */ 
 545     dictObjKeyCompare
,          /* key compare */ 
 546     dictRedisObjectDestructor
,  /* key destructor */ 
 547     dictListDestructor          
/* val destructor */ 
 550 int htNeedsResize(dict 
*dict
) { 
 551     long long size
, used
; 
 553     size 
= dictSlots(dict
); 
 554     used 
= dictSize(dict
); 
 555     return (size 
&& used 
&& size 
> DICT_HT_INITIAL_SIZE 
&& 
 556             (used
*100/size 
< REDIS_HT_MINFILL
)); 
 559 /* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL 
 560  * we resize the hash table to save memory */ 
 561 void tryResizeHashTables(void) { 
 564     for (j 
= 0; j 
< server
.dbnum
; j
++) { 
 565         if (htNeedsResize(server
.db
[j
].dict
)) 
 566             dictResize(server
.db
[j
].dict
); 
 567         if (htNeedsResize(server
.db
[j
].expires
)) 
 568             dictResize(server
.db
[j
].expires
); 
 572 /* Our hash table implementation performs rehashing incrementally while 
 573  * we write/read from the hash table. Still if the server is idle, the hash 
 574  * table will use two tables for a long time. So we try to use 1 millisecond 
 575  * of CPU time at every serverCron() loop in order to rehash some key. */ 
 576 void incrementallyRehash(void) { 
 579     for (j 
= 0; j 
< server
.dbnum
; j
++) { 
 580         /* Keys dictionary */ 
 581         if (dictIsRehashing(server
.db
[j
].dict
)) { 
 582             dictRehashMilliseconds(server
.db
[j
].dict
,1); 
 583             break; /* already used our millisecond for this loop... */ 
 586         if (dictIsRehashing(server
.db
[j
].expires
)) { 
 587             dictRehashMilliseconds(server
.db
[j
].expires
,1); 
 588             break; /* already used our millisecond for this loop... */ 
 593 /* This function is called once a background process of some kind terminates, 
 594  * as we want to avoid resizing the hash tables when there is a child in order 
 595  * to play well with copy-on-write (otherwise when a resize happens lots of 
 596  * memory pages are copied). The goal of this function is to update the ability 
 597  * for dict.c to resize the hash tables accordingly to the fact we have o not 
 599 void updateDictResizePolicy(void) { 
 600     if (server
.rdb_child_pid 
== -1 && server
.aof_child_pid 
== -1) 
 606 /* ======================= Cron: called every 100 ms ======================== */ 
 608 /* Try to expire a few timed out keys. The algorithm used is adaptive and 
 609  * will use few CPU cycles if there are few expiring keys, otherwise 
 610  * it will get more aggressive to avoid that too much memory is used by 
 611  * keys that can be removed from the keyspace. */ 
 612 void activeExpireCycle(void) { 
 613     int j
, iteration 
= 0; 
 614     long long start 
= ustime(), timelimit
; 
 616     /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time 
 617      * per iteration. Since this function gets called with a frequency of 
 618      * REDIS_HZ times per second, the following is the max amount of 
 619      * microseconds we can spend in this function. */ 
 620     timelimit 
= 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC
/REDIS_HZ
/100; 
 621     if (timelimit 
<= 0) timelimit 
= 1; 
 623     for (j 
= 0; j 
< server
.dbnum
; j
++) { 
 625         redisDb 
*db 
= server
.db
+j
; 
 627         /* Continue to expire if at the end of the cycle more than 25% 
 628          * of the keys were expired. */ 
 630             unsigned long num 
= dictSize(db
->expires
); 
 631             unsigned long slots 
= dictSlots(db
->expires
); 
 632             long long now 
= mstime(); 
 634             /* When there are less than 1% filled slots getting random 
 635              * keys is expensive, so stop here waiting for better times... 
 636              * The dictionary will be resized asap. */ 
 637             if (num 
&& slots 
> DICT_HT_INITIAL_SIZE 
&& 
 638                 (num
*100/slots 
< 1)) break; 
 640             /* The main collection cycle. Sample random keys among keys 
 641              * with an expire set, checking for expired ones. */ 
 643             if (num 
> REDIS_EXPIRELOOKUPS_PER_CRON
) 
 644                 num 
= REDIS_EXPIRELOOKUPS_PER_CRON
; 
 649                 if ((de 
= dictGetRandomKey(db
->expires
)) == NULL
) break; 
 650                 t 
= dictGetSignedIntegerVal(de
); 
 652                     sds key 
= dictGetKey(de
); 
 653                     robj 
*keyobj 
= createStringObject(key
,sdslen(key
)); 
 655                     propagateExpire(db
,keyobj
); 
 657                     decrRefCount(keyobj
); 
 659                     server
.stat_expiredkeys
++; 
 662             /* We can't block forever here even if there are many keys to 
 663              * expire. So after a given amount of milliseconds return to the 
 664              * caller waiting for the other active expire cycle. */ 
 666             if ((iteration 
& 0xf) == 0 && /* check once every 16 cycles. */ 
 667                 (ustime()-start
) > timelimit
) return; 
 668         } while (expired 
> REDIS_EXPIRELOOKUPS_PER_CRON
/4); 
 672 void updateLRUClock(void) { 
 673     server
.lruclock 
= (server
.unixtime
/REDIS_LRU_CLOCK_RESOLUTION
) & 
 678 /* Add a sample to the operations per second array of samples. */ 
 679 void trackOperationsPerSecond(void) { 
 680     long long t 
= mstime() - server
.ops_sec_last_sample_time
; 
 681     long long ops 
= server
.stat_numcommands 
- server
.ops_sec_last_sample_ops
; 
 684     ops_sec 
= t 
> 0 ? (ops
*1000/t
) : 0; 
 686     server
.ops_sec_samples
[server
.ops_sec_idx
] = ops_sec
; 
 687     server
.ops_sec_idx 
= (server
.ops_sec_idx
+1) % REDIS_OPS_SEC_SAMPLES
; 
 688     server
.ops_sec_last_sample_time 
= mstime(); 
 689     server
.ops_sec_last_sample_ops 
= server
.stat_numcommands
; 
 692 /* Return the mean of all the samples. */ 
 693 long long getOperationsPerSecond(void) { 
 697     for (j 
= 0; j 
< REDIS_OPS_SEC_SAMPLES
; j
++) 
 698         sum 
+= server
.ops_sec_samples
[j
]; 
 699     return sum 
/ REDIS_OPS_SEC_SAMPLES
; 
 702 /* Check for timeouts. Returns non-zero if the client was terminated */ 
 703 int clientsCronHandleTimeout(redisClient 
*c
) { 
 704     time_t now 
= server
.unixtime
; 
 706     if (server
.maxidletime 
&& 
 707         !(c
->flags 
& REDIS_SLAVE
) &&    /* no timeout for slaves */ 
 708         !(c
->flags 
& REDIS_MASTER
) &&   /* no timeout for masters */ 
 709         !(c
->flags 
& REDIS_BLOCKED
) &&  /* no timeout for BLPOP */ 
 710         dictSize(c
->pubsub_channels
) == 0 && /* no timeout for pubsub */ 
 711         listLength(c
->pubsub_patterns
) == 0 && 
 712         (now 
- c
->lastinteraction 
> server
.maxidletime
)) 
 714         redisLog(REDIS_VERBOSE
,"Closing idle client"); 
 717     } else if (c
->flags 
& REDIS_BLOCKED
) { 
 718         if (c
->bpop
.timeout 
!= 0 && c
->bpop
.timeout 
< now
) { 
 719             addReply(c
,shared
.nullmultibulk
); 
 720             unblockClientWaitingData(c
); 
 726 /* The client query buffer is an sds.c string that can end with a lot of 
 727  * free space not used, this function reclaims space if needed. 
 729  * The funciton always returns 0 as it never terminates the client. */ 
 730 int clientsCronResizeQueryBuffer(redisClient 
*c
) { 
 731     size_t querybuf_size 
= sdsAllocSize(c
->querybuf
); 
 732     time_t idletime 
= server
.unixtime 
- c
->lastinteraction
; 
 734     /* There are two conditions to resize the query buffer: 
 735      * 1) Query buffer is > BIG_ARG and too big for latest peak. 
 736      * 2) Client is inactive and the buffer is bigger than 1k. */ 
 737     if (((querybuf_size 
> REDIS_MBULK_BIG_ARG
) && 
 738          (querybuf_size
/(c
->querybuf_peak
+1)) > 2) || 
 739          (querybuf_size 
> 1024 && idletime 
> 2)) 
 741         /* Only resize the query buffer if it is actually wasting space. */ 
 742         if (sdsavail(c
->querybuf
) > 1024) { 
 743             c
->querybuf 
= sdsRemoveFreeSpace(c
->querybuf
); 
 746     /* Reset the peak again to capture the peak memory usage in the next 
 748     c
->querybuf_peak 
= 0; 
 752 void clientsCron(void) { 
 753     /* Make sure to process at least 1/(REDIS_HZ*10) of clients per call. 
 754      * Since this function is called REDIS_HZ times per second we are sure that 
 755      * in the worst case we process all the clients in 10 seconds. 
 756      * In normal conditions (a reasonable number of clients) we process 
 757      * all the clients in a shorter time. */ 
 758     int numclients 
= listLength(server
.clients
); 
 759     int iterations 
= numclients
/(REDIS_HZ
*10); 
 762         iterations 
= (numclients 
< 50) ? numclients 
: 50; 
 763     while(listLength(server
.clients
) && iterations
--) { 
 767         /* Rotate the list, take the current head, process. 
 768          * This way if the client must be removed from the list it's the 
 769          * first element and we don't incur into O(N) computation. */ 
 770         listRotate(server
.clients
); 
 771         head 
= listFirst(server
.clients
); 
 772         c 
= listNodeValue(head
); 
 773         /* The following functions do different service checks on the client. 
 774          * The protocol is that they return non-zero if the client was 
 776         if (clientsCronHandleTimeout(c
)) continue; 
 777         if (clientsCronResizeQueryBuffer(c
)) continue; 
 781 /* This is our timer interrupt, called REDIS_HZ times per second. 
 782  * Here is where we do a number of things that need to be done asynchronously. 
 785  * - Active expired keys collection (it is also performed in a lazy way on 
 787  * - Software watchdong. 
 788  * - Update some statistic. 
 789  * - Incremental rehashing of the DBs hash tables. 
 790  * - Triggering BGSAVE / AOF rewrite, and handling of terminated children. 
 791  * - Clients timeout of differnet kinds. 
 792  * - Replication reconnection. 
 795  * Everything directly called here will be called REDIS_HZ times per second, 
 796  * so in order to throttle execution of things we want to do less frequently 
 797  * a macro is used: run_with_period(milliseconds) { .... } 
 800 int serverCron(struct aeEventLoop 
*eventLoop
, long long id
, void *clientData
) { 
 802     REDIS_NOTUSED(eventLoop
); 
 804     REDIS_NOTUSED(clientData
); 
 806     /* Software watchdog: deliver the SIGALRM that will reach the signal 
 807      * handler if we don't return here fast enough. */ 
 808     if (server
.watchdog_period
) watchdogScheduleSignal(server
.watchdog_period
); 
 810     /* We take a cached value of the unix time in the global state because 
 811      * with virtual memory and aging there is to store the current time 
 812      * in objects at every object access, and accuracy is not needed. 
 813      * To access a global var is faster than calling time(NULL) */ 
 814     server
.unixtime 
= time(NULL
); 
 816     run_with_period(100) trackOperationsPerSecond(); 
 818     /* We have just 22 bits per object for LRU information. 
 819      * So we use an (eventually wrapping) LRU clock with 10 seconds resolution. 
 820      * 2^22 bits with 10 seconds resoluton is more or less 1.5 years. 
 822      * Note that even if this will wrap after 1.5 years it's not a problem, 
 823      * everything will still work but just some object will appear younger 
 824      * to Redis. But for this to happen a given object should never be touched 
 827      * Note that you can change the resolution altering the 
 828      * REDIS_LRU_CLOCK_RESOLUTION define. 
 832     /* Record the max memory used since the server was started. */ 
 833     if (zmalloc_used_memory() > server
.stat_peak_memory
) 
 834         server
.stat_peak_memory 
= zmalloc_used_memory(); 
 836     /* We received a SIGTERM, shutting down here in a safe way, as it is 
 837      * not ok doing so inside the signal handler. */ 
 838     if (server
.shutdown_asap
) { 
 839         if (prepareForShutdown(0) == REDIS_OK
) exit(0); 
 840         redisLog(REDIS_WARNING
,"SIGTERM received but errors trying to shut down the server, check the logs for more information"); 
 843     /* Show some info about non-empty databases */ 
 844     run_with_period(5000) { 
 845         for (j 
= 0; j 
< server
.dbnum
; j
++) { 
 846             long long size
, used
, vkeys
; 
 848             size 
= dictSlots(server
.db
[j
].dict
); 
 849             used 
= dictSize(server
.db
[j
].dict
); 
 850             vkeys 
= dictSize(server
.db
[j
].expires
); 
 852                 redisLog(REDIS_VERBOSE
,"DB %d: %lld keys (%lld volatile) in %lld slots HT.",j
,used
,vkeys
,size
); 
 853                 /* dictPrintStats(server.dict); */ 
 858     /* We don't want to resize the hash tables while a bacground saving 
 859      * is in progress: the saving child is created using fork() that is 
 860      * implemented with a copy-on-write semantic in most modern systems, so 
 861      * if we resize the HT while there is the saving child at work actually 
 862      * a lot of memory movements in the parent will cause a lot of pages 
 864     if (server
.rdb_child_pid 
== -1 && server
.aof_child_pid 
== -1) { 
 865         tryResizeHashTables(); 
 866         if (server
.activerehashing
) incrementallyRehash(); 
 869     /* Show information about connected clients */ 
 870     if (!server
.sentinel_mode
) { 
 871         run_with_period(5000) { 
 872             redisLog(REDIS_VERBOSE
, 
 873                 "%d clients connected (%d slaves), %zu bytes in use", 
 874                 listLength(server
.clients
)-listLength(server
.slaves
), 
 875                 listLength(server
.slaves
), 
 876                 zmalloc_used_memory()); 
 880     /* We need to do a few operations on clients asynchronously. */ 
 883     /* Start a scheduled AOF rewrite if this was requested by the user while 
 884      * a BGSAVE was in progress. */ 
 885     if (server
.rdb_child_pid 
== -1 && server
.aof_child_pid 
== -1 && 
 886         server
.aof_rewrite_scheduled
) 
 888         rewriteAppendOnlyFileBackground(); 
 891     /* Check if a background saving or AOF rewrite in progress terminated. */ 
 892     if (server
.rdb_child_pid 
!= -1 || server
.aof_child_pid 
!= -1) { 
 896         if ((pid 
= wait3(&statloc
,WNOHANG
,NULL
)) != 0) { 
 897             int exitcode 
= WEXITSTATUS(statloc
); 
 900             if (WIFSIGNALED(statloc
)) bysignal 
= WTERMSIG(statloc
); 
 902             if (pid 
== server
.rdb_child_pid
) { 
 903                 backgroundSaveDoneHandler(exitcode
,bysignal
); 
 905                 backgroundRewriteDoneHandler(exitcode
,bysignal
); 
 907             updateDictResizePolicy(); 
 910         /* If there is not a background saving/rewrite in progress check if 
 911          * we have to save/rewrite now */ 
 912          for (j 
= 0; j 
< server
.saveparamslen
; j
++) { 
 913             struct saveparam 
*sp 
= server
.saveparams
+j
; 
 915             if (server
.dirty 
>= sp
->changes 
&& 
 916                 server
.unixtime
-server
.lastsave 
> sp
->seconds
) { 
 917                 redisLog(REDIS_NOTICE
,"%d changes in %d seconds. Saving...", 
 918                     sp
->changes
, sp
->seconds
); 
 919                 rdbSaveBackground(server
.rdb_filename
); 
 924          /* Trigger an AOF rewrite if needed */ 
 925          if (server
.rdb_child_pid 
== -1 && 
 926              server
.aof_child_pid 
== -1 && 
 927              server
.aof_rewrite_perc 
&& 
 928              server
.aof_current_size 
> server
.aof_rewrite_min_size
) 
 930             long long base 
= server
.aof_rewrite_base_size 
? 
 931                             server
.aof_rewrite_base_size 
: 1; 
 932             long long growth 
= (server
.aof_current_size
*100/base
) - 100; 
 933             if (growth 
>= server
.aof_rewrite_perc
) { 
 934                 redisLog(REDIS_NOTICE
,"Starting automatic rewriting of AOF on %lld%% growth",growth
); 
 935                 rewriteAppendOnlyFileBackground(); 
 941     /* If we postponed an AOF buffer flush, let's try to do it every time the 
 942      * cron function is called. */ 
 943     if (server
.aof_flush_postponed_start
) flushAppendOnlyFile(0); 
 945     /* Expire a few keys per cycle, only if this is a master. 
 946      * On slaves we wait for DEL operations synthesized by the master 
 947      * in order to guarantee a strict consistency. */ 
 948     if (server
.masterhost 
== NULL
) activeExpireCycle(); 
 950     /* Close clients that need to be closed asynchronous */ 
 951     freeClientsInAsyncFreeQueue(); 
 953     /* Replication cron function -- used to reconnect to master and 
 954      * to detect transfer failures. */ 
 955     run_with_period(1000) replicationCron(); 
 957     /* Run the sentinel timer if we are in sentinel mode. */ 
 958     run_with_period(100) { 
 959         if (server
.sentinel_mode
) sentinelTimer(); 
 963     return 1000/REDIS_HZ
; 
 966 /* This function gets called every time Redis is entering the 
 967  * main loop of the event driven library, that is, before to sleep 
 968  * for ready file descriptors. */ 
 969 void beforeSleep(struct aeEventLoop 
*eventLoop
) { 
 970     REDIS_NOTUSED(eventLoop
); 
 974     /* Try to process pending commands for clients that were just unblocked. */ 
 975     while (listLength(server
.unblocked_clients
)) { 
 976         ln 
= listFirst(server
.unblocked_clients
); 
 977         redisAssert(ln 
!= NULL
); 
 979         listDelNode(server
.unblocked_clients
,ln
); 
 980         c
->flags 
&= ~REDIS_UNBLOCKED
; 
 982         /* Process remaining data in the input buffer. */ 
 983         if (c
->querybuf 
&& sdslen(c
->querybuf
) > 0) { 
 984             server
.current_client 
= c
; 
 985             processInputBuffer(c
); 
 986             server
.current_client 
= NULL
; 
 990     /* Write the AOF buffer on disk */ 
 991     flushAppendOnlyFile(0); 
 994 /* =========================== Server initialization ======================== */ 
 996 void createSharedObjects(void) { 
 999     shared
.crlf 
= createObject(REDIS_STRING
,sdsnew("\r\n")); 
1000     shared
.ok 
= createObject(REDIS_STRING
,sdsnew("+OK\r\n")); 
1001     shared
.err 
= createObject(REDIS_STRING
,sdsnew("-ERR\r\n")); 
1002     shared
.emptybulk 
= createObject(REDIS_STRING
,sdsnew("$0\r\n\r\n")); 
1003     shared
.czero 
= createObject(REDIS_STRING
,sdsnew(":0\r\n")); 
1004     shared
.cone 
= createObject(REDIS_STRING
,sdsnew(":1\r\n")); 
1005     shared
.cnegone 
= createObject(REDIS_STRING
,sdsnew(":-1\r\n")); 
1006     shared
.nullbulk 
= createObject(REDIS_STRING
,sdsnew("$-1\r\n")); 
1007     shared
.nullmultibulk 
= createObject(REDIS_STRING
,sdsnew("*-1\r\n")); 
1008     shared
.emptymultibulk 
= createObject(REDIS_STRING
,sdsnew("*0\r\n")); 
1009     shared
.pong 
= createObject(REDIS_STRING
,sdsnew("+PONG\r\n")); 
1010     shared
.queued 
= createObject(REDIS_STRING
,sdsnew("+QUEUED\r\n")); 
1011     shared
.wrongtypeerr 
= createObject(REDIS_STRING
,sdsnew( 
1012         "-ERR Operation against a key holding the wrong kind of value\r\n")); 
1013     shared
.nokeyerr 
= createObject(REDIS_STRING
,sdsnew( 
1014         "-ERR no such key\r\n")); 
1015     shared
.syntaxerr 
= createObject(REDIS_STRING
,sdsnew( 
1016         "-ERR syntax error\r\n")); 
1017     shared
.sameobjecterr 
= createObject(REDIS_STRING
,sdsnew( 
1018         "-ERR source and destination objects are the same\r\n")); 
1019     shared
.outofrangeerr 
= createObject(REDIS_STRING
,sdsnew( 
1020         "-ERR index out of range\r\n")); 
1021     shared
.noscripterr 
= createObject(REDIS_STRING
,sdsnew( 
1022         "-NOSCRIPT No matching script. Please use EVAL.\r\n")); 
1023     shared
.loadingerr 
= createObject(REDIS_STRING
,sdsnew( 
1024         "-LOADING Redis is loading the dataset in memory\r\n")); 
1025     shared
.slowscripterr 
= createObject(REDIS_STRING
,sdsnew( 
1026         "-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\r\n")); 
1027     shared
.masterdownerr 
= createObject(REDIS_STRING
,sdsnew( 
1028         "-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\r\n")); 
1029     shared
.bgsaveerr 
= createObject(REDIS_STRING
,sdsnew( 
1030         "-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\r\n")); 
1031     shared
.roslaveerr 
= createObject(REDIS_STRING
,sdsnew( 
1032         "-READONLY You can't write against a read only slave.\r\n")); 
1033     shared
.oomerr 
= createObject(REDIS_STRING
,sdsnew( 
1034         "-OOM command not allowed when used memory > 'maxmemory'.\r\n")); 
1035     shared
.space 
= createObject(REDIS_STRING
,sdsnew(" ")); 
1036     shared
.colon 
= createObject(REDIS_STRING
,sdsnew(":")); 
1037     shared
.plus 
= createObject(REDIS_STRING
,sdsnew("+")); 
1039     for (j 
= 0; j 
< REDIS_SHARED_SELECT_CMDS
; j
++) { 
1040         shared
.select
[j
] = createObject(REDIS_STRING
, 
1041             sdscatprintf(sdsempty(),"select %d\r\n", j
)); 
1043     shared
.messagebulk 
= createStringObject("$7\r\nmessage\r\n",13); 
1044     shared
.pmessagebulk 
= createStringObject("$8\r\npmessage\r\n",14); 
1045     shared
.subscribebulk 
= createStringObject("$9\r\nsubscribe\r\n",15); 
1046     shared
.unsubscribebulk 
= createStringObject("$11\r\nunsubscribe\r\n",18); 
1047     shared
.psubscribebulk 
= createStringObject("$10\r\npsubscribe\r\n",17); 
1048     shared
.punsubscribebulk 
= createStringObject("$12\r\npunsubscribe\r\n",19); 
1049     shared
.del 
= createStringObject("DEL",3); 
1050     shared
.rpop 
= createStringObject("RPOP",4); 
1051     shared
.lpop 
= createStringObject("LPOP",4); 
1052     shared
.lpush 
= createStringObject("LPUSH",5); 
1053     for (j 
= 0; j 
< REDIS_SHARED_INTEGERS
; j
++) { 
1054         shared
.integers
[j
] = createObject(REDIS_STRING
,(void*)(long)j
); 
1055         shared
.integers
[j
]->encoding 
= REDIS_ENCODING_INT
; 
1057     for (j 
= 0; j 
< REDIS_SHARED_BULKHDR_LEN
; j
++) { 
1058         shared
.mbulkhdr
[j
] = createObject(REDIS_STRING
, 
1059             sdscatprintf(sdsempty(),"*%d\r\n",j
)); 
1060         shared
.bulkhdr
[j
] = createObject(REDIS_STRING
, 
1061             sdscatprintf(sdsempty(),"$%d\r\n",j
)); 
1065 void initServerConfig() { 
1066     getRandomHexChars(server
.runid
,REDIS_RUN_ID_SIZE
); 
1067     server
.runid
[REDIS_RUN_ID_SIZE
] = '\0'; 
1068     server
.arch_bits 
= (sizeof(long) == 8) ? 64 : 32; 
1069     server
.port 
= REDIS_SERVERPORT
; 
1070     server
.bindaddr 
= NULL
; 
1071     server
.unixsocket 
= NULL
; 
1072     server
.unixsocketperm 
= 0; 
1075     server
.dbnum 
= REDIS_DEFAULT_DBNUM
; 
1076     server
.verbosity 
= REDIS_NOTICE
; 
1077     server
.maxidletime 
= REDIS_MAXIDLETIME
; 
1078     server
.client_max_querybuf_len 
= REDIS_MAX_QUERYBUF_LEN
; 
1079     server
.saveparams 
= NULL
; 
1081     server
.logfile 
= NULL
; /* NULL = log on standard output */ 
1082     server
.syslog_enabled 
= 0; 
1083     server
.syslog_ident 
= zstrdup("redis"); 
1084     server
.syslog_facility 
= LOG_LOCAL0
; 
1085     server
.daemonize 
= 0; 
1086     server
.aof_state 
= REDIS_AOF_OFF
; 
1087     server
.aof_fsync 
= AOF_FSYNC_EVERYSEC
; 
1088     server
.aof_no_fsync_on_rewrite 
= 0; 
1089     server
.aof_rewrite_perc 
= REDIS_AOF_REWRITE_PERC
; 
1090     server
.aof_rewrite_min_size 
= REDIS_AOF_REWRITE_MIN_SIZE
; 
1091     server
.aof_rewrite_base_size 
= 0; 
1092     server
.aof_rewrite_scheduled 
= 0; 
1093     server
.aof_last_fsync 
= time(NULL
); 
1094     server
.aof_rewrite_time_last 
= -1; 
1095     server
.aof_rewrite_time_start 
= -1; 
1096     server
.aof_lastbgrewrite_status 
= REDIS_OK
; 
1097     server
.aof_delayed_fsync 
= 0; 
1099     server
.aof_selected_db 
= -1; /* Make sure the first time will not match */ 
1100     server
.aof_flush_postponed_start 
= 0; 
1101     server
.pidfile 
= zstrdup("/var/run/redis.pid"); 
1102     server
.rdb_filename 
= zstrdup("dump.rdb"); 
1103     server
.aof_filename 
= zstrdup("appendonly.aof"); 
1104     server
.requirepass 
= NULL
; 
1105     server
.rdb_compression 
= 1; 
1106     server
.rdb_checksum 
= 1; 
1107     server
.activerehashing 
= 1; 
1108     server
.maxclients 
= REDIS_MAX_CLIENTS
; 
1109     server
.bpop_blocked_clients 
= 0; 
1110     server
.maxmemory 
= 0; 
1111     server
.maxmemory_policy 
= REDIS_MAXMEMORY_VOLATILE_LRU
; 
1112     server
.maxmemory_samples 
= 3; 
1113     server
.hash_max_ziplist_entries 
= REDIS_HASH_MAX_ZIPLIST_ENTRIES
; 
1114     server
.hash_max_ziplist_value 
= REDIS_HASH_MAX_ZIPLIST_VALUE
; 
1115     server
.list_max_ziplist_entries 
= REDIS_LIST_MAX_ZIPLIST_ENTRIES
; 
1116     server
.list_max_ziplist_value 
= REDIS_LIST_MAX_ZIPLIST_VALUE
; 
1117     server
.set_max_intset_entries 
= REDIS_SET_MAX_INTSET_ENTRIES
; 
1118     server
.zset_max_ziplist_entries 
= REDIS_ZSET_MAX_ZIPLIST_ENTRIES
; 
1119     server
.zset_max_ziplist_value 
= REDIS_ZSET_MAX_ZIPLIST_VALUE
; 
1120     server
.shutdown_asap 
= 0; 
1121     server
.repl_ping_slave_period 
= REDIS_REPL_PING_SLAVE_PERIOD
; 
1122     server
.repl_timeout 
= REDIS_REPL_TIMEOUT
; 
1123     server
.lua_caller 
= NULL
; 
1124     server
.lua_time_limit 
= REDIS_LUA_TIME_LIMIT
; 
1125     server
.lua_client 
= NULL
; 
1126     server
.lua_timedout 
= 0; 
1129     resetServerSaveParams(); 
1131     appendServerSaveParams(60*60,1);  /* save after 1 hour and 1 change */ 
1132     appendServerSaveParams(300,100);  /* save after 5 minutes and 100 changes */ 
1133     appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */ 
1134     /* Replication related */ 
1135     server
.masterauth 
= NULL
; 
1136     server
.masterhost 
= NULL
; 
1137     server
.masterport 
= 6379; 
1138     server
.master 
= NULL
; 
1139     server
.repl_state 
= REDIS_REPL_NONE
; 
1140     server
.repl_syncio_timeout 
= REDIS_REPL_SYNCIO_TIMEOUT
; 
1141     server
.repl_serve_stale_data 
= 1; 
1142     server
.repl_slave_ro 
= 1; 
1143     server
.repl_down_since 
= time(NULL
); 
1144     server
.slave_priority 
= REDIS_DEFAULT_SLAVE_PRIORITY
; 
1146     /* Client output buffer limits */ 
1147     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_NORMAL
].hard_limit_bytes 
= 0; 
1148     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_NORMAL
].soft_limit_bytes 
= 0; 
1149     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_NORMAL
].soft_limit_seconds 
= 0; 
1150     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_SLAVE
].hard_limit_bytes 
= 1024*1024*256; 
1151     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_SLAVE
].soft_limit_bytes 
= 1024*1024*64; 
1152     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_SLAVE
].soft_limit_seconds 
= 60; 
1153     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_PUBSUB
].hard_limit_bytes 
= 1024*1024*32; 
1154     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_PUBSUB
].soft_limit_bytes 
= 1024*1024*8; 
1155     server
.client_obuf_limits
[REDIS_CLIENT_LIMIT_CLASS_PUBSUB
].soft_limit_seconds 
= 60; 
1157     /* Double constants initialization */ 
1159     R_PosInf 
= 1.0/R_Zero
; 
1160     R_NegInf 
= -1.0/R_Zero
; 
1161     R_Nan 
= R_Zero
/R_Zero
; 
1163     /* Command table -- we intiialize it here as it is part of the 
1164      * initial configuration, since command names may be changed via 
1165      * redis.conf using the rename-command directive. */ 
1166     server
.commands 
= dictCreate(&commandTableDictType
,NULL
); 
1167     populateCommandTable(); 
1168     server
.delCommand 
= lookupCommandByCString("del"); 
1169     server
.multiCommand 
= lookupCommandByCString("multi"); 
1170     server
.lpushCommand 
= lookupCommandByCString("lpush"); 
1171     server
.lpopCommand 
= lookupCommandByCString("lpop"); 
1172     server
.rpopCommand 
= lookupCommandByCString("rpop"); 
1175     server
.slowlog_log_slower_than 
= REDIS_SLOWLOG_LOG_SLOWER_THAN
; 
1176     server
.slowlog_max_len 
= REDIS_SLOWLOG_MAX_LEN
; 
1179     server
.assert_failed 
= "<no assertion failed>"; 
1180     server
.assert_file 
= "<no file>"; 
1181     server
.assert_line 
= 0; 
1182     server
.bug_report_start 
= 0; 
1183     server
.watchdog_period 
= 0; 
1186 /* This function will try to raise the max number of open files accordingly to 
1187  * the configured max number of clients. It will also account for 32 additional 
1188  * file descriptors as we need a few more for persistence, listening 
1189  * sockets, log files and so forth. 
1191  * If it will not be possible to set the limit accordingly to the configured 
1192  * max number of clients, the function will do the reverse setting 
1193  * server.maxclients to the value that we can actually handle. */ 
1194 void adjustOpenFilesLimit(void) { 
1195     rlim_t maxfiles 
= server
.maxclients
+32; 
1196     struct rlimit limit
; 
1198     if (getrlimit(RLIMIT_NOFILE
,&limit
) == -1) { 
1199         redisLog(REDIS_WARNING
,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.", 
1201         server
.maxclients 
= 1024-32; 
1203         rlim_t oldlimit 
= limit
.rlim_cur
; 
1205         /* Set the max number of files if the current limit is not enough 
1207         if (oldlimit 
< maxfiles
) { 
1211             while(f 
> oldlimit
) { 
1214                 if (setrlimit(RLIMIT_NOFILE
,&limit
) != -1) break; 
1217             if (f 
< oldlimit
) f 
= oldlimit
; 
1218             if (f 
!= maxfiles
) { 
1219                 server
.maxclients 
= f
-32; 
1220                 redisLog(REDIS_WARNING
,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.", 
1221                     (int) maxfiles
, strerror(errno
), (int) server
.maxclients
); 
1223                 redisLog(REDIS_NOTICE
,"Max number of open files set to %d", 
1233     signal(SIGHUP
, SIG_IGN
); 
1234     signal(SIGPIPE
, SIG_IGN
); 
1235     setupSignalHandlers(); 
1237     if (server
.syslog_enabled
) { 
1238         openlog(server
.syslog_ident
, LOG_PID 
| LOG_NDELAY 
| LOG_NOWAIT
, 
1239             server
.syslog_facility
); 
1242     server
.current_client 
= NULL
; 
1243     server
.clients 
= listCreate(); 
1244     server
.clients_to_close 
= listCreate(); 
1245     server
.slaves 
= listCreate(); 
1246     server
.monitors 
= listCreate(); 
1247     server
.unblocked_clients 
= listCreate(); 
1248     server
.ready_keys 
= listCreate(); 
1250     createSharedObjects(); 
1251     adjustOpenFilesLimit(); 
1252     server
.el 
= aeCreateEventLoop(server
.maxclients
+1024); 
1253     server
.db 
= zmalloc(sizeof(redisDb
)*server
.dbnum
); 
1255     if (server
.port 
!= 0) { 
1256         server
.ipfd 
= anetTcpServer(server
.neterr
,server
.port
,server
.bindaddr
); 
1257         if (server
.ipfd 
== ANET_ERR
) { 
1258             redisLog(REDIS_WARNING
, "Opening port %d: %s", 
1259                 server
.port
, server
.neterr
); 
1263     if (server
.unixsocket 
!= NULL
) { 
1264         unlink(server
.unixsocket
); /* don't care if this fails */ 
1265         server
.sofd 
= anetUnixServer(server
.neterr
,server
.unixsocket
,server
.unixsocketperm
); 
1266         if (server
.sofd 
== ANET_ERR
) { 
1267             redisLog(REDIS_WARNING
, "Opening socket: %s", server
.neterr
); 
1271     if (server
.ipfd 
< 0 && server
.sofd 
< 0) { 
1272         redisLog(REDIS_WARNING
, "Configured to not listen anywhere, exiting."); 
1275     for (j 
= 0; j 
< server
.dbnum
; j
++) { 
1276         server
.db
[j
].dict 
= dictCreate(&dbDictType
,NULL
); 
1277         server
.db
[j
].expires 
= dictCreate(&keyptrDictType
,NULL
); 
1278         server
.db
[j
].blocking_keys 
= dictCreate(&keylistDictType
,NULL
); 
1279         server
.db
[j
].ready_keys 
= dictCreate(&setDictType
,NULL
); 
1280         server
.db
[j
].watched_keys 
= dictCreate(&keylistDictType
,NULL
); 
1281         server
.db
[j
].id 
= j
; 
1283     server
.pubsub_channels 
= dictCreate(&keylistDictType
,NULL
); 
1284     server
.pubsub_patterns 
= listCreate(); 
1285     listSetFreeMethod(server
.pubsub_patterns
,freePubsubPattern
); 
1286     listSetMatchMethod(server
.pubsub_patterns
,listMatchPubsubPattern
); 
1287     server
.cronloops 
= 0; 
1288     server
.rdb_child_pid 
= -1; 
1289     server
.aof_child_pid 
= -1; 
1290     aofRewriteBufferReset(); 
1291     server
.aof_buf 
= sdsempty(); 
1292     server
.lastsave 
= time(NULL
); 
1293     server
.rdb_save_time_last 
= -1; 
1294     server
.rdb_save_time_start 
= -1; 
1296     server
.stat_numcommands 
= 0; 
1297     server
.stat_numconnections 
= 0; 
1298     server
.stat_expiredkeys 
= 0; 
1299     server
.stat_evictedkeys 
= 0; 
1300     server
.stat_starttime 
= time(NULL
); 
1301     server
.stat_keyspace_misses 
= 0; 
1302     server
.stat_keyspace_hits 
= 0; 
1303     server
.stat_peak_memory 
= 0; 
1304     server
.stat_fork_time 
= 0; 
1305     server
.stat_rejected_conn 
= 0; 
1306     memset(server
.ops_sec_samples
,0,sizeof(server
.ops_sec_samples
)); 
1307     server
.ops_sec_idx 
= 0; 
1308     server
.ops_sec_last_sample_time 
= mstime(); 
1309     server
.ops_sec_last_sample_ops 
= 0; 
1310     server
.unixtime 
= time(NULL
); 
1311     server
.lastbgsave_status 
= REDIS_OK
; 
1312     server
.stop_writes_on_bgsave_err 
= 1; 
1313     aeCreateTimeEvent(server
.el
, 1, serverCron
, NULL
, NULL
); 
1314     if (server
.ipfd 
> 0 && aeCreateFileEvent(server
.el
,server
.ipfd
,AE_READABLE
, 
1315         acceptTcpHandler
,NULL
) == AE_ERR
) redisPanic("Unrecoverable error creating server.ipfd file event."); 
1316     if (server
.sofd 
> 0 && aeCreateFileEvent(server
.el
,server
.sofd
,AE_READABLE
, 
1317         acceptUnixHandler
,NULL
) == AE_ERR
) redisPanic("Unrecoverable error creating server.sofd file event."); 
1319     if (server
.aof_state 
== REDIS_AOF_ON
) { 
1320         server
.aof_fd 
= open(server
.aof_filename
, 
1321                                O_WRONLY
|O_APPEND
|O_CREAT
,0644); 
1322         if (server
.aof_fd 
== -1) { 
1323             redisLog(REDIS_WARNING
, "Can't open the append-only file: %s", 
1329     /* 32 bit instances are limited to 4GB of address space, so if there is 
1330      * no explicit limit in the user provided configuration we set a limit 
1331      * at 3.5GB using maxmemory with 'noeviction' policy'. This saves 
1332      * useless crashes of the Redis instance. */ 
1333     if (server
.arch_bits 
== 32 && server
.maxmemory 
== 0) { 
1334         redisLog(REDIS_WARNING
,"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now."); 
1335         server
.maxmemory 
= 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */ 
1336         server
.maxmemory_policy 
= REDIS_MAXMEMORY_NO_EVICTION
; 
1344 /* Populates the Redis Command Table starting from the hard coded list 
1345  * we have on top of redis.c file. */ 
1346 void populateCommandTable(void) { 
1348     int numcommands 
= sizeof(redisCommandTable
)/sizeof(struct redisCommand
); 
1350     for (j 
= 0; j 
< numcommands
; j
++) { 
1351         struct redisCommand 
*c 
= redisCommandTable
+j
; 
1352         char *f 
= c
->sflags
; 
1357             case 'w': c
->flags 
|= REDIS_CMD_WRITE
; break; 
1358             case 'r': c
->flags 
|= REDIS_CMD_READONLY
; break; 
1359             case 'm': c
->flags 
|= REDIS_CMD_DENYOOM
; break; 
1360             case 'a': c
->flags 
|= REDIS_CMD_ADMIN
; break; 
1361             case 'p': c
->flags 
|= REDIS_CMD_PUBSUB
; break; 
1362             case 'f': c
->flags 
|= REDIS_CMD_FORCE_REPLICATION
; break; 
1363             case 's': c
->flags 
|= REDIS_CMD_NOSCRIPT
; break; 
1364             case 'R': c
->flags 
|= REDIS_CMD_RANDOM
; break; 
1365             case 'S': c
->flags 
|= REDIS_CMD_SORT_FOR_SCRIPT
; break; 
1366             case 'l': c
->flags 
|= REDIS_CMD_LOADING
; break; 
1367             case 't': c
->flags 
|= REDIS_CMD_STALE
; break; 
1368             default: redisPanic("Unsupported command flag"); break; 
1373         retval 
= dictAdd(server
.commands
, sdsnew(c
->name
), c
); 
1374         assert(retval 
== DICT_OK
); 
1378 void resetCommandTableStats(void) { 
1379     int numcommands 
= sizeof(redisCommandTable
)/sizeof(struct redisCommand
); 
1382     for (j 
= 0; j 
< numcommands
; j
++) { 
1383         struct redisCommand 
*c 
= redisCommandTable
+j
; 
1385         c
->microseconds 
= 0; 
1390 /* ========================== Redis OP Array API ============================ */ 
1392 void redisOpArrayInit(redisOpArray 
*oa
) { 
1397 int redisOpArrayAppend(redisOpArray 
*oa
, struct redisCommand 
*cmd
, int dbid
, 
1398                        robj 
**argv
, int argc
, int target
) 
1402     oa
->ops 
= zrealloc(oa
->ops
,sizeof(redisOp
)*(oa
->numops
+1)); 
1403     op 
= oa
->ops
+oa
->numops
; 
1408     op
->target 
= target
; 
1413 void redisOpArrayFree(redisOpArray 
*oa
) { 
1419         op 
= oa
->ops
+oa
->numops
; 
1420         for (j 
= 0; j 
< op
->argc
; j
++) 
1421             decrRefCount(op
->argv
[j
]); 
1427 /* ====================== Commands lookup and execution ===================== */ 
1429 struct redisCommand 
*lookupCommand(sds name
) { 
1430     return dictFetchValue(server
.commands
, name
); 
1433 struct redisCommand 
*lookupCommandByCString(char *s
) { 
1434     struct redisCommand 
*cmd
; 
1435     sds name 
= sdsnew(s
); 
1437     cmd 
= dictFetchValue(server
.commands
, name
); 
1442 /* Propagate the specified command (in the context of the specified database id) 
1443  * to AOF, Slaves and Monitors. 
1445  * flags are an xor between: 
1446  * + REDIS_PROPAGATE_NONE (no propagation of command at all) 
1447  * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled) 
1448  * + REDIS_PROPAGATE_REPL (propagate into the replication link) 
1450 void propagate(struct redisCommand 
*cmd
, int dbid
, robj 
**argv
, int argc
, 
1453     if (server
.aof_state 
!= REDIS_AOF_OFF 
&& flags 
& REDIS_PROPAGATE_AOF
) 
1454         feedAppendOnlyFile(cmd
,dbid
,argv
,argc
); 
1455     if (flags 
& REDIS_PROPAGATE_REPL 
&& listLength(server
.slaves
)) 
1456         replicationFeedSlaves(server
.slaves
,dbid
,argv
,argc
); 
1459 /* Used inside commands to schedule the propagation of additional commands 
1460  * after the current command is propagated to AOF / Replication. */ 
1461 void alsoPropagate(struct redisCommand 
*cmd
, int dbid
, robj 
**argv
, int argc
, 
1464     redisOpArrayAppend(&server
.also_propagate
,cmd
,dbid
,argv
,argc
,target
); 
1467 /* Call() is the core of Redis execution of a command */ 
1468 void call(redisClient 
*c
, int flags
) { 
1469     long long dirty
, start 
= ustime(), duration
; 
1471     /* Sent the command to clients in MONITOR mode, only if the commands are 
1472      * not geneated from reading an AOF. */ 
1473     if (listLength(server
.monitors
) && !server
.loading
) 
1474         replicationFeedMonitors(c
,server
.monitors
,c
->db
->id
,c
->argv
,c
->argc
); 
1476     /* Call the command. */ 
1477     redisOpArrayInit(&server
.also_propagate
); 
1478     dirty 
= server
.dirty
; 
1480     dirty 
= server
.dirty
-dirty
; 
1481     duration 
= ustime()-start
; 
1483     /* When EVAL is called loading the AOF we don't want commands called 
1484      * from Lua to go into the slowlog or to populate statistics. */ 
1485     if (server
.loading 
&& c
->flags 
& REDIS_LUA_CLIENT
) 
1486         flags 
&= ~(REDIS_CALL_SLOWLOG 
| REDIS_CALL_STATS
); 
1488     /* Log the command into the Slow log if needed, and populate the 
1489      * per-command statistics that we show in INFO commandstats. */ 
1490     if (flags 
& REDIS_CALL_SLOWLOG
) 
1491         slowlogPushEntryIfNeeded(c
->argv
,c
->argc
,duration
); 
1492     if (flags 
& REDIS_CALL_STATS
) { 
1493         c
->cmd
->microseconds 
+= duration
; 
1497     /* Propagate the command into the AOF and replication link */ 
1498     if (flags 
& REDIS_CALL_PROPAGATE
) { 
1499         int flags 
= REDIS_PROPAGATE_NONE
; 
1501         if (c
->cmd
->flags 
& REDIS_CMD_FORCE_REPLICATION
) 
1502             flags 
|= REDIS_PROPAGATE_REPL
; 
1504             flags 
|= (REDIS_PROPAGATE_REPL 
| REDIS_PROPAGATE_AOF
); 
1505         if (flags 
!= REDIS_PROPAGATE_NONE
) 
1506             propagate(c
->cmd
,c
->db
->id
,c
->argv
,c
->argc
,flags
); 
1508     /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional 
1510     if (server
.also_propagate
.numops
) { 
1514         for (j 
= 0; j 
< server
.also_propagate
.numops
; j
++) { 
1515             rop 
= &server
.also_propagate
.ops
[j
]; 
1516             propagate(rop
->cmd
, rop
->dbid
, rop
->argv
, rop
->argc
, rop
->target
); 
1518         redisOpArrayFree(&server
.also_propagate
); 
1520     server
.stat_numcommands
++; 
1523 /* If this function gets called we already read a whole 
1524  * command, argments are in the client argv/argc fields. 
1525  * processCommand() execute the command or prepare the 
1526  * server for a bulk read from the client. 
1528  * If 1 is returned the client is still alive and valid and 
1529  * and other operations can be performed by the caller. Otherwise 
1530  * if 0 is returned the client was destroied (i.e. after QUIT). */ 
1531 int processCommand(redisClient 
*c
) { 
1532     /* The QUIT command is handled separately. Normal command procs will 
1533      * go through checking for replication and QUIT will cause trouble 
1534      * when FORCE_REPLICATION is enabled and would be implemented in 
1535      * a regular command proc. */ 
1536     if (!strcasecmp(c
->argv
[0]->ptr
,"quit")) { 
1537         addReply(c
,shared
.ok
); 
1538         c
->flags 
|= REDIS_CLOSE_AFTER_REPLY
; 
1542     /* Now lookup the command and check ASAP about trivial error conditions 
1543      * such as wrong arity, bad command name and so forth. */ 
1544     c
->cmd 
= c
->lastcmd 
= lookupCommand(c
->argv
[0]->ptr
); 
1546         addReplyErrorFormat(c
,"unknown command '%s'", 
1547             (char*)c
->argv
[0]->ptr
); 
1549     } else if ((c
->cmd
->arity 
> 0 && c
->cmd
->arity 
!= c
->argc
) || 
1550                (c
->argc 
< -c
->cmd
->arity
)) { 
1551         addReplyErrorFormat(c
,"wrong number of arguments for '%s' command", 
1556     /* Check if the user is authenticated */ 
1557     if (server
.requirepass 
&& !c
->authenticated 
&& c
->cmd
->proc 
!= authCommand
) 
1559         addReplyError(c
,"operation not permitted"); 
1563     /* Handle the maxmemory directive. 
1565      * First we try to free some memory if possible (if there are volatile 
1566      * keys in the dataset). If there are not the only thing we can do 
1567      * is returning an error. */ 
1568     if (server
.maxmemory
) { 
1569         int retval 
= freeMemoryIfNeeded(); 
1570         if ((c
->cmd
->flags 
& REDIS_CMD_DENYOOM
) && retval 
== REDIS_ERR
) { 
1571             addReply(c
, shared
.oomerr
); 
1576     /* Don't accept write commands if there are problems persisting on disk. */ 
1577     if (server
.stop_writes_on_bgsave_err 
&& 
1578         server
.saveparamslen 
> 0 
1579         && server
.lastbgsave_status 
== REDIS_ERR 
&& 
1580         c
->cmd
->flags 
& REDIS_CMD_WRITE
) 
1582         addReply(c
, shared
.bgsaveerr
); 
1586     /* Don't accept write commands if this is a read only slave. But 
1587      * accept write commands if this is our master. */ 
1588     if (server
.masterhost 
&& server
.repl_slave_ro 
&& 
1589         !(c
->flags 
& REDIS_MASTER
) && 
1590         c
->cmd
->flags 
& REDIS_CMD_WRITE
) 
1592         addReply(c
, shared
.roslaveerr
); 
1596     /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */ 
1597     if ((dictSize(c
->pubsub_channels
) > 0 || listLength(c
->pubsub_patterns
) > 0) 
1599         c
->cmd
->proc 
!= subscribeCommand 
&& 
1600         c
->cmd
->proc 
!= unsubscribeCommand 
&& 
1601         c
->cmd
->proc 
!= psubscribeCommand 
&& 
1602         c
->cmd
->proc 
!= punsubscribeCommand
) { 
1603         addReplyError(c
,"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context"); 
1607     /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and 
1608      * we are a slave with a broken link with master. */ 
1609     if (server
.masterhost 
&& server
.repl_state 
!= REDIS_REPL_CONNECTED 
&& 
1610         server
.repl_serve_stale_data 
== 0 && 
1611         !(c
->cmd
->flags 
& REDIS_CMD_STALE
)) 
1613         addReply(c
, shared
.masterdownerr
); 
1617     /* Loading DB? Return an error if the command has not the 
1618      * REDIS_CMD_LOADING flag. */ 
1619     if (server
.loading 
&& !(c
->cmd
->flags 
& REDIS_CMD_LOADING
)) { 
1620         addReply(c
, shared
.loadingerr
); 
1624     /* Lua script too slow? Only allow commands with REDIS_CMD_STALE flag. */ 
1625     if (server
.lua_timedout 
&& 
1626           c
->cmd
->proc 
!= authCommand 
&& 
1627         !(c
->cmd
->proc 
== shutdownCommand 
&& 
1629           tolower(((char*)c
->argv
[1]->ptr
)[0]) == 'n') && 
1630         !(c
->cmd
->proc 
== scriptCommand 
&& 
1632           tolower(((char*)c
->argv
[1]->ptr
)[0]) == 'k')) 
1634         addReply(c
, shared
.slowscripterr
); 
1638     /* Exec the command */ 
1639     if (c
->flags 
& REDIS_MULTI 
&& 
1640         c
->cmd
->proc 
!= execCommand 
&& c
->cmd
->proc 
!= discardCommand 
&& 
1641         c
->cmd
->proc 
!= multiCommand 
&& c
->cmd
->proc 
!= watchCommand
) 
1643         queueMultiCommand(c
); 
1644         addReply(c
,shared
.queued
); 
1646         call(c
,REDIS_CALL_FULL
); 
1647         if (listLength(server
.ready_keys
)) 
1648             handleClientsBlockedOnLists(); 
1653 /*================================== Shutdown =============================== */ 
1655 int prepareForShutdown(int flags
) { 
1656     int save 
= flags 
& REDIS_SHUTDOWN_SAVE
; 
1657     int nosave 
= flags 
& REDIS_SHUTDOWN_NOSAVE
; 
1659     redisLog(REDIS_WARNING
,"User requested shutdown..."); 
1660     /* Kill the saving child if there is a background saving in progress. 
1661        We want to avoid race conditions, for instance our saving child may 
1662        overwrite the synchronous saving did by SHUTDOWN. */ 
1663     if (server
.rdb_child_pid 
!= -1) { 
1664         redisLog(REDIS_WARNING
,"There is a child saving an .rdb. Killing it!"); 
1665         kill(server
.rdb_child_pid
,SIGKILL
); 
1666         rdbRemoveTempFile(server
.rdb_child_pid
); 
1668     if (server
.aof_state 
!= REDIS_AOF_OFF
) { 
1669         /* Kill the AOF saving child as the AOF we already have may be longer 
1670          * but contains the full dataset anyway. */ 
1671         if (server
.aof_child_pid 
!= -1) { 
1672             redisLog(REDIS_WARNING
, 
1673                 "There is a child rewriting the AOF. Killing it!"); 
1674             kill(server
.aof_child_pid
,SIGKILL
); 
1676         /* Append only file: fsync() the AOF and exit */ 
1677         redisLog(REDIS_NOTICE
,"Calling fsync() on the AOF file."); 
1678         aof_fsync(server
.aof_fd
); 
1680     if ((server
.saveparamslen 
> 0 && !nosave
) || save
) { 
1681         redisLog(REDIS_NOTICE
,"Saving the final RDB snapshot before exiting."); 
1682         /* Snapshotting. Perform a SYNC SAVE and exit */ 
1683         if (rdbSave(server
.rdb_filename
) != REDIS_OK
) { 
1684             /* Ooops.. error saving! The best we can do is to continue 
1685              * operating. Note that if there was a background saving process, 
1686              * in the next cron() Redis will be notified that the background 
1687              * saving aborted, handling special stuff like slaves pending for 
1688              * synchronization... */ 
1689             redisLog(REDIS_WARNING
,"Error trying to save the DB, can't exit."); 
1693     if (server
.daemonize
) { 
1694         redisLog(REDIS_NOTICE
,"Removing the pid file."); 
1695         unlink(server
.pidfile
); 
1697     /* Close the listening sockets. Apparently this allows faster restarts. */ 
1698     if (server
.ipfd 
!= -1) close(server
.ipfd
); 
1699     if (server
.sofd 
!= -1) close(server
.sofd
); 
1700     if (server
.unixsocket
) { 
1701         redisLog(REDIS_NOTICE
,"Removing the unix socket file."); 
1702         unlink(server
.unixsocket
); /* don't care if this fails */ 
1705     redisLog(REDIS_WARNING
,"Redis is now ready to exit, bye bye..."); 
1709 /*================================== Commands =============================== */ 
1711 /* Return zero if strings are the same, non-zero if they are not. 
1712  * The comparison is performed in a way that prevents an attacker to obtain 
1713  * information about the nature of the strings just monitoring the execution 
1714  * time of the function. 
1716  * Note that limiting the comparison length to strings up to 512 bytes we 
1717  * can avoid leaking any information about the password length and any 
1718  * possible branch misprediction related leak. 
1720 int time_independent_strcmp(char *a
, char *b
) { 
1721     char bufa
[REDIS_AUTHPASS_MAX_LEN
], bufb
[REDIS_AUTHPASS_MAX_LEN
]; 
1722     /* The above two strlen perform len(a) + len(b) operations where either 
1723      * a or b are fixed (our password) length, and the difference is only 
1724      * relative to the length of the user provided string, so no information 
1725      * leak is possible in the following two lines of code. */ 
1726     int alen 
= strlen(a
); 
1727     int blen 
= strlen(b
); 
1731     /* We can't compare strings longer than our static buffers. 
1732      * Note that this will never pass the first test in practical circumstances 
1733      * so there is no info leak. */ 
1734     if (alen 
> sizeof(bufa
) || blen 
> sizeof(bufb
)) return 1; 
1736     memset(bufa
,0,sizeof(bufa
));        /* Constant time. */ 
1737     memset(bufb
,0,sizeof(bufb
));        /* Constant time. */ 
1738     /* Again the time of the following two copies is proportional to 
1739      * len(a) + len(b) so no info is leaked. */ 
1740     memcpy(bufa
,a
,alen
); 
1741     memcpy(bufb
,b
,blen
); 
1743     /* Always compare all the chars in the two buffers without 
1744      * conditional expressions. */ 
1745     for (j 
= 0; j 
< sizeof(bufa
); j
++) { 
1746         diff 
|= (bufa
[j
] ^ bufb
[j
]); 
1748     /* Length must be equal as well. */ 
1749     diff 
|= alen 
^ blen
; 
1750     return diff
; /* If zero strings are the same. */ 
1753 void authCommand(redisClient 
*c
) { 
1754     if (!server
.requirepass
) { 
1755         addReplyError(c
,"Client sent AUTH, but no password is set"); 
1756     } else if (!time_independent_strcmp(c
->argv
[1]->ptr
, server
.requirepass
)) { 
1757       c
->authenticated 
= 1; 
1758       addReply(c
,shared
.ok
); 
1760       c
->authenticated 
= 0; 
1761       addReplyError(c
,"invalid password"); 
1765 void pingCommand(redisClient 
*c
) { 
1766     addReply(c
,shared
.pong
); 
1769 void echoCommand(redisClient 
*c
) { 
1770     addReplyBulk(c
,c
->argv
[1]); 
1773 void timeCommand(redisClient 
*c
) { 
1776     /* gettimeofday() can only fail if &tv is a bad addresss so we 
1777      * don't check for errors. */ 
1778     gettimeofday(&tv
,NULL
); 
1779     addReplyMultiBulkLen(c
,2); 
1780     addReplyBulkLongLong(c
,tv
.tv_sec
); 
1781     addReplyBulkLongLong(c
,tv
.tv_usec
); 
1784 /* Convert an amount of bytes into a human readable string in the form 
1785  * of 100B, 2G, 100M, 4K, and so forth. */ 
1786 void bytesToHuman(char *s
, unsigned long long n
) { 
1791         sprintf(s
,"%lluB",n
); 
1793     } else if (n 
< (1024*1024)) { 
1794         d 
= (double)n
/(1024); 
1795         sprintf(s
,"%.2fK",d
); 
1796     } else if (n 
< (1024LL*1024*1024)) { 
1797         d 
= (double)n
/(1024*1024); 
1798         sprintf(s
,"%.2fM",d
); 
1799     } else if (n 
< (1024LL*1024*1024*1024)) { 
1800         d 
= (double)n
/(1024LL*1024*1024); 
1801         sprintf(s
,"%.2fG",d
); 
1805 /* Create the string returned by the INFO command. This is decoupled 
1806  * by the INFO command itself as we need to report the same information 
1807  * on memory corruption problems. */ 
1808 sds 
genRedisInfoString(char *section
) { 
1809     sds info 
= sdsempty(); 
1810     time_t uptime 
= server
.unixtime
-server
.stat_starttime
; 
1812     struct rusage self_ru
, c_ru
; 
1813     unsigned long lol
, bib
; 
1814     int allsections 
= 0, defsections 
= 0; 
1818         allsections 
= strcasecmp(section
,"all") == 0; 
1819         defsections 
= strcasecmp(section
,"default") == 0; 
1822     getrusage(RUSAGE_SELF
, &self_ru
); 
1823     getrusage(RUSAGE_CHILDREN
, &c_ru
); 
1824     getClientsMaxBuffers(&lol
,&bib
); 
1827     if (allsections 
|| defsections 
|| !strcasecmp(section
,"server")) { 
1828         struct utsname name
; 
1831         if (server
.sentinel_mode
) mode 
= "sentinel"; 
1832         else mode 
= "standalone"; 
1834         if (sections
++) info 
= sdscat(info
,"\r\n"); 
1836         info 
= sdscatprintf(info
, 
1838             "redis_version:%s\r\n" 
1839             "redis_git_sha1:%s\r\n" 
1840             "redis_git_dirty:%d\r\n" 
1844             "multiplexing_api:%s\r\n" 
1845             "gcc_version:%d.%d.%d\r\n" 
1846             "process_id:%ld\r\n" 
1849             "uptime_in_seconds:%ld\r\n" 
1850             "uptime_in_days:%ld\r\n" 
1851             "lru_clock:%ld\r\n", 
1854             strtol(redisGitDirty(),NULL
,10) > 0, 
1856             name
.sysname
, name
.release
, name
.machine
, 
1860             __GNUC__
,__GNUC_MINOR__
,__GNUC_PATCHLEVEL__
, 
1869             (unsigned long) server
.lruclock
); 
1873     if (allsections 
|| defsections 
|| !strcasecmp(section
,"clients")) { 
1874         if (sections
++) info 
= sdscat(info
,"\r\n"); 
1875         info 
= sdscatprintf(info
, 
1877             "connected_clients:%lu\r\n" 
1878             "client_longest_output_list:%lu\r\n" 
1879             "client_biggest_input_buf:%lu\r\n" 
1880             "blocked_clients:%d\r\n", 
1881             listLength(server
.clients
)-listLength(server
.slaves
), 
1883             server
.bpop_blocked_clients
); 
1887     if (allsections 
|| defsections 
|| !strcasecmp(section
,"memory")) { 
1891         bytesToHuman(hmem
,zmalloc_used_memory()); 
1892         bytesToHuman(peak_hmem
,server
.stat_peak_memory
); 
1893         if (sections
++) info 
= sdscat(info
,"\r\n"); 
1894         info 
= sdscatprintf(info
, 
1896             "used_memory:%zu\r\n" 
1897             "used_memory_human:%s\r\n" 
1898             "used_memory_rss:%zu\r\n" 
1899             "used_memory_peak:%zu\r\n" 
1900             "used_memory_peak_human:%s\r\n" 
1901             "used_memory_lua:%lld\r\n" 
1902             "mem_fragmentation_ratio:%.2f\r\n" 
1903             "mem_allocator:%s\r\n", 
1904             zmalloc_used_memory(), 
1907             server
.stat_peak_memory
, 
1909             ((long long)lua_gc(server
.lua
,LUA_GCCOUNT
,0))*1024LL, 
1910             zmalloc_get_fragmentation_ratio(), 
1916     if (allsections 
|| defsections 
|| !strcasecmp(section
,"persistence")) { 
1917         if (sections
++) info 
= sdscat(info
,"\r\n"); 
1918         info 
= sdscatprintf(info
, 
1921             "rdb_changes_since_last_save:%lld\r\n" 
1922             "rdb_bgsave_in_progress:%d\r\n" 
1923             "rdb_last_save_time:%ld\r\n" 
1924             "rdb_last_bgsave_status:%s\r\n" 
1925             "rdb_last_bgsave_time_sec:%ld\r\n" 
1926             "rdb_current_bgsave_time_sec:%ld\r\n" 
1927             "aof_enabled:%d\r\n" 
1928             "aof_rewrite_in_progress:%d\r\n" 
1929             "aof_rewrite_scheduled:%d\r\n" 
1930             "aof_last_rewrite_time_sec:%ld\r\n" 
1931             "aof_current_rewrite_time_sec:%ld\r\n" 
1932             "aof_last_bgrewrite_status:%s\r\n", 
1935             server
.rdb_child_pid 
!= -1, 
1937             (server
.lastbgsave_status 
== REDIS_OK
) ? "ok" : "err", 
1938             server
.rdb_save_time_last
, 
1939             (server
.rdb_child_pid 
== -1) ? 
1940                 -1 : time(NULL
)-server
.rdb_save_time_start
, 
1941             server
.aof_state 
!= REDIS_AOF_OFF
, 
1942             server
.aof_child_pid 
!= -1, 
1943             server
.aof_rewrite_scheduled
, 
1944             server
.aof_rewrite_time_last
, 
1945             (server
.aof_child_pid 
== -1) ? 
1946                 -1 : time(NULL
)-server
.aof_rewrite_time_start
, 
1947             (server
.aof_lastbgrewrite_status 
== REDIS_OK
) ? "ok" : "err"); 
1949         if (server
.aof_state 
!= REDIS_AOF_OFF
) { 
1950             info 
= sdscatprintf(info
, 
1951                 "aof_current_size:%lld\r\n" 
1952                 "aof_base_size:%lld\r\n" 
1953                 "aof_pending_rewrite:%d\r\n" 
1954                 "aof_buffer_length:%zu\r\n" 
1955                 "aof_rewrite_buffer_length:%lu\r\n" 
1956                 "aof_pending_bio_fsync:%llu\r\n" 
1957                 "aof_delayed_fsync:%lu\r\n", 
1958                 (long long) server
.aof_current_size
, 
1959                 (long long) server
.aof_rewrite_base_size
, 
1960                 server
.aof_rewrite_scheduled
, 
1961                 sdslen(server
.aof_buf
), 
1962                 aofRewriteBufferSize(), 
1963                 bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC
), 
1964                 server
.aof_delayed_fsync
); 
1967         if (server
.loading
) { 
1969             time_t eta
, elapsed
; 
1970             off_t remaining_bytes 
= server
.loading_total_bytes
- 
1971                                     server
.loading_loaded_bytes
; 
1973             perc 
= ((double)server
.loading_loaded_bytes 
/ 
1974                    server
.loading_total_bytes
) * 100; 
1976             elapsed 
= server
.unixtime
-server
.loading_start_time
; 
1978                 eta 
= 1; /* A fake 1 second figure if we don't have 
1981                 eta 
= (elapsed
*remaining_bytes
)/server
.loading_loaded_bytes
; 
1984             info 
= sdscatprintf(info
, 
1985                 "loading_start_time:%ld\r\n" 
1986                 "loading_total_bytes:%llu\r\n" 
1987                 "loading_loaded_bytes:%llu\r\n" 
1988                 "loading_loaded_perc:%.2f\r\n" 
1989                 "loading_eta_seconds:%ld\r\n" 
1990                 ,(unsigned long) server
.loading_start_time
, 
1991                 (unsigned long long) server
.loading_total_bytes
, 
1992                 (unsigned long long) server
.loading_loaded_bytes
, 
2000     if (allsections 
|| defsections 
|| !strcasecmp(section
,"stats")) { 
2001         if (sections
++) info 
= sdscat(info
,"\r\n"); 
2002         info 
= sdscatprintf(info
, 
2004             "total_connections_received:%lld\r\n" 
2005             "total_commands_processed:%lld\r\n" 
2006             "instantaneous_ops_per_sec:%lld\r\n" 
2007             "rejected_connections:%lld\r\n" 
2008             "expired_keys:%lld\r\n" 
2009             "evicted_keys:%lld\r\n" 
2010             "keyspace_hits:%lld\r\n" 
2011             "keyspace_misses:%lld\r\n" 
2012             "pubsub_channels:%ld\r\n" 
2013             "pubsub_patterns:%lu\r\n" 
2014             "latest_fork_usec:%lld\r\n", 
2015             server
.stat_numconnections
, 
2016             server
.stat_numcommands
, 
2017             getOperationsPerSecond(), 
2018             server
.stat_rejected_conn
, 
2019             server
.stat_expiredkeys
, 
2020             server
.stat_evictedkeys
, 
2021             server
.stat_keyspace_hits
, 
2022             server
.stat_keyspace_misses
, 
2023             dictSize(server
.pubsub_channels
), 
2024             listLength(server
.pubsub_patterns
), 
2025             server
.stat_fork_time
); 
2029     if (allsections 
|| defsections 
|| !strcasecmp(section
,"replication")) { 
2030         if (sections
++) info 
= sdscat(info
,"\r\n"); 
2031         info 
= sdscatprintf(info
, 
2034             server
.masterhost 
== NULL 
? "master" : "slave"); 
2035         if (server
.masterhost
) { 
2036             info 
= sdscatprintf(info
, 
2037                 "master_host:%s\r\n" 
2038                 "master_port:%d\r\n" 
2039                 "master_link_status:%s\r\n" 
2040                 "master_last_io_seconds_ago:%d\r\n" 
2041                 "master_sync_in_progress:%d\r\n" 
2044                 (server
.repl_state 
== REDIS_REPL_CONNECTED
) ? 
2047                 ((int)(server
.unixtime
-server
.master
->lastinteraction
)) : -1, 
2048                 server
.repl_state 
== REDIS_REPL_TRANSFER
 
2051             if (server
.repl_state 
== REDIS_REPL_TRANSFER
) { 
2052                 info 
= sdscatprintf(info
, 
2053                     "master_sync_left_bytes:%lld\r\n" 
2054                     "master_sync_last_io_seconds_ago:%d\r\n" 
2056                         (server
.repl_transfer_size 
- server
.repl_transfer_read
), 
2057                     (int)(server
.unixtime
-server
.repl_transfer_lastio
) 
2061             if (server
.repl_state 
!= REDIS_REPL_CONNECTED
) { 
2062                 info 
= sdscatprintf(info
, 
2063                     "master_link_down_since_seconds:%ld\r\n", 
2064                     (long)server
.unixtime
-server
.repl_down_since
); 
2066             info 
= sdscatprintf(info
, 
2067                 "slave_priority:%d\r\n", server
.slave_priority
); 
2069         info 
= sdscatprintf(info
, 
2070             "connected_slaves:%lu\r\n", 
2071             listLength(server
.slaves
)); 
2072         if (listLength(server
.slaves
)) { 
2077             listRewind(server
.slaves
,&li
); 
2078             while((ln 
= listNext(&li
))) { 
2079                 redisClient 
*slave 
= listNodeValue(ln
); 
2084                 if (anetPeerToString(slave
->fd
,ip
,&port
) == -1) continue; 
2085                 switch(slave
->replstate
) { 
2086                 case REDIS_REPL_WAIT_BGSAVE_START
: 
2087                 case REDIS_REPL_WAIT_BGSAVE_END
: 
2088                     state 
= "wait_bgsave"; 
2090                 case REDIS_REPL_SEND_BULK
: 
2091                     state 
= "send_bulk"; 
2093                 case REDIS_REPL_ONLINE
: 
2097                 if (state 
== NULL
) continue; 
2098                 info 
= sdscatprintf(info
,"slave%d:%s,%d,%s\r\n", 
2099                     slaveid
,ip
,slave
->slave_listening_port
,state
); 
2106     if (allsections 
|| defsections 
|| !strcasecmp(section
,"cpu")) { 
2107         if (sections
++) info 
= sdscat(info
,"\r\n"); 
2108         info 
= sdscatprintf(info
, 
2110         "used_cpu_sys:%.2f\r\n" 
2111         "used_cpu_user:%.2f\r\n" 
2112         "used_cpu_sys_children:%.2f\r\n" 
2113         "used_cpu_user_children:%.2f\r\n", 
2114         (float)self_ru
.ru_stime
.tv_sec
+(float)self_ru
.ru_stime
.tv_usec
/1000000, 
2115         (float)self_ru
.ru_utime
.tv_sec
+(float)self_ru
.ru_utime
.tv_usec
/1000000, 
2116         (float)c_ru
.ru_stime
.tv_sec
+(float)c_ru
.ru_stime
.tv_usec
/1000000, 
2117         (float)c_ru
.ru_utime
.tv_sec
+(float)c_ru
.ru_utime
.tv_usec
/1000000); 
2121     if (allsections 
|| !strcasecmp(section
,"commandstats")) { 
2122         if (sections
++) info 
= sdscat(info
,"\r\n"); 
2123         info 
= sdscatprintf(info
, "# Commandstats\r\n"); 
2124         numcommands 
= sizeof(redisCommandTable
)/sizeof(struct redisCommand
); 
2125         for (j 
= 0; j 
< numcommands
; j
++) { 
2126             struct redisCommand 
*c 
= redisCommandTable
+j
; 
2128             if (!c
->calls
) continue; 
2129             info 
= sdscatprintf(info
, 
2130                 "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n", 
2131                 c
->name
, c
->calls
, c
->microseconds
, 
2132                 (c
->calls 
== 0) ? 0 : ((float)c
->microseconds
/c
->calls
)); 
2137     if (allsections 
|| defsections 
|| !strcasecmp(section
,"keyspace")) { 
2138         if (sections
++) info 
= sdscat(info
,"\r\n"); 
2139         info 
= sdscatprintf(info
, "# Keyspace\r\n"); 
2140         for (j 
= 0; j 
< server
.dbnum
; j
++) { 
2141             long long keys
, vkeys
; 
2143             keys 
= dictSize(server
.db
[j
].dict
); 
2144             vkeys 
= dictSize(server
.db
[j
].expires
); 
2145             if (keys 
|| vkeys
) { 
2146                 info 
= sdscatprintf(info
, "db%d:keys=%lld,expires=%lld\r\n", 
2154 void infoCommand(redisClient 
*c
) { 
2155     char *section 
= c
->argc 
== 2 ? c
->argv
[1]->ptr 
: "default"; 
2158         addReply(c
,shared
.syntaxerr
); 
2161     sds info 
= genRedisInfoString(section
); 
2162     addReplySds(c
,sdscatprintf(sdsempty(),"$%lu\r\n", 
2163         (unsigned long)sdslen(info
))); 
2164     addReplySds(c
,info
); 
2165     addReply(c
,shared
.crlf
); 
2168 void monitorCommand(redisClient 
*c
) { 
2169     /* ignore MONITOR if aleady slave or in monitor mode */ 
2170     if (c
->flags 
& REDIS_SLAVE
) return; 
2172     c
->flags 
|= (REDIS_SLAVE
|REDIS_MONITOR
); 
2174     listAddNodeTail(server
.monitors
,c
); 
2175     addReply(c
,shared
.ok
); 
2178 /* ============================ Maxmemory directive  ======================== */ 
2180 /* This function gets called when 'maxmemory' is set on the config file to limit 
2181  * the max memory used by the server, before processing a command. 
2183  * The goal of the function is to free enough memory to keep Redis under the 
2184  * configured memory limit. 
2186  * The function starts calculating how many bytes should be freed to keep 
2187  * Redis under the limit, and enters a loop selecting the best keys to 
2188  * evict accordingly to the configured policy. 
2190  * If all the bytes needed to return back under the limit were freed the 
2191  * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller 
2192  * should block the execution of commands that will result in more memory 
2193  * used by the server. 
2195 int freeMemoryIfNeeded(void) { 
2196     size_t mem_used
, mem_tofree
, mem_freed
; 
2197     int slaves 
= listLength(server
.slaves
); 
2199     /* Remove the size of slaves output buffers and AOF buffer from the 
2200      * count of used memory. */ 
2201     mem_used 
= zmalloc_used_memory(); 
2206         listRewind(server
.slaves
,&li
); 
2207         while((ln 
= listNext(&li
))) { 
2208             redisClient 
*slave 
= listNodeValue(ln
); 
2209             unsigned long obuf_bytes 
= getClientOutputBufferMemoryUsage(slave
); 
2210             if (obuf_bytes 
> mem_used
) 
2213                 mem_used 
-= obuf_bytes
; 
2216     if (server
.aof_state 
!= REDIS_AOF_OFF
) { 
2217         mem_used 
-= sdslen(server
.aof_buf
); 
2218         mem_used 
-= aofRewriteBufferSize(); 
2221     /* Check if we are over the memory limit. */ 
2222     if (mem_used 
<= server
.maxmemory
) return REDIS_OK
; 
2224     if (server
.maxmemory_policy 
== REDIS_MAXMEMORY_NO_EVICTION
) 
2225         return REDIS_ERR
; /* We need to free memory, but policy forbids. */ 
2227     /* Compute how much memory we need to free. */ 
2228     mem_tofree 
= mem_used 
- server
.maxmemory
; 
2230     while (mem_freed 
< mem_tofree
) { 
2231         int j
, k
, keys_freed 
= 0; 
2233         for (j 
= 0; j 
< server
.dbnum
; j
++) { 
2234             long bestval 
= 0; /* just to prevent warning */ 
2236             struct dictEntry 
*de
; 
2237             redisDb 
*db 
= server
.db
+j
; 
2240             if (server
.maxmemory_policy 
== REDIS_MAXMEMORY_ALLKEYS_LRU 
|| 
2241                 server
.maxmemory_policy 
== REDIS_MAXMEMORY_ALLKEYS_RANDOM
) 
2243                 dict 
= server
.db
[j
].dict
; 
2245                 dict 
= server
.db
[j
].expires
; 
2247             if (dictSize(dict
) == 0) continue; 
2249             /* volatile-random and allkeys-random policy */ 
2250             if (server
.maxmemory_policy 
== REDIS_MAXMEMORY_ALLKEYS_RANDOM 
|| 
2251                 server
.maxmemory_policy 
== REDIS_MAXMEMORY_VOLATILE_RANDOM
) 
2253                 de 
= dictGetRandomKey(dict
); 
2254                 bestkey 
= dictGetKey(de
); 
2257             /* volatile-lru and allkeys-lru policy */ 
2258             else if (server
.maxmemory_policy 
== REDIS_MAXMEMORY_ALLKEYS_LRU 
|| 
2259                 server
.maxmemory_policy 
== REDIS_MAXMEMORY_VOLATILE_LRU
) 
2261                 for (k 
= 0; k 
< server
.maxmemory_samples
; k
++) { 
2266                     de 
= dictGetRandomKey(dict
); 
2267                     thiskey 
= dictGetKey(de
); 
2268                     /* When policy is volatile-lru we need an additonal lookup 
2269                      * to locate the real key, as dict is set to db->expires. */ 
2270                     if (server
.maxmemory_policy 
== REDIS_MAXMEMORY_VOLATILE_LRU
) 
2271                         de 
= dictFind(db
->dict
, thiskey
); 
2273                     thisval 
= estimateObjectIdleTime(o
); 
2275                     /* Higher idle time is better candidate for deletion */ 
2276                     if (bestkey 
== NULL 
|| thisval 
> bestval
) { 
2284             else if (server
.maxmemory_policy 
== REDIS_MAXMEMORY_VOLATILE_TTL
) { 
2285                 for (k 
= 0; k 
< server
.maxmemory_samples
; k
++) { 
2289                     de 
= dictGetRandomKey(dict
); 
2290                     thiskey 
= dictGetKey(de
); 
2291                     thisval 
= (long) dictGetVal(de
); 
2293                     /* Expire sooner (minor expire unix timestamp) is better 
2294                      * candidate for deletion */ 
2295                     if (bestkey 
== NULL 
|| thisval 
< bestval
) { 
2302             /* Finally remove the selected key. */ 
2306                 robj 
*keyobj 
= createStringObject(bestkey
,sdslen(bestkey
)); 
2307                 propagateExpire(db
,keyobj
); 
2308                 /* We compute the amount of memory freed by dbDelete() alone. 
2309                  * It is possible that actually the memory needed to propagate 
2310                  * the DEL in AOF and replication link is greater than the one 
2311                  * we are freeing removing the key, but we can't account for 
2312                  * that otherwise we would never exit the loop. 
2314                  * AOF and Output buffer memory will be freed eventually so 
2315                  * we only care about memory used by the key space. */ 
2316                 delta 
= (long long) zmalloc_used_memory(); 
2317                 dbDelete(db
,keyobj
); 
2318                 delta 
-= (long long) zmalloc_used_memory(); 
2320                 server
.stat_evictedkeys
++; 
2321                 decrRefCount(keyobj
); 
2324                 /* When the memory to free starts to be big enough, we may 
2325                  * start spending so much time here that is impossible to 
2326                  * deliver data to the slaves fast enough, so we force the 
2327                  * transmission here inside the loop. */ 
2328                 if (slaves
) flushSlavesOutputBuffers(); 
2331         if (!keys_freed
) return REDIS_ERR
; /* nothing to free... */ 
2336 /* =================================== Main! ================================ */ 
2339 int linuxOvercommitMemoryValue(void) { 
2340     FILE *fp 
= fopen("/proc/sys/vm/overcommit_memory","r"); 
2344     if (fgets(buf
,64,fp
) == NULL
) { 
2353 void linuxOvercommitMemoryWarning(void) { 
2354     if (linuxOvercommitMemoryValue() == 0) { 
2355         redisLog(REDIS_WARNING
,"WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect."); 
2358 #endif /* __linux__ */ 
2360 void createPidFile(void) { 
2361     /* Try to write the pid file in a best-effort way. */ 
2362     FILE *fp 
= fopen(server
.pidfile
,"w"); 
2364         fprintf(fp
,"%d\n",(int)getpid()); 
2369 void daemonize(void) { 
2372     if (fork() != 0) exit(0); /* parent exits */ 
2373     setsid(); /* create a new session */ 
2375     /* Every output goes to /dev/null. If Redis is daemonized but 
2376      * the 'logfile' is set to 'stdout' in the configuration file 
2377      * it will not log at all. */ 
2378     if ((fd 
= open("/dev/null", O_RDWR
, 0)) != -1) { 
2379         dup2(fd
, STDIN_FILENO
); 
2380         dup2(fd
, STDOUT_FILENO
); 
2381         dup2(fd
, STDERR_FILENO
); 
2382         if (fd 
> STDERR_FILENO
) close(fd
); 
2387     printf("Redis server v=%s sha=%s:%d malloc=%s bits=%d\n", 
2390         atoi(redisGitDirty()) > 0, 
2392         sizeof(long) == 4 ? 32 : 64); 
2397     fprintf(stderr
,"Usage: ./redis-server [/path/to/redis.conf] [options]\n"); 
2398     fprintf(stderr
,"       ./redis-server - (read config from stdin)\n"); 
2399     fprintf(stderr
,"       ./redis-server -v or --version\n"); 
2400     fprintf(stderr
,"       ./redis-server -h or --help\n"); 
2401     fprintf(stderr
,"       ./redis-server --test-memory <megabytes>\n\n"); 
2402     fprintf(stderr
,"Examples:\n"); 
2403     fprintf(stderr
,"       ./redis-server (run the server with default conf)\n"); 
2404     fprintf(stderr
,"       ./redis-server /etc/redis/6379.conf\n"); 
2405     fprintf(stderr
,"       ./redis-server --port 7777\n"); 
2406     fprintf(stderr
,"       ./redis-server --port 7777 --slaveof 127.0.0.1 8888\n"); 
2407     fprintf(stderr
,"       ./redis-server /etc/myredis.conf --loglevel verbose\n\n"); 
2408     fprintf(stderr
,"Sentinel mode:\n"); 
2409     fprintf(stderr
,"       ./redis-server /etc/sentinel.conf --sentinel\n"); 
2413 void redisAsciiArt(void) { 
2414 #include "asciilogo.h" 
2415     char *buf 
= zmalloc(1024*16); 
2416     char *mode 
= "stand alone"; 
2418     if (server
.sentinel_mode
) mode 
= "sentinel"; 
2420     snprintf(buf
,1024*16,ascii_logo
, 
2423         strtol(redisGitDirty(),NULL
,10) > 0, 
2424         (sizeof(long) == 8) ? "64" : "32", 
2428     redisLogRaw(REDIS_NOTICE
|REDIS_LOG_RAW
,buf
); 
2432 static void sigtermHandler(int sig
) { 
2435     redisLogFromHandler(REDIS_WARNING
,"Received SIGTERM, scheduling shutdown..."); 
2436     server
.shutdown_asap 
= 1; 
2439 void setupSignalHandlers(void) { 
2440     struct sigaction act
; 
2442     /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used. 
2443      * Otherwise, sa_handler is used. */ 
2444     sigemptyset(&act
.sa_mask
); 
2446     act
.sa_handler 
= sigtermHandler
; 
2447     sigaction(SIGTERM
, &act
, NULL
); 
2449 #ifdef HAVE_BACKTRACE 
2450     sigemptyset(&act
.sa_mask
); 
2451     act
.sa_flags 
= SA_NODEFER 
| SA_RESETHAND 
| SA_SIGINFO
; 
2452     act
.sa_sigaction 
= sigsegvHandler
; 
2453     sigaction(SIGSEGV
, &act
, NULL
); 
2454     sigaction(SIGBUS
, &act
, NULL
); 
2455     sigaction(SIGFPE
, &act
, NULL
); 
2456     sigaction(SIGILL
, &act
, NULL
); 
2461 void memtest(size_t megabytes
, int passes
); 
2463 /* Returns 1 if there is --sentinel among the arguments or if 
2464  * argv[0] is exactly "redis-sentinel". */ 
2465 int checkForSentinelMode(int argc
, char **argv
) { 
2468     if (strstr(argv
[0],"redis-sentinel") != NULL
) return 1; 
2469     for (j 
= 1; j 
< argc
; j
++) 
2470         if (!strcmp(argv
[j
],"--sentinel")) return 1; 
2474 /* Function called at startup to load RDB or AOF file in memory. */ 
2475 void loadDataFromDisk(void) { 
2476     long long start 
= ustime(); 
2477     if (server
.aof_state 
== REDIS_AOF_ON
) { 
2478         if (loadAppendOnlyFile(server
.aof_filename
) == REDIS_OK
) 
2479             redisLog(REDIS_NOTICE
,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start
)/1000000); 
2481         if (rdbLoad(server
.rdb_filename
) == REDIS_OK
) { 
2482             redisLog(REDIS_NOTICE
,"DB loaded from disk: %.3f seconds", 
2483                 (float)(ustime()-start
)/1000000); 
2484         } else if (errno 
!= ENOENT
) { 
2485             redisLog(REDIS_WARNING
,"Fatal error loading the DB. Exiting."); 
2491 void redisOutOfMemoryHandler(size_t allocation_size
) { 
2492     redisLog(REDIS_WARNING
,"Out Of Memory allocating %zu bytes!", 
2497 int main(int argc
, char **argv
) { 
2500     /* We need to initialize our libraries, and the server configuration. */ 
2501     zmalloc_enable_thread_safeness(); 
2502     zmalloc_set_oom_handler(redisOutOfMemoryHandler
); 
2503     srand(time(NULL
)^getpid()); 
2504     gettimeofday(&tv
,NULL
); 
2505     dictSetHashFunctionSeed(tv
.tv_sec
^tv
.tv_usec
^getpid()); 
2506     server
.sentinel_mode 
= checkForSentinelMode(argc
,argv
); 
2509     /* We need to init sentinel right now as parsing the configuration file 
2510      * in sentinel mode will have the effect of populating the sentinel 
2511      * data structures with master nodes to monitor. */ 
2512     if (server
.sentinel_mode
) { 
2513         initSentinelConfig(); 
2518         int j 
= 1; /* First option to parse in argv[] */ 
2519         sds options 
= sdsempty(); 
2520         char *configfile 
= NULL
; 
2522         /* Handle special options --help and --version */ 
2523         if (strcmp(argv
[1], "-v") == 0 || 
2524             strcmp(argv
[1], "--version") == 0) version(); 
2525         if (strcmp(argv
[1], "--help") == 0 || 
2526             strcmp(argv
[1], "-h") == 0) usage(); 
2527         if (strcmp(argv
[1], "--test-memory") == 0) { 
2529                 memtest(atoi(argv
[2]),50); 
2532                 fprintf(stderr
,"Please specify the amount of memory to test in megabytes.\n"); 
2533                 fprintf(stderr
,"Example: ./redis-server --test-memory 4096\n\n"); 
2538         /* First argument is the config file name? */ 
2539         if (argv
[j
][0] != '-' || argv
[j
][1] != '-') 
2540             configfile 
= argv
[j
++]; 
2541         /* All the other options are parsed and conceptually appended to the 
2542          * configuration file. For instance --port 6380 will generate the 
2543          * string "port 6380\n" to be parsed after the actual file name 
2544          * is parsed, if any. */ 
2546             if (argv
[j
][0] == '-' && argv
[j
][1] == '-') { 
2548                 if (sdslen(options
)) options 
= sdscat(options
,"\n"); 
2549                 options 
= sdscat(options
,argv
[j
]+2); 
2550                 options 
= sdscat(options
," "); 
2552                 /* Option argument */ 
2553                 options 
= sdscatrepr(options
,argv
[j
],strlen(argv
[j
])); 
2554                 options 
= sdscat(options
," "); 
2558         resetServerSaveParams(); 
2559         loadServerConfig(configfile
,options
); 
2562         redisLog(REDIS_WARNING
, "Warning: no config file specified, using the default config. In order to specify a config file use %s /path/to/%s.conf", argv
[0], server
.sentinel_mode 
? "sentinel" : "redis"); 
2564     if (server
.daemonize
) daemonize(); 
2566     if (server
.daemonize
) createPidFile(); 
2569     if (!server
.sentinel_mode
) { 
2570         /* Things only needed when not runnign in Sentinel mode. */ 
2571         redisLog(REDIS_WARNING
,"Server started, Redis version " REDIS_VERSION
); 
2573         linuxOvercommitMemoryWarning(); 
2576         if (server
.ipfd 
> 0) 
2577             redisLog(REDIS_NOTICE
,"The server is now ready to accept connections on port %d", server
.port
); 
2578         if (server
.sofd 
> 0) 
2579             redisLog(REDIS_NOTICE
,"The server is now ready to accept connections at %s", server
.unixsocket
); 
2582     /* Warning the user about suspicious maxmemory setting. */ 
2583     if (server
.maxmemory 
> 0 && server
.maxmemory 
< 1024*1024) { 
2584         redisLog(REDIS_WARNING
,"WARNING: You specified a maxmemory value that is less than 1MB (current value is %llu bytes). Are you sure this is what you really want?", server
.maxmemory
); 
2587     aeSetBeforeSleepProc(server
.el
,beforeSleep
); 
2589     aeDeleteEventLoop(server
.el
);