]> git.saurik.com Git - redis.git/blame_incremental - src/redis.c
New client info field added to CLIENT LIST output: multi, containing the length of...
[redis.git] / src / redis.c
... / ...
CommitLineData
1/*
2 * Copyright (c) 2009-2010, Salvatore Sanfilippo <antirez at gmail dot com>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
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.
16 *
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.
28 */
29
30#include "redis.h"
31#include "slowlog.h"
32#include "bio.h"
33
34#include <time.h>
35#include <signal.h>
36#include <sys/wait.h>
37#include <errno.h>
38#include <assert.h>
39#include <ctype.h>
40#include <stdarg.h>
41#include <arpa/inet.h>
42#include <sys/stat.h>
43#include <fcntl.h>
44#include <sys/time.h>
45#include <sys/resource.h>
46#include <sys/uio.h>
47#include <limits.h>
48#include <float.h>
49#include <math.h>
50#include <sys/resource.h>
51#include <sys/utsname.h>
52
53/* Our shared "common" objects */
54
55struct sharedObjectsStruct shared;
56
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. */
60
61double R_Zero, R_PosInf, R_NegInf, R_Nan;
62
63/*================================= Globals ================================= */
64
65/* Alternate stack for SIGSEGV/etc handlers */
66char altstack[SIGSTKSZ];
67
68/* Global vars */
69struct redisServer server; /* server global state */
70struct redisCommand *commandTable;
71
72/* Our command table.
73 *
74 * Every entry is composed of the following fields:
75 *
76 * name: a string representing the command name.
77 * function: pointer to the C function implementing the command.
78 * arity: number of arguments, it is possible to use -N to say >= N
79 * sflags: command flags as string. See below for a table of flags.
80 * flags: flags as bitmask. Computed by Redis using the 'sflags' field.
81 * get_keys_proc: an optional function to get key arguments from a command.
82 * This is only used when the following three fields are not
83 * enough to specify what arguments are keys.
84 * first_key_index: first argument that is a key
85 * last_key_index: last argument that is a key
86 * key_step: step to get all the keys from first to last argument. For instance
87 * in MSET the step is two since arguments are key,val,key,val,...
88 * microseconds: microseconds of total execution time for this command.
89 * calls: total number of calls of this command.
90 *
91 * The flags, microseconds and calls fields are computed by Redis and should
92 * always be set to zero.
93 *
94 * Command flags are expressed using strings where every character represents
95 * a flag. Later the populateCommandTable() function will take care of
96 * populating the real 'flags' field using this characters.
97 *
98 * This is the meaning of the flags:
99 *
100 * w: write command (may modify the key space).
101 * r: read command (will never modify the key space).
102 * m: may increase memory usage once called. Don't allow if out of memory.
103 * a: admin command, like SAVE or SHUTDOWN.
104 * p: Pub/Sub related command.
105 * f: force replication of this command, regarless of server.dirty.
106 * s: command not allowed in scripts.
107 * R: random command. Command is not deterministic, that is, the same command
108 * with the same arguments, with the same key space, may have different
109 * results. For instance SPOP and RANDOMKEY are two random commands.
110 * S: Sort command output array if called from script, so that the output
111 * is deterministic.
112 */
113struct redisCommand redisCommandTable[] = {
114 {"get",getCommand,2,"r",0,NULL,1,1,1,0,0},
115 {"set",setCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
116 {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0},
117 {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},
118 {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0},
119 {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0},
120 {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0},
121 {"del",delCommand,-2,"w",0,noPreloadGetKeys,1,-1,1,0,0},
122 {"exists",existsCommand,2,"r",0,NULL,1,1,1,0,0},
123 {"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0},
124 {"getbit",getbitCommand,3,"r",0,NULL,1,1,1,0,0},
125 {"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0},
126 {"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
127 {"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0},
128 {"incr",incrCommand,2,"wm",0,NULL,1,1,1,0,0},
129 {"decr",decrCommand,2,"wm",0,NULL,1,1,1,0,0},
130 {"mget",mgetCommand,-2,"r",0,NULL,1,-1,1,0,0},
131 {"rpush",rpushCommand,-3,"wm",0,NULL,1,1,1,0,0},
132 {"lpush",lpushCommand,-3,"wm",0,NULL,1,1,1,0,0},
133 {"rpushx",rpushxCommand,3,"wm",0,NULL,1,1,1,0,0},
134 {"lpushx",lpushxCommand,3,"wm",0,NULL,1,1,1,0,0},
135 {"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0},
136 {"rpop",rpopCommand,2,"w",0,NULL,1,1,1,0,0},
137 {"lpop",lpopCommand,2,"w",0,NULL,1,1,1,0,0},
138 {"brpop",brpopCommand,-3,"ws",0,NULL,1,1,1,0,0},
139 {"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0},
140 {"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0},
141 {"llen",llenCommand,2,"r",0,NULL,1,1,1,0,0},
142 {"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0},
143 {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0},
144 {"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0},
145 {"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0},
146 {"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0},
147 {"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0},
148 {"sadd",saddCommand,-3,"wm",0,NULL,1,1,1,0,0},
149 {"srem",sremCommand,-3,"w",0,NULL,1,1,1,0,0},
150 {"smove",smoveCommand,4,"w",0,NULL,1,2,1,0,0},
151 {"sismember",sismemberCommand,3,"r",0,NULL,1,1,1,0,0},
152 {"scard",scardCommand,2,"r",0,NULL,1,1,1,0,0},
153 {"spop",spopCommand,2,"wRs",0,NULL,1,1,1,0,0},
154 {"srandmember",srandmemberCommand,2,"rR",0,NULL,1,1,1,0,0},
155 {"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0},
156 {"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
157 {"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0},
158 {"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
159 {"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0},
160 {"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0},
161 {"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0},
162 {"zadd",zaddCommand,-4,"wm",0,NULL,1,1,1,0,0},
163 {"zincrby",zincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},
164 {"zrem",zremCommand,-3,"w",0,NULL,1,1,1,0,0},
165 {"zremrangebyscore",zremrangebyscoreCommand,4,"w",0,NULL,1,1,1,0,0},
166 {"zremrangebyrank",zremrangebyrankCommand,4,"w",0,NULL,1,1,1,0,0},
167 {"zunionstore",zunionstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},
168 {"zinterstore",zinterstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0},
169 {"zrange",zrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
170 {"zrangebyscore",zrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},
171 {"zrevrangebyscore",zrevrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0},
172 {"zcount",zcountCommand,4,"r",0,NULL,1,1,1,0,0},
173 {"zrevrange",zrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0},
174 {"zcard",zcardCommand,2,"r",0,NULL,1,1,1,0,0},
175 {"zscore",zscoreCommand,3,"r",0,NULL,1,1,1,0,0},
176 {"zrank",zrankCommand,3,"r",0,NULL,1,1,1,0,0},
177 {"zrevrank",zrevrankCommand,3,"r",0,NULL,1,1,1,0,0},
178 {"hset",hsetCommand,4,"wm",0,NULL,1,1,1,0,0},
179 {"hsetnx",hsetnxCommand,4,"wm",0,NULL,1,1,1,0,0},
180 {"hget",hgetCommand,3,"r",0,NULL,1,1,1,0,0},
181 {"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0},
182 {"hmget",hmgetCommand,-3,"r",0,NULL,1,1,1,0,0},
183 {"hincrby",hincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},
184 {"hincrbyfloat",hincrbyfloatCommand,4,"wm",0,NULL,1,1,1,0,0},
185 {"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0},
186 {"hlen",hlenCommand,2,"r",0,NULL,1,1,1,0,0},
187 {"hkeys",hkeysCommand,2,"rS",0,NULL,1,1,1,0,0},
188 {"hvals",hvalsCommand,2,"rS",0,NULL,1,1,1,0,0},
189 {"hgetall",hgetallCommand,2,"r",0,NULL,1,1,1,0,0},
190 {"hexists",hexistsCommand,3,"r",0,NULL,1,1,1,0,0},
191 {"incrby",incrbyCommand,3,"wm",0,NULL,1,1,1,0,0},
192 {"decrby",decrbyCommand,3,"wm",0,NULL,1,1,1,0,0},
193 {"incrbyfloat",incrbyfloatCommand,3,"wm",0,NULL,1,1,1,0,0},
194 {"getset",getsetCommand,3,"wm",0,NULL,1,1,1,0,0},
195 {"mset",msetCommand,-3,"wm",0,NULL,1,-1,2,0,0},
196 {"msetnx",msetnxCommand,-3,"wm",0,NULL,1,-1,2,0,0},
197 {"randomkey",randomkeyCommand,1,"rR",0,NULL,0,0,0,0,0},
198 {"select",selectCommand,2,"r",0,NULL,0,0,0,0,0},
199 {"move",moveCommand,3,"w",0,NULL,1,1,1,0,0},
200 {"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0},
201 {"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0},
202 {"expire",expireCommand,3,"w",0,NULL,1,1,1,0,0},
203 {"expireat",expireatCommand,3,"w",0,NULL,1,1,1,0,0},
204 {"pexpire",pexpireCommand,3,"w",0,NULL,1,1,1,0,0},
205 {"pexpireat",pexpireatCommand,3,"w",0,NULL,1,1,1,0,0},
206 {"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0},
207 {"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0},
208 {"auth",authCommand,2,"rs",0,NULL,0,0,0,0,0},
209 {"ping",pingCommand,1,"r",0,NULL,0,0,0,0,0},
210 {"echo",echoCommand,2,"r",0,NULL,0,0,0,0,0},
211 {"save",saveCommand,1,"ars",0,NULL,0,0,0,0,0},
212 {"bgsave",bgsaveCommand,1,"ar",0,NULL,0,0,0,0,0},
213 {"bgrewriteaof",bgrewriteaofCommand,1,"ar",0,NULL,0,0,0,0,0},
214 {"shutdown",shutdownCommand,-1,"ar",0,NULL,0,0,0,0,0},
215 {"lastsave",lastsaveCommand,1,"r",0,NULL,0,0,0,0,0},
216 {"type",typeCommand,2,"r",0,NULL,1,1,1,0,0},
217 {"multi",multiCommand,1,"rs",0,NULL,0,0,0,0,0},
218 {"exec",execCommand,1,"s",0,NULL,0,0,0,0,0},
219 {"discard",discardCommand,1,"rs",0,NULL,0,0,0,0,0},
220 {"sync",syncCommand,1,"ars",0,NULL,0,0,0,0,0},
221 {"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0},
222 {"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0},
223 {"sort",sortCommand,-2,"wmS",0,NULL,1,1,1,0,0},
224 {"info",infoCommand,-1,"r",0,NULL,0,0,0,0,0},
225 {"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0},
226 {"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0},
227 {"pttl",pttlCommand,2,"r",0,NULL,1,1,1,0,0},
228 {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0},
229 {"slaveof",slaveofCommand,3,"as",0,NULL,0,0,0,0,0},
230 {"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0},
231 {"config",configCommand,-2,"ar",0,NULL,0,0,0,0,0},
232 {"subscribe",subscribeCommand,-2,"rps",0,NULL,0,0,0,0,0},
233 {"unsubscribe",unsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0},
234 {"psubscribe",psubscribeCommand,-2,"rps",0,NULL,0,0,0,0,0},
235 {"punsubscribe",punsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0},
236 {"publish",publishCommand,3,"pf",0,NULL,0,0,0,0,0},
237 {"watch",watchCommand,-2,"rs",0,noPreloadGetKeys,1,-1,1,0,0},
238 {"unwatch",unwatchCommand,1,"rs",0,NULL,0,0,0,0,0},
239 {"cluster",clusterCommand,-2,"ar",0,NULL,0,0,0,0,0},
240 {"restore",restoreCommand,4,"awm",0,NULL,1,1,1,0,0},
241 {"migrate",migrateCommand,6,"aw",0,NULL,0,0,0,0,0},
242 {"asking",askingCommand,1,"r",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};
252
253/*============================ Utility functions ============================ */
254
255/* Low level logging. To use only for very big messages, otherwise
256 * redisLog() is to prefer. */
257void redisLogRaw(int level, const char *msg) {
258 const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING };
259 const char *c = ".-*#";
260 FILE *fp;
261 char buf[64];
262 int rawmode = (level & REDIS_LOG_RAW);
263
264 level &= 0xff; /* clear flags */
265 if (level < server.verbosity) return;
266
267 fp = (server.logfile == NULL) ? stdout : fopen(server.logfile,"a");
268 if (!fp) return;
269
270 if (rawmode) {
271 fprintf(fp,"%s",msg);
272 } else {
273 int off;
274 struct timeval tv;
275
276 gettimeofday(&tv,NULL);
277 off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec));
278 snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000);
279 fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg);
280 }
281 fflush(fp);
282
283 if (server.logfile) fclose(fp);
284
285 if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg);
286}
287
288/* Like redisLogRaw() but with printf-alike support. This is the funciton that
289 * is used across the code. The raw version is only used in order to dump
290 * the INFO output on crash. */
291void redisLog(int level, const char *fmt, ...) {
292 va_list ap;
293 char msg[REDIS_MAX_LOGMSG_LEN];
294
295 if ((level&0xff) < server.verbosity) return;
296
297 va_start(ap, fmt);
298 vsnprintf(msg, sizeof(msg), fmt, ap);
299 va_end(ap);
300
301 redisLogRaw(level,msg);
302}
303
304/* Log a fixed message without printf-alike capabilities, in a way that is
305 * safe to call from a signal handler.
306 *
307 * We actually use this only for signals that are not fatal from the point
308 * of view of Redis. Signals that are going to kill the server anyway and
309 * where we need printf-alike features are served by redisLog(). */
310void redisLogFromHandler(int level, const char *msg) {
311 int fd;
312 char buf[64];
313
314 if ((level&0xff) < server.verbosity ||
315 (server.logfile == NULL && server.daemonize)) return;
316 fd = server.logfile ?
317 open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) :
318 STDOUT_FILENO;
319 if (fd == -1) return;
320 ll2string(buf,sizeof(buf),getpid());
321 write(fd,"[",1);
322 write(fd,buf,strlen(buf));
323 write(fd," | signal handler] (",20);
324 ll2string(buf,sizeof(buf),time(NULL));
325 write(fd,buf,strlen(buf));
326 write(fd,") ",2);
327 write(fd,msg,strlen(msg));
328 write(fd,"\n",1);
329 if (server.logfile) close(fd);
330}
331
332/* Redis generally does not try to recover from out of memory conditions
333 * when allocating objects or strings, it is not clear if it will be possible
334 * to report this condition to the client since the networking layer itself
335 * is based on heap allocation for send buffers, so we simply abort.
336 * At least the code will be simpler to read... */
337void oom(const char *msg) {
338 redisLog(REDIS_WARNING, "%s: Out of memory\n",msg);
339 sleep(1);
340 abort();
341}
342
343/* Return the UNIX time in microseconds */
344long long ustime(void) {
345 struct timeval tv;
346 long long ust;
347
348 gettimeofday(&tv, NULL);
349 ust = ((long long)tv.tv_sec)*1000000;
350 ust += tv.tv_usec;
351 return ust;
352}
353
354/* Return the UNIX time in milliseconds */
355long long mstime(void) {
356 return ustime()/1000;
357}
358
359/*====================== Hash table type implementation ==================== */
360
361/* This is an hash table type that uses the SDS dynamic strings libary as
362 * keys and radis objects as values (objects can hold SDS strings,
363 * lists, sets). */
364
365void dictVanillaFree(void *privdata, void *val)
366{
367 DICT_NOTUSED(privdata);
368 zfree(val);
369}
370
371void dictListDestructor(void *privdata, void *val)
372{
373 DICT_NOTUSED(privdata);
374 listRelease((list*)val);
375}
376
377int dictSdsKeyCompare(void *privdata, const void *key1,
378 const void *key2)
379{
380 int l1,l2;
381 DICT_NOTUSED(privdata);
382
383 l1 = sdslen((sds)key1);
384 l2 = sdslen((sds)key2);
385 if (l1 != l2) return 0;
386 return memcmp(key1, key2, l1) == 0;
387}
388
389/* A case insensitive version used for the command lookup table. */
390int dictSdsKeyCaseCompare(void *privdata, const void *key1,
391 const void *key2)
392{
393 DICT_NOTUSED(privdata);
394
395 return strcasecmp(key1, key2) == 0;
396}
397
398void dictRedisObjectDestructor(void *privdata, void *val)
399{
400 DICT_NOTUSED(privdata);
401
402 if (val == NULL) return; /* Values of swapped out keys as set to NULL */
403 decrRefCount(val);
404}
405
406void dictSdsDestructor(void *privdata, void *val)
407{
408 DICT_NOTUSED(privdata);
409
410 sdsfree(val);
411}
412
413int dictObjKeyCompare(void *privdata, const void *key1,
414 const void *key2)
415{
416 const robj *o1 = key1, *o2 = key2;
417 return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);
418}
419
420unsigned int dictObjHash(const void *key) {
421 const robj *o = key;
422 return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));
423}
424
425unsigned int dictSdsHash(const void *key) {
426 return dictGenHashFunction((unsigned char*)key, sdslen((char*)key));
427}
428
429unsigned int dictSdsCaseHash(const void *key) {
430 return dictGenCaseHashFunction((unsigned char*)key, sdslen((char*)key));
431}
432
433int dictEncObjKeyCompare(void *privdata, const void *key1,
434 const void *key2)
435{
436 robj *o1 = (robj*) key1, *o2 = (robj*) key2;
437 int cmp;
438
439 if (o1->encoding == REDIS_ENCODING_INT &&
440 o2->encoding == REDIS_ENCODING_INT)
441 return o1->ptr == o2->ptr;
442
443 o1 = getDecodedObject(o1);
444 o2 = getDecodedObject(o2);
445 cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);
446 decrRefCount(o1);
447 decrRefCount(o2);
448 return cmp;
449}
450
451unsigned int dictEncObjHash(const void *key) {
452 robj *o = (robj*) key;
453
454 if (o->encoding == REDIS_ENCODING_RAW) {
455 return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));
456 } else {
457 if (o->encoding == REDIS_ENCODING_INT) {
458 char buf[32];
459 int len;
460
461 len = ll2string(buf,32,(long)o->ptr);
462 return dictGenHashFunction((unsigned char*)buf, len);
463 } else {
464 unsigned int hash;
465
466 o = getDecodedObject(o);
467 hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));
468 decrRefCount(o);
469 return hash;
470 }
471 }
472}
473
474/* Sets type hash table */
475dictType setDictType = {
476 dictEncObjHash, /* hash function */
477 NULL, /* key dup */
478 NULL, /* val dup */
479 dictEncObjKeyCompare, /* key compare */
480 dictRedisObjectDestructor, /* key destructor */
481 NULL /* val destructor */
482};
483
484/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */
485dictType zsetDictType = {
486 dictEncObjHash, /* hash function */
487 NULL, /* key dup */
488 NULL, /* val dup */
489 dictEncObjKeyCompare, /* key compare */
490 dictRedisObjectDestructor, /* key destructor */
491 NULL /* val destructor */
492};
493
494/* Db->dict, keys are sds strings, vals are Redis objects. */
495dictType dbDictType = {
496 dictSdsHash, /* hash function */
497 NULL, /* key dup */
498 NULL, /* val dup */
499 dictSdsKeyCompare, /* key compare */
500 dictSdsDestructor, /* key destructor */
501 dictRedisObjectDestructor /* val destructor */
502};
503
504/* Db->expires */
505dictType keyptrDictType = {
506 dictSdsHash, /* hash function */
507 NULL, /* key dup */
508 NULL, /* val dup */
509 dictSdsKeyCompare, /* key compare */
510 NULL, /* key destructor */
511 NULL /* val destructor */
512};
513
514/* Command table. sds string -> command struct pointer. */
515dictType commandTableDictType = {
516 dictSdsCaseHash, /* hash function */
517 NULL, /* key dup */
518 NULL, /* val dup */
519 dictSdsKeyCaseCompare, /* key compare */
520 dictSdsDestructor, /* key destructor */
521 NULL /* val destructor */
522};
523
524/* Hash type hash table (note that small hashes are represented with zimpaps) */
525dictType hashDictType = {
526 dictEncObjHash, /* hash function */
527 NULL, /* key dup */
528 NULL, /* val dup */
529 dictEncObjKeyCompare, /* key compare */
530 dictRedisObjectDestructor, /* key destructor */
531 dictRedisObjectDestructor /* val destructor */
532};
533
534/* Keylist hash table type has unencoded redis objects as keys and
535 * lists as values. It's used for blocking operations (BLPOP) and to
536 * map swapped keys to a list of clients waiting for this keys to be loaded. */
537dictType keylistDictType = {
538 dictObjHash, /* hash function */
539 NULL, /* key dup */
540 NULL, /* val dup */
541 dictObjKeyCompare, /* key compare */
542 dictRedisObjectDestructor, /* key destructor */
543 dictListDestructor /* val destructor */
544};
545
546/* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to
547 * clusterNode structures. */
548dictType clusterNodesDictType = {
549 dictSdsHash, /* hash function */
550 NULL, /* key dup */
551 NULL, /* val dup */
552 dictSdsKeyCompare, /* key compare */
553 dictSdsDestructor, /* key destructor */
554 NULL /* val destructor */
555};
556
557int htNeedsResize(dict *dict) {
558 long long size, used;
559
560 size = dictSlots(dict);
561 used = dictSize(dict);
562 return (size && used && size > DICT_HT_INITIAL_SIZE &&
563 (used*100/size < REDIS_HT_MINFILL));
564}
565
566/* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL
567 * we resize the hash table to save memory */
568void tryResizeHashTables(void) {
569 int j;
570
571 for (j = 0; j < server.dbnum; j++) {
572 if (htNeedsResize(server.db[j].dict))
573 dictResize(server.db[j].dict);
574 if (htNeedsResize(server.db[j].expires))
575 dictResize(server.db[j].expires);
576 }
577}
578
579/* Our hash table implementation performs rehashing incrementally while
580 * we write/read from the hash table. Still if the server is idle, the hash
581 * table will use two tables for a long time. So we try to use 1 millisecond
582 * of CPU time at every serverCron() loop in order to rehash some key. */
583void incrementallyRehash(void) {
584 int j;
585
586 for (j = 0; j < server.dbnum; j++) {
587 if (dictIsRehashing(server.db[j].dict)) {
588 dictRehashMilliseconds(server.db[j].dict,1);
589 break; /* already used our millisecond for this loop... */
590 }
591 }
592}
593
594/* This function is called once a background process of some kind terminates,
595 * as we want to avoid resizing the hash tables when there is a child in order
596 * to play well with copy-on-write (otherwise when a resize happens lots of
597 * memory pages are copied). The goal of this function is to update the ability
598 * for dict.c to resize the hash tables accordingly to the fact we have o not
599 * running childs. */
600void updateDictResizePolicy(void) {
601 if (server.rdb_child_pid == -1 && server.aof_child_pid == -1)
602 dictEnableResize();
603 else
604 dictDisableResize();
605}
606
607/* ======================= Cron: called every 100 ms ======================== */
608
609/* Try to expire a few timed out keys. The algorithm used is adaptive and
610 * will use few CPU cycles if there are few expiring keys, otherwise
611 * it will get more aggressive to avoid that too much memory is used by
612 * keys that can be removed from the keyspace. */
613void activeExpireCycle(void) {
614 int j;
615
616 for (j = 0; j < server.dbnum; j++) {
617 int expired;
618 redisDb *db = server.db+j;
619
620 /* Continue to expire if at the end of the cycle more than 25%
621 * of the keys were expired. */
622 do {
623 long num = dictSize(db->expires);
624 long long now = mstime();
625
626 expired = 0;
627 if (num > REDIS_EXPIRELOOKUPS_PER_CRON)
628 num = REDIS_EXPIRELOOKUPS_PER_CRON;
629 while (num--) {
630 dictEntry *de;
631 long long t;
632
633 if ((de = dictGetRandomKey(db->expires)) == NULL) break;
634 t = dictGetSignedIntegerVal(de);
635 if (now > t) {
636 sds key = dictGetKey(de);
637 robj *keyobj = createStringObject(key,sdslen(key));
638
639 propagateExpire(db,keyobj);
640 dbDelete(db,keyobj);
641 decrRefCount(keyobj);
642 expired++;
643 server.stat_expiredkeys++;
644 }
645 }
646 } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);
647 }
648}
649
650void updateLRUClock(void) {
651 server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) &
652 REDIS_LRU_CLOCK_MAX;
653}
654
655
656/* Add a sample to the operations per second array of samples. */
657void trackOperationsPerSecond(void) {
658 long long t = mstime() - server.ops_sec_last_sample_time;
659 long long ops = server.stat_numcommands - server.ops_sec_last_sample_ops;
660 long long ops_sec;
661
662 ops_sec = t > 0 ? (ops*1000/t) : 0;
663
664 server.ops_sec_samples[server.ops_sec_idx] = ops_sec;
665 server.ops_sec_idx = (server.ops_sec_idx+1) % REDIS_OPS_SEC_SAMPLES;
666 server.ops_sec_last_sample_time = mstime();
667 server.ops_sec_last_sample_ops = server.stat_numcommands;
668}
669
670/* Return the mean of all the samples. */
671long long getOperationsPerSecond(void) {
672 int j;
673 long long sum = 0;
674
675 for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++)
676 sum += server.ops_sec_samples[j];
677 return sum / REDIS_OPS_SEC_SAMPLES;
678}
679
680/* Check for timeouts. Returns non-zero if the client was terminated */
681int clientsCronHandleTimeout(redisClient *c) {
682 time_t now = server.unixtime;
683
684 if (server.maxidletime &&
685 !(c->flags & REDIS_SLAVE) && /* no timeout for slaves */
686 !(c->flags & REDIS_MASTER) && /* no timeout for masters */
687 !(c->flags & REDIS_BLOCKED) && /* no timeout for BLPOP */
688 dictSize(c->pubsub_channels) == 0 && /* no timeout for pubsub */
689 listLength(c->pubsub_patterns) == 0 &&
690 (now - c->lastinteraction > server.maxidletime))
691 {
692 redisLog(REDIS_VERBOSE,"Closing idle client");
693 freeClient(c);
694 return 1;
695 } else if (c->flags & REDIS_BLOCKED) {
696 if (c->bpop.timeout != 0 && c->bpop.timeout < now) {
697 addReply(c,shared.nullmultibulk);
698 unblockClientWaitingData(c);
699 }
700 }
701 return 0;
702}
703
704/* The client query buffer is an sds.c string that can end with a lot of
705 * free space not used, this function reclaims space if needed.
706 *
707 * The funciton always returns 0 as it never terminates the client. */
708int clientsCronResizeQueryBuffer(redisClient *c) {
709 size_t querybuf_size = sdsAllocSize(c->querybuf);
710 time_t idletime = server.unixtime - c->lastinteraction;
711
712 /* There are two conditions to resize the query buffer:
713 * 1) Query buffer is > BIG_ARG and too big for latest peak.
714 * 2) Client is inactive and the buffer is bigger than 1k. */
715 if (((querybuf_size > REDIS_MBULK_BIG_ARG) &&
716 (querybuf_size/(c->querybuf_peak+1)) > 2) ||
717 (querybuf_size > 1024 && idletime > 2))
718 {
719 /* Only resize the query buffer if it is actually wasting space. */
720 if (sdsavail(c->querybuf) > 1024) {
721 c->querybuf = sdsRemoveFreeSpace(c->querybuf);
722 }
723 }
724 /* Reset the peak again to capture the peak memory usage in the next
725 * cycle. */
726 c->querybuf_peak = 0;
727 return 0;
728}
729
730void clientsCron(void) {
731 /* Make sure to process at least 1/100 of clients per call.
732 * Since this function is called 10 times per second we are sure that
733 * in the worst case we process all the clients in 10 seconds.
734 * In normal conditions (a reasonable number of clients) we process
735 * all the clients in a shorter time. */
736 int numclients = listLength(server.clients);
737 int iterations = numclients/100;
738
739 if (iterations < 50)
740 iterations = (numclients < 50) ? numclients : 50;
741 while(listLength(server.clients) && iterations--) {
742 redisClient *c;
743 listNode *head;
744
745 /* Rotate the list, take the current head, process.
746 * This way if the client must be removed from the list it's the
747 * first element and we don't incur into O(N) computation. */
748 listRotate(server.clients);
749 head = listFirst(server.clients);
750 c = listNodeValue(head);
751 /* The following functions do different service checks on the client.
752 * The protocol is that they return non-zero if the client was
753 * terminated. */
754 if (clientsCronHandleTimeout(c)) continue;
755 if (clientsCronResizeQueryBuffer(c)) continue;
756 }
757}
758
759int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
760 int j, loops = server.cronloops;
761 REDIS_NOTUSED(eventLoop);
762 REDIS_NOTUSED(id);
763 REDIS_NOTUSED(clientData);
764
765 /* Software watchdog: deliver the SIGALRM that will reach the signal
766 * handler if we don't return here fast enough. */
767 if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period);
768
769 /* We take a cached value of the unix time in the global state because
770 * with virtual memory and aging there is to store the current time
771 * in objects at every object access, and accuracy is not needed.
772 * To access a global var is faster than calling time(NULL) */
773 server.unixtime = time(NULL);
774
775 trackOperationsPerSecond();
776
777 /* We have just 22 bits per object for LRU information.
778 * So we use an (eventually wrapping) LRU clock with 10 seconds resolution.
779 * 2^22 bits with 10 seconds resoluton is more or less 1.5 years.
780 *
781 * Note that even if this will wrap after 1.5 years it's not a problem,
782 * everything will still work but just some object will appear younger
783 * to Redis. But for this to happen a given object should never be touched
784 * for 1.5 years.
785 *
786 * Note that you can change the resolution altering the
787 * REDIS_LRU_CLOCK_RESOLUTION define.
788 */
789 updateLRUClock();
790
791 /* Record the max memory used since the server was started. */
792 if (zmalloc_used_memory() > server.stat_peak_memory)
793 server.stat_peak_memory = zmalloc_used_memory();
794
795 /* We received a SIGTERM, shutting down here in a safe way, as it is
796 * not ok doing so inside the signal handler. */
797 if (server.shutdown_asap) {
798 if (prepareForShutdown(0) == REDIS_OK) exit(0);
799 redisLog(REDIS_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information");
800 }
801
802 /* Show some info about non-empty databases */
803 for (j = 0; j < server.dbnum; j++) {
804 long long size, used, vkeys;
805
806 size = dictSlots(server.db[j].dict);
807 used = dictSize(server.db[j].dict);
808 vkeys = dictSize(server.db[j].expires);
809 if (!(loops % 50) && (used || vkeys)) {
810 redisLog(REDIS_VERBOSE,"DB %d: %lld keys (%lld volatile) in %lld slots HT.",j,used,vkeys,size);
811 /* dictPrintStats(server.dict); */
812 }
813 }
814
815 /* We don't want to resize the hash tables while a bacground saving
816 * is in progress: the saving child is created using fork() that is
817 * implemented with a copy-on-write semantic in most modern systems, so
818 * if we resize the HT while there is the saving child at work actually
819 * a lot of memory movements in the parent will cause a lot of pages
820 * copied. */
821 if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) {
822 if (!(loops % 10)) tryResizeHashTables();
823 if (server.activerehashing) incrementallyRehash();
824 }
825
826 /* Show information about connected clients */
827 if (!(loops % 50)) {
828 redisLog(REDIS_VERBOSE,"%d clients connected (%d slaves), %zu bytes in use",
829 listLength(server.clients)-listLength(server.slaves),
830 listLength(server.slaves),
831 zmalloc_used_memory());
832 }
833
834 /* We need to do a few operations on clients asynchronously. */
835 clientsCron();
836
837 /* Start a scheduled AOF rewrite if this was requested by the user while
838 * a BGSAVE was in progress. */
839 if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 &&
840 server.aof_rewrite_scheduled)
841 {
842 rewriteAppendOnlyFileBackground();
843 }
844
845 /* Check if a background saving or AOF rewrite in progress terminated. */
846 if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) {
847 int statloc;
848 pid_t pid;
849
850 if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) {
851 int exitcode = WEXITSTATUS(statloc);
852 int bysignal = 0;
853
854 if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);
855
856 if (pid == server.rdb_child_pid) {
857 backgroundSaveDoneHandler(exitcode,bysignal);
858 } else {
859 backgroundRewriteDoneHandler(exitcode,bysignal);
860 }
861 updateDictResizePolicy();
862 }
863 } else {
864 /* If there is not a background saving/rewrite in progress check if
865 * we have to save/rewrite now */
866 for (j = 0; j < server.saveparamslen; j++) {
867 struct saveparam *sp = server.saveparams+j;
868
869 if (server.dirty >= sp->changes &&
870 server.unixtime-server.lastsave > sp->seconds) {
871 redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...",
872 sp->changes, sp->seconds);
873 rdbSaveBackground(server.rdb_filename);
874 break;
875 }
876 }
877
878 /* Trigger an AOF rewrite if needed */
879 if (server.rdb_child_pid == -1 &&
880 server.aof_child_pid == -1 &&
881 server.aof_rewrite_perc &&
882 server.aof_current_size > server.aof_rewrite_min_size)
883 {
884 long long base = server.aof_rewrite_base_size ?
885 server.aof_rewrite_base_size : 1;
886 long long growth = (server.aof_current_size*100/base) - 100;
887 if (growth >= server.aof_rewrite_perc) {
888 redisLog(REDIS_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth);
889 rewriteAppendOnlyFileBackground();
890 }
891 }
892 }
893
894
895 /* If we postponed an AOF buffer flush, let's try to do it every time the
896 * cron function is called. */
897 if (server.aof_flush_postponed_start) flushAppendOnlyFile(0);
898
899 /* Expire a few keys per cycle, only if this is a master.
900 * On slaves we wait for DEL operations synthesized by the master
901 * in order to guarantee a strict consistency. */
902 if (server.masterhost == NULL) activeExpireCycle();
903
904 /* Close clients that need to be closed asynchronous */
905 freeClientsInAsyncFreeQueue();
906
907 /* Replication cron function -- used to reconnect to master and
908 * to detect transfer failures. */
909 if (!(loops % 10)) replicationCron();
910
911 /* Run other sub-systems specific cron jobs */
912 if (server.cluster_enabled && !(loops % 10)) clusterCron();
913
914 server.cronloops++;
915 return 100;
916}
917
918/* This function gets called every time Redis is entering the
919 * main loop of the event driven library, that is, before to sleep
920 * for ready file descriptors. */
921void beforeSleep(struct aeEventLoop *eventLoop) {
922 REDIS_NOTUSED(eventLoop);
923 listNode *ln;
924 redisClient *c;
925
926 /* Try to process pending commands for clients that were just unblocked. */
927 while (listLength(server.unblocked_clients)) {
928 ln = listFirst(server.unblocked_clients);
929 redisAssert(ln != NULL);
930 c = ln->value;
931 listDelNode(server.unblocked_clients,ln);
932 c->flags &= ~REDIS_UNBLOCKED;
933
934 /* Process remaining data in the input buffer. */
935 if (c->querybuf && sdslen(c->querybuf) > 0) {
936 server.current_client = c;
937 processInputBuffer(c);
938 server.current_client = NULL;
939 }
940 }
941
942 /* Write the AOF buffer on disk */
943 flushAppendOnlyFile(0);
944}
945
946/* =========================== Server initialization ======================== */
947
948void createSharedObjects(void) {
949 int j;
950
951 shared.crlf = createObject(REDIS_STRING,sdsnew("\r\n"));
952 shared.ok = createObject(REDIS_STRING,sdsnew("+OK\r\n"));
953 shared.err = createObject(REDIS_STRING,sdsnew("-ERR\r\n"));
954 shared.emptybulk = createObject(REDIS_STRING,sdsnew("$0\r\n\r\n"));
955 shared.czero = createObject(REDIS_STRING,sdsnew(":0\r\n"));
956 shared.cone = createObject(REDIS_STRING,sdsnew(":1\r\n"));
957 shared.cnegone = createObject(REDIS_STRING,sdsnew(":-1\r\n"));
958 shared.nullbulk = createObject(REDIS_STRING,sdsnew("$-1\r\n"));
959 shared.nullmultibulk = createObject(REDIS_STRING,sdsnew("*-1\r\n"));
960 shared.emptymultibulk = createObject(REDIS_STRING,sdsnew("*0\r\n"));
961 shared.pong = createObject(REDIS_STRING,sdsnew("+PONG\r\n"));
962 shared.queued = createObject(REDIS_STRING,sdsnew("+QUEUED\r\n"));
963 shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew(
964 "-ERR Operation against a key holding the wrong kind of value\r\n"));
965 shared.nokeyerr = createObject(REDIS_STRING,sdsnew(
966 "-ERR no such key\r\n"));
967 shared.syntaxerr = createObject(REDIS_STRING,sdsnew(
968 "-ERR syntax error\r\n"));
969 shared.sameobjecterr = createObject(REDIS_STRING,sdsnew(
970 "-ERR source and destination objects are the same\r\n"));
971 shared.outofrangeerr = createObject(REDIS_STRING,sdsnew(
972 "-ERR index out of range\r\n"));
973 shared.noscripterr = createObject(REDIS_STRING,sdsnew(
974 "-NOSCRIPT No matching script. Please use EVAL.\r\n"));
975 shared.loadingerr = createObject(REDIS_STRING,sdsnew(
976 "-LOADING Redis is loading the dataset in memory\r\n"));
977 shared.slowscripterr = createObject(REDIS_STRING,sdsnew(
978 "-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\r\n"));
979 shared.bgsaveerr = createObject(REDIS_STRING,sdsnew(
980 "-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"));
981 shared.roslaveerr = createObject(REDIS_STRING,sdsnew(
982 "-READONLY You can't write against a read only slave.\r\n"));
983 shared.oomerr = createObject(REDIS_STRING,sdsnew(
984 "-OOM command not allowed when used memory > 'maxmemory'.\r\n"));
985 shared.space = createObject(REDIS_STRING,sdsnew(" "));
986 shared.colon = createObject(REDIS_STRING,sdsnew(":"));
987 shared.plus = createObject(REDIS_STRING,sdsnew("+"));
988
989 for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) {
990 shared.select[j] = createObject(REDIS_STRING,
991 sdscatprintf(sdsempty(),"select %d\r\n", j));
992 }
993 shared.messagebulk = createStringObject("$7\r\nmessage\r\n",13);
994 shared.pmessagebulk = createStringObject("$8\r\npmessage\r\n",14);
995 shared.subscribebulk = createStringObject("$9\r\nsubscribe\r\n",15);
996 shared.unsubscribebulk = createStringObject("$11\r\nunsubscribe\r\n",18);
997 shared.psubscribebulk = createStringObject("$10\r\npsubscribe\r\n",17);
998 shared.punsubscribebulk = createStringObject("$12\r\npunsubscribe\r\n",19);
999 shared.del = createStringObject("DEL",3);
1000 shared.rpop = createStringObject("RPOP",4);
1001 shared.lpop = createStringObject("LPOP",4);
1002 for (j = 0; j < REDIS_SHARED_INTEGERS; j++) {
1003 shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j);
1004 shared.integers[j]->encoding = REDIS_ENCODING_INT;
1005 }
1006 for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) {
1007 shared.mbulkhdr[j] = createObject(REDIS_STRING,
1008 sdscatprintf(sdsempty(),"*%d\r\n",j));
1009 shared.bulkhdr[j] = createObject(REDIS_STRING,
1010 sdscatprintf(sdsempty(),"$%d\r\n",j));
1011 }
1012}
1013
1014void initServerConfig() {
1015 getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE);
1016 server.runid[REDIS_RUN_ID_SIZE] = '\0';
1017 server.arch_bits = (sizeof(long) == 8) ? 64 : 32;
1018 server.port = REDIS_SERVERPORT;
1019 server.bindaddr = NULL;
1020 server.unixsocket = NULL;
1021 server.unixsocketperm = 0;
1022 server.ipfd = -1;
1023 server.sofd = -1;
1024 server.dbnum = REDIS_DEFAULT_DBNUM;
1025 server.verbosity = REDIS_NOTICE;
1026 server.maxidletime = REDIS_MAXIDLETIME;
1027 server.client_max_querybuf_len = REDIS_MAX_QUERYBUF_LEN;
1028 server.saveparams = NULL;
1029 server.loading = 0;
1030 server.logfile = NULL; /* NULL = log on standard output */
1031 server.syslog_enabled = 0;
1032 server.syslog_ident = zstrdup("redis");
1033 server.syslog_facility = LOG_LOCAL0;
1034 server.daemonize = 0;
1035 server.aof_state = REDIS_AOF_OFF;
1036 server.aof_fsync = AOF_FSYNC_EVERYSEC;
1037 server.aof_no_fsync_on_rewrite = 0;
1038 server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC;
1039 server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE;
1040 server.aof_rewrite_base_size = 0;
1041 server.aof_rewrite_scheduled = 0;
1042 server.aof_last_fsync = time(NULL);
1043 server.aof_delayed_fsync = 0;
1044 server.aof_fd = -1;
1045 server.aof_selected_db = -1; /* Make sure the first time will not match */
1046 server.aof_flush_postponed_start = 0;
1047 server.pidfile = zstrdup("/var/run/redis.pid");
1048 server.rdb_filename = zstrdup("dump.rdb");
1049 server.aof_filename = zstrdup("appendonly.aof");
1050 server.requirepass = NULL;
1051 server.rdb_compression = 1;
1052 server.activerehashing = 1;
1053 server.maxclients = REDIS_MAX_CLIENTS;
1054 server.bpop_blocked_clients = 0;
1055 server.maxmemory = 0;
1056 server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU;
1057 server.maxmemory_samples = 3;
1058 server.hash_max_ziplist_entries = REDIS_HASH_MAX_ZIPLIST_ENTRIES;
1059 server.hash_max_ziplist_value = REDIS_HASH_MAX_ZIPLIST_VALUE;
1060 server.list_max_ziplist_entries = REDIS_LIST_MAX_ZIPLIST_ENTRIES;
1061 server.list_max_ziplist_value = REDIS_LIST_MAX_ZIPLIST_VALUE;
1062 server.set_max_intset_entries = REDIS_SET_MAX_INTSET_ENTRIES;
1063 server.zset_max_ziplist_entries = REDIS_ZSET_MAX_ZIPLIST_ENTRIES;
1064 server.zset_max_ziplist_value = REDIS_ZSET_MAX_ZIPLIST_VALUE;
1065 server.shutdown_asap = 0;
1066 server.repl_ping_slave_period = REDIS_REPL_PING_SLAVE_PERIOD;
1067 server.repl_timeout = REDIS_REPL_TIMEOUT;
1068 server.cluster_enabled = 0;
1069 server.cluster.configfile = zstrdup("nodes.conf");
1070 server.lua_caller = NULL;
1071 server.lua_time_limit = REDIS_LUA_TIME_LIMIT;
1072 server.lua_client = NULL;
1073 server.lua_timedout = 0;
1074
1075 updateLRUClock();
1076 resetServerSaveParams();
1077
1078 appendServerSaveParams(60*60,1); /* save after 1 hour and 1 change */
1079 appendServerSaveParams(300,100); /* save after 5 minutes and 100 changes */
1080 appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */
1081 /* Replication related */
1082 server.masterauth = NULL;
1083 server.masterhost = NULL;
1084 server.masterport = 6379;
1085 server.master = NULL;
1086 server.repl_state = REDIS_REPL_NONE;
1087 server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT;
1088 server.repl_serve_stale_data = 1;
1089 server.repl_slave_ro = 1;
1090 server.repl_down_since = time(NULL);
1091
1092 /* Client output buffer limits */
1093 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0;
1094 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_bytes = 0;
1095 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_seconds = 0;
1096 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].hard_limit_bytes = 1024*1024*256;
1097 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_bytes = 1024*1024*64;
1098 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_seconds = 60;
1099 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].hard_limit_bytes = 1024*1024*32;
1100 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_bytes = 1024*1024*8;
1101 server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_seconds = 60;
1102
1103 /* Double constants initialization */
1104 R_Zero = 0.0;
1105 R_PosInf = 1.0/R_Zero;
1106 R_NegInf = -1.0/R_Zero;
1107 R_Nan = R_Zero/R_Zero;
1108
1109 /* Command table -- we intiialize it here as it is part of the
1110 * initial configuration, since command names may be changed via
1111 * redis.conf using the rename-command directive. */
1112 server.commands = dictCreate(&commandTableDictType,NULL);
1113 populateCommandTable();
1114 server.delCommand = lookupCommandByCString("del");
1115 server.multiCommand = lookupCommandByCString("multi");
1116 server.lpushCommand = lookupCommandByCString("lpush");
1117
1118 /* Slow log */
1119 server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN;
1120 server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN;
1121
1122 /* Debugging */
1123 server.assert_failed = "<no assertion failed>";
1124 server.assert_file = "<no file>";
1125 server.assert_line = 0;
1126 server.bug_report_start = 0;
1127 server.watchdog_period = 0;
1128}
1129
1130/* This function will try to raise the max number of open files accordingly to
1131 * the configured max number of clients. It will also account for 32 additional
1132 * file descriptors as we need a few more for persistence, listening
1133 * sockets, log files and so forth.
1134 *
1135 * If it will not be possible to set the limit accordingly to the configured
1136 * max number of clients, the function will do the reverse setting
1137 * server.maxclients to the value that we can actually handle. */
1138void adjustOpenFilesLimit(void) {
1139 rlim_t maxfiles = server.maxclients+32;
1140 struct rlimit limit;
1141
1142 if (maxfiles < 1024) maxfiles = 1024;
1143 if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {
1144 redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.",
1145 strerror(errno));
1146 server.maxclients = 1024-32;
1147 } else {
1148 rlim_t oldlimit = limit.rlim_cur;
1149
1150 /* Set the max number of files if the current limit is not enough
1151 * for our needs. */
1152 if (oldlimit < maxfiles) {
1153 rlim_t f;
1154
1155 f = maxfiles;
1156 while(f > oldlimit) {
1157 limit.rlim_cur = f;
1158 limit.rlim_max = f;
1159 if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;
1160 f -= 128;
1161 }
1162 if (f < oldlimit) f = oldlimit;
1163 if (f != maxfiles) {
1164 server.maxclients = f-32;
1165 redisLog(REDIS_WARNING,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.",
1166 (int) maxfiles, strerror(errno), (int) server.maxclients);
1167 } else {
1168 redisLog(REDIS_NOTICE,"Max number of open files set to %d",
1169 (int) maxfiles);
1170 }
1171 }
1172 }
1173}
1174
1175void initServer() {
1176 int j;
1177
1178 signal(SIGHUP, SIG_IGN);
1179 signal(SIGPIPE, SIG_IGN);
1180 setupSignalHandlers();
1181
1182 if (server.syslog_enabled) {
1183 openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,
1184 server.syslog_facility);
1185 }
1186
1187 server.current_client = NULL;
1188 server.clients = listCreate();
1189 server.clients_to_close = listCreate();
1190 server.slaves = listCreate();
1191 server.monitors = listCreate();
1192 server.unblocked_clients = listCreate();
1193
1194 createSharedObjects();
1195 adjustOpenFilesLimit();
1196 server.el = aeCreateEventLoop(server.maxclients+1024);
1197 server.db = zmalloc(sizeof(redisDb)*server.dbnum);
1198
1199 if (server.port != 0) {
1200 server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr);
1201 if (server.ipfd == ANET_ERR) {
1202 redisLog(REDIS_WARNING, "Opening port %d: %s",
1203 server.port, server.neterr);
1204 exit(1);
1205 }
1206 }
1207 if (server.unixsocket != NULL) {
1208 unlink(server.unixsocket); /* don't care if this fails */
1209 server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm);
1210 if (server.sofd == ANET_ERR) {
1211 redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr);
1212 exit(1);
1213 }
1214 }
1215 if (server.ipfd < 0 && server.sofd < 0) {
1216 redisLog(REDIS_WARNING, "Configured to not listen anywhere, exiting.");
1217 exit(1);
1218 }
1219 for (j = 0; j < server.dbnum; j++) {
1220 server.db[j].dict = dictCreate(&dbDictType,NULL);
1221 server.db[j].expires = dictCreate(&keyptrDictType,NULL);
1222 server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);
1223 server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);
1224 server.db[j].id = j;
1225 }
1226 server.pubsub_channels = dictCreate(&keylistDictType,NULL);
1227 server.pubsub_patterns = listCreate();
1228 listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);
1229 listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);
1230 server.cronloops = 0;
1231 server.rdb_child_pid = -1;
1232 server.aof_child_pid = -1;
1233 server.aof_rewrite_buf = sdsempty();
1234 server.aof_buf = sdsempty();
1235 server.lastsave = time(NULL);
1236 server.dirty = 0;
1237 server.stat_numcommands = 0;
1238 server.stat_numconnections = 0;
1239 server.stat_expiredkeys = 0;
1240 server.stat_evictedkeys = 0;
1241 server.stat_starttime = time(NULL);
1242 server.stat_keyspace_misses = 0;
1243 server.stat_keyspace_hits = 0;
1244 server.stat_peak_memory = 0;
1245 server.stat_fork_time = 0;
1246 server.stat_rejected_conn = 0;
1247 memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples));
1248 server.ops_sec_idx = 0;
1249 server.ops_sec_last_sample_time = mstime();
1250 server.ops_sec_last_sample_ops = 0;
1251 server.unixtime = time(NULL);
1252 server.lastbgsave_status = REDIS_OK;
1253 server.stop_writes_on_bgsave_err = 1;
1254 aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL);
1255 if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE,
1256 acceptTcpHandler,NULL) == AE_ERR) oom("creating file event");
1257 if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,
1258 acceptUnixHandler,NULL) == AE_ERR) oom("creating file event");
1259
1260 if (server.aof_state == REDIS_AOF_ON) {
1261 server.aof_fd = open(server.aof_filename,
1262 O_WRONLY|O_APPEND|O_CREAT,0644);
1263 if (server.aof_fd == -1) {
1264 redisLog(REDIS_WARNING, "Can't open the append-only file: %s",
1265 strerror(errno));
1266 exit(1);
1267 }
1268 }
1269
1270 /* 32 bit instances are limited to 4GB of address space, so if there is
1271 * no explicit limit in the user provided configuration we set a limit
1272 * at 3.5GB using maxmemory with 'noeviction' policy'. This saves
1273 * useless crashes of the Redis instance. */
1274 if (server.arch_bits == 32 && server.maxmemory == 0) {
1275 redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now.");
1276 server.maxmemory = 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */
1277 server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;
1278 }
1279
1280 if (server.cluster_enabled) clusterInit();
1281 scriptingInit();
1282 slowlogInit();
1283 bioInit();
1284}
1285
1286/* Populates the Redis Command Table starting from the hard coded list
1287 * we have on top of redis.c file. */
1288void populateCommandTable(void) {
1289 int j;
1290 int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
1291
1292 for (j = 0; j < numcommands; j++) {
1293 struct redisCommand *c = redisCommandTable+j;
1294 char *f = c->sflags;
1295 int retval;
1296
1297 while(*f != '\0') {
1298 switch(*f) {
1299 case 'w': c->flags |= REDIS_CMD_WRITE; break;
1300 case 'r': c->flags |= REDIS_CMD_READONLY; break;
1301 case 'm': c->flags |= REDIS_CMD_DENYOOM; break;
1302 case 'a': c->flags |= REDIS_CMD_ADMIN; break;
1303 case 'p': c->flags |= REDIS_CMD_PUBSUB; break;
1304 case 'f': c->flags |= REDIS_CMD_FORCE_REPLICATION; break;
1305 case 's': c->flags |= REDIS_CMD_NOSCRIPT; break;
1306 case 'R': c->flags |= REDIS_CMD_RANDOM; break;
1307 case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break;
1308 default: redisPanic("Unsupported command flag"); break;
1309 }
1310 f++;
1311 }
1312
1313 retval = dictAdd(server.commands, sdsnew(c->name), c);
1314 assert(retval == DICT_OK);
1315 }
1316}
1317
1318void resetCommandTableStats(void) {
1319 int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
1320 int j;
1321
1322 for (j = 0; j < numcommands; j++) {
1323 struct redisCommand *c = redisCommandTable+j;
1324
1325 c->microseconds = 0;
1326 c->calls = 0;
1327 }
1328}
1329
1330/* ========================== Redis OP Array API ============================ */
1331
1332void redisOpArrayInit(redisOpArray *oa) {
1333 oa->ops = NULL;
1334 oa->numops = 0;
1335}
1336
1337int redisOpArrayAppend(redisOpArray *oa, struct redisCommand *cmd, int dbid,
1338 robj **argv, int argc, int target)
1339{
1340 redisOp *op;
1341
1342 oa->ops = zrealloc(oa->ops,sizeof(redisOp)*(oa->numops+1));
1343 op = oa->ops+oa->numops;
1344 op->cmd = cmd;
1345 op->dbid = dbid;
1346 op->argv = argv;
1347 op->argc = argc;
1348 op->target = target;
1349 oa->numops++;
1350 return oa->numops;
1351}
1352
1353void redisOpArrayFree(redisOpArray *oa) {
1354 while(oa->numops) {
1355 int j;
1356 redisOp *op;
1357
1358 oa->numops--;
1359 op = oa->ops+oa->numops;
1360 for (j = 0; j < op->argc; j++)
1361 decrRefCount(op->argv[j]);
1362 zfree(op->argv);
1363 }
1364 zfree(oa->ops);
1365}
1366
1367/* ====================== Commands lookup and execution ===================== */
1368
1369struct redisCommand *lookupCommand(sds name) {
1370 return dictFetchValue(server.commands, name);
1371}
1372
1373struct redisCommand *lookupCommandByCString(char *s) {
1374 struct redisCommand *cmd;
1375 sds name = sdsnew(s);
1376
1377 cmd = dictFetchValue(server.commands, name);
1378 sdsfree(name);
1379 return cmd;
1380}
1381
1382/* Propagate the specified command (in the context of the specified database id)
1383 * to AOF, Slaves and Monitors.
1384 *
1385 * flags are an xor between:
1386 * + REDIS_PROPAGATE_NONE (no propagation of command at all)
1387 * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled)
1388 * + REDIS_PROPAGATE_REPL (propagate into the replication link)
1389 */
1390void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
1391 int flags)
1392{
1393 if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF)
1394 feedAppendOnlyFile(cmd,dbid,argv,argc);
1395 if (flags & REDIS_PROPAGATE_REPL && listLength(server.slaves))
1396 replicationFeedSlaves(server.slaves,dbid,argv,argc);
1397}
1398
1399/* Used inside commands to schedule the propagation of additional commands
1400 * after the current command is propagated to AOF / Replication. */
1401void alsoPropagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,
1402 int target)
1403{
1404 redisOpArrayAppend(&server.also_propagate,cmd,dbid,argv,argc,target);
1405}
1406
1407/* Call() is the core of Redis execution of a command */
1408void call(redisClient *c, int flags) {
1409 long long dirty, start = ustime(), duration;
1410
1411 /* Sent the command to clients in MONITOR mode, only if the commands are
1412 * not geneated from reading an AOF. */
1413 if (listLength(server.monitors) && !server.loading)
1414 replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc);
1415
1416 /* Call the command. */
1417 redisOpArrayInit(&server.also_propagate);
1418 dirty = server.dirty;
1419 c->cmd->proc(c);
1420 dirty = server.dirty-dirty;
1421 duration = ustime()-start;
1422
1423 /* When EVAL is called loading the AOF we don't want commands called
1424 * from Lua to go into the slowlog or to populate statistics. */
1425 if (server.loading && c->flags & REDIS_LUA_CLIENT)
1426 flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS);
1427
1428 /* Log the command into the Slow log if needed, and populate the
1429 * per-command statistics that we show in INFO commandstats. */
1430 if (flags & REDIS_CALL_SLOWLOG)
1431 slowlogPushEntryIfNeeded(c->argv,c->argc,duration);
1432 if (flags & REDIS_CALL_STATS) {
1433 c->cmd->microseconds += duration;
1434 c->cmd->calls++;
1435 }
1436
1437 /* Propagate the command into the AOF and replication link */
1438 if (flags & REDIS_CALL_PROPAGATE) {
1439 int flags = REDIS_PROPAGATE_NONE;
1440
1441 if (c->cmd->flags & REDIS_CMD_FORCE_REPLICATION)
1442 flags |= REDIS_PROPAGATE_REPL;
1443 if (dirty)
1444 flags |= (REDIS_PROPAGATE_REPL | REDIS_PROPAGATE_AOF);
1445 if (flags != REDIS_PROPAGATE_NONE)
1446 propagate(c->cmd,c->db->id,c->argv,c->argc,flags);
1447 }
1448 /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional
1449 * PUSH command. */
1450 if (server.also_propagate.numops) {
1451 int j;
1452 redisOp *rop;
1453
1454 for (j = 0; j < server.also_propagate.numops; j++) {
1455 rop = &server.also_propagate.ops[j];
1456 propagate(rop->cmd, rop->dbid, rop->argv, rop->argc, rop->target);
1457 }
1458 redisOpArrayFree(&server.also_propagate);
1459 }
1460 server.stat_numcommands++;
1461}
1462
1463/* If this function gets called we already read a whole
1464 * command, argments are in the client argv/argc fields.
1465 * processCommand() execute the command or prepare the
1466 * server for a bulk read from the client.
1467 *
1468 * If 1 is returned the client is still alive and valid and
1469 * and other operations can be performed by the caller. Otherwise
1470 * if 0 is returned the client was destroied (i.e. after QUIT). */
1471int processCommand(redisClient *c) {
1472 /* The QUIT command is handled separately. Normal command procs will
1473 * go through checking for replication and QUIT will cause trouble
1474 * when FORCE_REPLICATION is enabled and would be implemented in
1475 * a regular command proc. */
1476 if (!strcasecmp(c->argv[0]->ptr,"quit")) {
1477 addReply(c,shared.ok);
1478 c->flags |= REDIS_CLOSE_AFTER_REPLY;
1479 return REDIS_ERR;
1480 }
1481
1482 /* Now lookup the command and check ASAP about trivial error conditions
1483 * such as wrong arity, bad command name and so forth. */
1484 c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);
1485 if (!c->cmd) {
1486 addReplyErrorFormat(c,"unknown command '%s'",
1487 (char*)c->argv[0]->ptr);
1488 return REDIS_OK;
1489 } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||
1490 (c->argc < -c->cmd->arity)) {
1491 addReplyErrorFormat(c,"wrong number of arguments for '%s' command",
1492 c->cmd->name);
1493 return REDIS_OK;
1494 }
1495
1496 /* Check if the user is authenticated */
1497 if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand)
1498 {
1499 addReplyError(c,"operation not permitted");
1500 return REDIS_OK;
1501 }
1502
1503 /* If cluster is enabled, redirect here */
1504 if (server.cluster_enabled &&
1505 !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) {
1506 int hashslot;
1507
1508 if (server.cluster.state != REDIS_CLUSTER_OK) {
1509 addReplyError(c,"The cluster is down. Check with CLUSTER INFO for more information");
1510 return REDIS_OK;
1511 } else {
1512 int ask;
1513 clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask);
1514 if (n == NULL) {
1515 addReplyError(c,"Multi keys request invalid in cluster");
1516 return REDIS_OK;
1517 } else if (n != server.cluster.myself) {
1518 addReplySds(c,sdscatprintf(sdsempty(),
1519 "-%s %d %s:%d\r\n", ask ? "ASK" : "MOVED",
1520 hashslot,n->ip,n->port));
1521 return REDIS_OK;
1522 }
1523 }
1524 }
1525
1526 /* Handle the maxmemory directive.
1527 *
1528 * First we try to free some memory if possible (if there are volatile
1529 * keys in the dataset). If there are not the only thing we can do
1530 * is returning an error. */
1531 if (server.maxmemory) {
1532 int retval = freeMemoryIfNeeded();
1533 if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) {
1534 addReply(c, shared.oomerr);
1535 return REDIS_OK;
1536 }
1537 }
1538
1539 /* Don't accept write commands if there are problems persisting on disk. */
1540 if (server.stop_writes_on_bgsave_err &&
1541 server.saveparamslen > 0
1542 && server.lastbgsave_status == REDIS_ERR &&
1543 c->cmd->flags & REDIS_CMD_WRITE)
1544 {
1545 addReply(c, shared.bgsaveerr);
1546 return REDIS_OK;
1547 }
1548
1549 /* Don't accept wirte commands if this is a read only slave. But
1550 * accept write commands if this is our master. */
1551 if (server.masterhost && server.repl_slave_ro &&
1552 !(c->flags & REDIS_MASTER) &&
1553 c->cmd->flags & REDIS_CMD_WRITE)
1554 {
1555 addReply(c, shared.roslaveerr);
1556 return REDIS_OK;
1557 }
1558
1559 /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */
1560 if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0)
1561 &&
1562 c->cmd->proc != subscribeCommand &&
1563 c->cmd->proc != unsubscribeCommand &&
1564 c->cmd->proc != psubscribeCommand &&
1565 c->cmd->proc != punsubscribeCommand) {
1566 addReplyError(c,"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context");
1567 return REDIS_OK;
1568 }
1569
1570 /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and
1571 * we are a slave with a broken link with master. */
1572 if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED &&
1573 server.repl_serve_stale_data == 0 &&
1574 c->cmd->proc != infoCommand && c->cmd->proc != slaveofCommand)
1575 {
1576 addReplyError(c,
1577 "link with MASTER is down and slave-serve-stale-data is set to no");
1578 return REDIS_OK;
1579 }
1580
1581 /* Loading DB? Return an error if the command is not INFO */
1582 if (server.loading && c->cmd->proc != infoCommand) {
1583 addReply(c, shared.loadingerr);
1584 return REDIS_OK;
1585 }
1586
1587 /* Lua script too slow? Only allow SHUTDOWN NOSAVE and SCRIPT KILL. */
1588 if (server.lua_timedout &&
1589 !(c->cmd->proc != shutdownCommand &&
1590 c->argc == 2 &&
1591 tolower(((char*)c->argv[1]->ptr)[0]) == 'n') &&
1592 !(c->cmd->proc == scriptCommand &&
1593 c->argc == 2 &&
1594 tolower(((char*)c->argv[1]->ptr)[0]) == 'k'))
1595 {
1596 addReply(c, shared.slowscripterr);
1597 return REDIS_OK;
1598 }
1599
1600 /* Exec the command */
1601 if (c->flags & REDIS_MULTI &&
1602 c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&
1603 c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)
1604 {
1605 queueMultiCommand(c);
1606 addReply(c,shared.queued);
1607 } else {
1608 call(c,REDIS_CALL_FULL);
1609 }
1610 return REDIS_OK;
1611}
1612
1613/*================================== Shutdown =============================== */
1614
1615int prepareForShutdown(int flags) {
1616 int save = flags & REDIS_SHUTDOWN_SAVE;
1617 int nosave = flags & REDIS_SHUTDOWN_NOSAVE;
1618
1619 redisLog(REDIS_WARNING,"User requested shutdown...");
1620 /* Kill the saving child if there is a background saving in progress.
1621 We want to avoid race conditions, for instance our saving child may
1622 overwrite the synchronous saving did by SHUTDOWN. */
1623 if (server.rdb_child_pid != -1) {
1624 redisLog(REDIS_WARNING,"There is a child saving an .rdb. Killing it!");
1625 kill(server.rdb_child_pid,SIGKILL);
1626 rdbRemoveTempFile(server.rdb_child_pid);
1627 }
1628 if (server.aof_state != REDIS_AOF_OFF) {
1629 /* Kill the AOF saving child as the AOF we already have may be longer
1630 * but contains the full dataset anyway. */
1631 if (server.aof_child_pid != -1) {
1632 redisLog(REDIS_WARNING,
1633 "There is a child rewriting the AOF. Killing it!");
1634 kill(server.aof_child_pid,SIGKILL);
1635 }
1636 /* Append only file: fsync() the AOF and exit */
1637 redisLog(REDIS_NOTICE,"Calling fsync() on the AOF file.");
1638 aof_fsync(server.aof_fd);
1639 }
1640 if ((server.saveparamslen > 0 && !nosave) || save) {
1641 redisLog(REDIS_NOTICE,"Saving the final RDB snapshot before exiting.");
1642 /* Snapshotting. Perform a SYNC SAVE and exit */
1643 if (rdbSave(server.rdb_filename) != REDIS_OK) {
1644 /* Ooops.. error saving! The best we can do is to continue
1645 * operating. Note that if there was a background saving process,
1646 * in the next cron() Redis will be notified that the background
1647 * saving aborted, handling special stuff like slaves pending for
1648 * synchronization... */
1649 redisLog(REDIS_WARNING,"Error trying to save the DB, can't exit.");
1650 return REDIS_ERR;
1651 }
1652 }
1653 if (server.daemonize) {
1654 redisLog(REDIS_NOTICE,"Removing the pid file.");
1655 unlink(server.pidfile);
1656 }
1657 /* Close the listening sockets. Apparently this allows faster restarts. */
1658 if (server.ipfd != -1) close(server.ipfd);
1659 if (server.sofd != -1) close(server.sofd);
1660 if (server.unixsocket) {
1661 redisLog(REDIS_NOTICE,"Removing the unix socket file.");
1662 unlink(server.unixsocket); /* don't care if this fails */
1663 }
1664
1665 redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye...");
1666 return REDIS_OK;
1667}
1668
1669/*================================== Commands =============================== */
1670
1671void authCommand(redisClient *c) {
1672 if (!server.requirepass) {
1673 addReplyError(c,"Client sent AUTH, but no password is set");
1674 } else if (!strcmp(c->argv[1]->ptr, server.requirepass)) {
1675 c->authenticated = 1;
1676 addReply(c,shared.ok);
1677 } else {
1678 c->authenticated = 0;
1679 addReplyError(c,"invalid password");
1680 }
1681}
1682
1683void pingCommand(redisClient *c) {
1684 addReply(c,shared.pong);
1685}
1686
1687void echoCommand(redisClient *c) {
1688 addReplyBulk(c,c->argv[1]);
1689}
1690
1691void timeCommand(redisClient *c) {
1692 struct timeval tv;
1693
1694 /* gettimeofday() can only fail if &tv is a bad addresss so we
1695 * don't check for errors. */
1696 gettimeofday(&tv,NULL);
1697 addReplyMultiBulkLen(c,2);
1698 addReplyBulkLongLong(c,tv.tv_sec);
1699 addReplyBulkLongLong(c,tv.tv_usec);
1700}
1701
1702/* Convert an amount of bytes into a human readable string in the form
1703 * of 100B, 2G, 100M, 4K, and so forth. */
1704void bytesToHuman(char *s, unsigned long long n) {
1705 double d;
1706
1707 if (n < 1024) {
1708 /* Bytes */
1709 sprintf(s,"%lluB",n);
1710 return;
1711 } else if (n < (1024*1024)) {
1712 d = (double)n/(1024);
1713 sprintf(s,"%.2fK",d);
1714 } else if (n < (1024LL*1024*1024)) {
1715 d = (double)n/(1024*1024);
1716 sprintf(s,"%.2fM",d);
1717 } else if (n < (1024LL*1024*1024*1024)) {
1718 d = (double)n/(1024LL*1024*1024);
1719 sprintf(s,"%.2fG",d);
1720 }
1721}
1722
1723/* Create the string returned by the INFO command. This is decoupled
1724 * by the INFO command itself as we need to report the same information
1725 * on memory corruption problems. */
1726sds genRedisInfoString(char *section) {
1727 sds info = sdsempty();
1728 time_t uptime = server.unixtime-server.stat_starttime;
1729 int j, numcommands;
1730 struct rusage self_ru, c_ru;
1731 unsigned long lol, bib;
1732 int allsections = 0, defsections = 0;
1733 int sections = 0;
1734
1735 if (section) {
1736 allsections = strcasecmp(section,"all") == 0;
1737 defsections = strcasecmp(section,"default") == 0;
1738 }
1739
1740 getrusage(RUSAGE_SELF, &self_ru);
1741 getrusage(RUSAGE_CHILDREN, &c_ru);
1742 getClientsMaxBuffers(&lol,&bib);
1743
1744 /* Server */
1745 if (allsections || defsections || !strcasecmp(section,"server")) {
1746 struct utsname name;
1747
1748 if (sections++) info = sdscat(info,"\r\n");
1749 uname(&name);
1750 info = sdscatprintf(info,
1751 "# Server\r\n"
1752 "redis_version:%s\r\n"
1753 "redis_git_sha1:%s\r\n"
1754 "redis_git_dirty:%d\r\n"
1755 "os:%s %s %s\r\n"
1756 "arch_bits:%d\r\n"
1757 "multiplexing_api:%s\r\n"
1758 "gcc_version:%d.%d.%d\r\n"
1759 "process_id:%ld\r\n"
1760 "run_id:%s\r\n"
1761 "tcp_port:%d\r\n"
1762 "uptime_in_seconds:%ld\r\n"
1763 "uptime_in_days:%ld\r\n"
1764 "lru_clock:%ld\r\n",
1765 REDIS_VERSION,
1766 redisGitSHA1(),
1767 strtol(redisGitDirty(),NULL,10) > 0,
1768 name.sysname, name.release, name.machine,
1769 server.arch_bits,
1770 aeGetApiName(),
1771#ifdef __GNUC__
1772 __GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,
1773#else
1774 0,0,0,
1775#endif
1776 (long) getpid(),
1777 server.runid,
1778 server.port,
1779 uptime,
1780 uptime/(3600*24),
1781 (unsigned long) server.lruclock);
1782 }
1783
1784 /* Clients */
1785 if (allsections || defsections || !strcasecmp(section,"clients")) {
1786 if (sections++) info = sdscat(info,"\r\n");
1787 info = sdscatprintf(info,
1788 "# Clients\r\n"
1789 "connected_clients:%lu\r\n"
1790 "client_longest_output_list:%lu\r\n"
1791 "client_biggest_input_buf:%lu\r\n"
1792 "blocked_clients:%d\r\n",
1793 listLength(server.clients)-listLength(server.slaves),
1794 lol, bib,
1795 server.bpop_blocked_clients);
1796 }
1797
1798 /* Memory */
1799 if (allsections || defsections || !strcasecmp(section,"memory")) {
1800 char hmem[64];
1801 char peak_hmem[64];
1802
1803 bytesToHuman(hmem,zmalloc_used_memory());
1804 bytesToHuman(peak_hmem,server.stat_peak_memory);
1805 if (sections++) info = sdscat(info,"\r\n");
1806 info = sdscatprintf(info,
1807 "# Memory\r\n"
1808 "used_memory:%zu\r\n"
1809 "used_memory_human:%s\r\n"
1810 "used_memory_rss:%zu\r\n"
1811 "used_memory_peak:%zu\r\n"
1812 "used_memory_peak_human:%s\r\n"
1813 "used_memory_lua:%lld\r\n"
1814 "mem_fragmentation_ratio:%.2f\r\n"
1815 "mem_allocator:%s\r\n",
1816 zmalloc_used_memory(),
1817 hmem,
1818 zmalloc_get_rss(),
1819 server.stat_peak_memory,
1820 peak_hmem,
1821 ((long long)lua_gc(server.lua,LUA_GCCOUNT,0))*1024LL,
1822 zmalloc_get_fragmentation_ratio(),
1823 ZMALLOC_LIB
1824 );
1825 }
1826
1827 /* Persistence */
1828 if (allsections || defsections || !strcasecmp(section,"persistence")) {
1829 if (sections++) info = sdscat(info,"\r\n");
1830 info = sdscatprintf(info,
1831 "# Persistence\r\n"
1832 "loading:%d\r\n"
1833 "aof_enabled:%d\r\n"
1834 "changes_since_last_save:%lld\r\n"
1835 "bgsave_in_progress:%d\r\n"
1836 "last_save_time:%ld\r\n"
1837 "last_bgsave_status:%s\r\n"
1838 "bgrewriteaof_in_progress:%d\r\n"
1839 "bgrewriteaof_scheduled:%d\r\n",
1840 server.loading,
1841 server.aof_state != REDIS_AOF_OFF,
1842 server.dirty,
1843 server.rdb_child_pid != -1,
1844 server.lastsave,
1845 server.lastbgsave_status == REDIS_OK ? "ok" : "err",
1846 server.aof_child_pid != -1,
1847 server.aof_rewrite_scheduled);
1848
1849 if (server.aof_state != REDIS_AOF_OFF) {
1850 info = sdscatprintf(info,
1851 "aof_current_size:%lld\r\n"
1852 "aof_base_size:%lld\r\n"
1853 "aof_pending_rewrite:%d\r\n"
1854 "aof_buffer_length:%zu\r\n"
1855 "aof_pending_bio_fsync:%llu\r\n"
1856 "aof_delayed_fsync:%lu\r\n",
1857 (long long) server.aof_current_size,
1858 (long long) server.aof_rewrite_base_size,
1859 server.aof_rewrite_scheduled,
1860 sdslen(server.aof_buf),
1861 bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC),
1862 server.aof_delayed_fsync);
1863 }
1864
1865 if (server.loading) {
1866 double perc;
1867 time_t eta, elapsed;
1868 off_t remaining_bytes = server.loading_total_bytes-
1869 server.loading_loaded_bytes;
1870
1871 perc = ((double)server.loading_loaded_bytes /
1872 server.loading_total_bytes) * 100;
1873
1874 elapsed = server.unixtime-server.loading_start_time;
1875 if (elapsed == 0) {
1876 eta = 1; /* A fake 1 second figure if we don't have
1877 enough info */
1878 } else {
1879 eta = (elapsed*remaining_bytes)/server.loading_loaded_bytes;
1880 }
1881
1882 info = sdscatprintf(info,
1883 "loading_start_time:%ld\r\n"
1884 "loading_total_bytes:%llu\r\n"
1885 "loading_loaded_bytes:%llu\r\n"
1886 "loading_loaded_perc:%.2f\r\n"
1887 "loading_eta_seconds:%ld\r\n"
1888 ,(unsigned long) server.loading_start_time,
1889 (unsigned long long) server.loading_total_bytes,
1890 (unsigned long long) server.loading_loaded_bytes,
1891 perc,
1892 eta
1893 );
1894 }
1895 }
1896
1897 /* Stats */
1898 if (allsections || defsections || !strcasecmp(section,"stats")) {
1899 if (sections++) info = sdscat(info,"\r\n");
1900 info = sdscatprintf(info,
1901 "# Stats\r\n"
1902 "total_connections_received:%lld\r\n"
1903 "total_commands_processed:%lld\r\n"
1904 "instantaneous_ops_per_sec:%lld\r\n"
1905 "rejected_connections:%lld\r\n"
1906 "expired_keys:%lld\r\n"
1907 "evicted_keys:%lld\r\n"
1908 "keyspace_hits:%lld\r\n"
1909 "keyspace_misses:%lld\r\n"
1910 "pubsub_channels:%ld\r\n"
1911 "pubsub_patterns:%lu\r\n"
1912 "latest_fork_usec:%lld\r\n",
1913 server.stat_numconnections,
1914 server.stat_numcommands,
1915 getOperationsPerSecond(),
1916 server.stat_rejected_conn,
1917 server.stat_expiredkeys,
1918 server.stat_evictedkeys,
1919 server.stat_keyspace_hits,
1920 server.stat_keyspace_misses,
1921 dictSize(server.pubsub_channels),
1922 listLength(server.pubsub_patterns),
1923 server.stat_fork_time);
1924 }
1925
1926 /* Replication */
1927 if (allsections || defsections || !strcasecmp(section,"replication")) {
1928 if (sections++) info = sdscat(info,"\r\n");
1929 info = sdscatprintf(info,
1930 "# Replication\r\n"
1931 "role:%s\r\n",
1932 server.masterhost == NULL ? "master" : "slave");
1933 if (server.masterhost) {
1934 info = sdscatprintf(info,
1935 "master_host:%s\r\n"
1936 "master_port:%d\r\n"
1937 "master_link_status:%s\r\n"
1938 "master_last_io_seconds_ago:%d\r\n"
1939 "master_sync_in_progress:%d\r\n"
1940 ,server.masterhost,
1941 server.masterport,
1942 (server.repl_state == REDIS_REPL_CONNECTED) ?
1943 "up" : "down",
1944 server.master ?
1945 ((int)(server.unixtime-server.master->lastinteraction)) : -1,
1946 server.repl_state == REDIS_REPL_TRANSFER
1947 );
1948
1949 if (server.repl_state == REDIS_REPL_TRANSFER) {
1950 info = sdscatprintf(info,
1951 "master_sync_left_bytes:%ld\r\n"
1952 "master_sync_last_io_seconds_ago:%d\r\n"
1953 ,(long)server.repl_transfer_left,
1954 (int)(server.unixtime-server.repl_transfer_lastio)
1955 );
1956 }
1957
1958 if (server.repl_state != REDIS_REPL_CONNECTED) {
1959 info = sdscatprintf(info,
1960 "master_link_down_since_seconds:%ld\r\n",
1961 (long)server.unixtime-server.repl_down_since);
1962 }
1963 }
1964 info = sdscatprintf(info,
1965 "connected_slaves:%lu\r\n",
1966 listLength(server.slaves));
1967 if (listLength(server.slaves)) {
1968 int slaveid = 0;
1969 listNode *ln;
1970 listIter li;
1971
1972 listRewind(server.slaves,&li);
1973 while((ln = listNext(&li))) {
1974 redisClient *slave = listNodeValue(ln);
1975 char *state = NULL;
1976 char ip[32];
1977 int port;
1978
1979 if (anetPeerToString(slave->fd,ip,&port) == -1) continue;
1980 switch(slave->replstate) {
1981 case REDIS_REPL_WAIT_BGSAVE_START:
1982 case REDIS_REPL_WAIT_BGSAVE_END:
1983 state = "wait_bgsave";
1984 break;
1985 case REDIS_REPL_SEND_BULK:
1986 state = "send_bulk";
1987 break;
1988 case REDIS_REPL_ONLINE:
1989 state = "online";
1990 break;
1991 }
1992 if (state == NULL) continue;
1993 info = sdscatprintf(info,"slave%d:%s,%d,%s\r\n",
1994 slaveid,ip,port,state);
1995 slaveid++;
1996 }
1997 }
1998 }
1999
2000 /* CPU */
2001 if (allsections || defsections || !strcasecmp(section,"cpu")) {
2002 if (sections++) info = sdscat(info,"\r\n");
2003 info = sdscatprintf(info,
2004 "# CPU\r\n"
2005 "used_cpu_sys:%.2f\r\n"
2006 "used_cpu_user:%.2f\r\n"
2007 "used_cpu_sys_children:%.2f\r\n"
2008 "used_cpu_user_children:%.2f\r\n",
2009 (float)self_ru.ru_stime.tv_sec+(float)self_ru.ru_stime.tv_usec/1000000,
2010 (float)self_ru.ru_utime.tv_sec+(float)self_ru.ru_utime.tv_usec/1000000,
2011 (float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000,
2012 (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000);
2013 }
2014
2015 /* cmdtime */
2016 if (allsections || !strcasecmp(section,"commandstats")) {
2017 if (sections++) info = sdscat(info,"\r\n");
2018 info = sdscatprintf(info, "# Commandstats\r\n");
2019 numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);
2020 for (j = 0; j < numcommands; j++) {
2021 struct redisCommand *c = redisCommandTable+j;
2022
2023 if (!c->calls) continue;
2024 info = sdscatprintf(info,
2025 "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n",
2026 c->name, c->calls, c->microseconds,
2027 (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls));
2028 }
2029 }
2030
2031 /* Clusetr */
2032 if (allsections || defsections || !strcasecmp(section,"cluster")) {
2033 if (sections++) info = sdscat(info,"\r\n");
2034 info = sdscatprintf(info,
2035 "# Cluster\r\n"
2036 "cluster_enabled:%d\r\n",
2037 server.cluster_enabled);
2038 }
2039
2040 /* Key space */
2041 if (allsections || defsections || !strcasecmp(section,"keyspace")) {
2042 if (sections++) info = sdscat(info,"\r\n");
2043 info = sdscatprintf(info, "# Keyspace\r\n");
2044 for (j = 0; j < server.dbnum; j++) {
2045 long long keys, vkeys;
2046
2047 keys = dictSize(server.db[j].dict);
2048 vkeys = dictSize(server.db[j].expires);
2049 if (keys || vkeys) {
2050 info = sdscatprintf(info, "db%d:keys=%lld,expires=%lld\r\n",
2051 j, keys, vkeys);
2052 }
2053 }
2054 }
2055 return info;
2056}
2057
2058void infoCommand(redisClient *c) {
2059 char *section = c->argc == 2 ? c->argv[1]->ptr : "default";
2060
2061 if (c->argc > 2) {
2062 addReply(c,shared.syntaxerr);
2063 return;
2064 }
2065 sds info = genRedisInfoString(section);
2066 addReplySds(c,sdscatprintf(sdsempty(),"$%lu\r\n",
2067 (unsigned long)sdslen(info)));
2068 addReplySds(c,info);
2069 addReply(c,shared.crlf);
2070}
2071
2072void monitorCommand(redisClient *c) {
2073 /* ignore MONITOR if aleady slave or in monitor mode */
2074 if (c->flags & REDIS_SLAVE) return;
2075
2076 c->flags |= (REDIS_SLAVE|REDIS_MONITOR);
2077 c->slaveseldb = 0;
2078 listAddNodeTail(server.monitors,c);
2079 addReply(c,shared.ok);
2080}
2081
2082/* ============================ Maxmemory directive ======================== */
2083
2084/* This function gets called when 'maxmemory' is set on the config file to limit
2085 * the max memory used by the server, before processing a command.
2086 *
2087 * The goal of the function is to free enough memory to keep Redis under the
2088 * configured memory limit.
2089 *
2090 * The function starts calculating how many bytes should be freed to keep
2091 * Redis under the limit, and enters a loop selecting the best keys to
2092 * evict accordingly to the configured policy.
2093 *
2094 * If all the bytes needed to return back under the limit were freed the
2095 * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller
2096 * should block the execution of commands that will result in more memory
2097 * used by the server.
2098 */
2099int freeMemoryIfNeeded(void) {
2100 size_t mem_used, mem_tofree, mem_freed;
2101 int slaves = listLength(server.slaves);
2102
2103 /* Remove the size of slaves output buffers and AOF buffer from the
2104 * count of used memory. */
2105 mem_used = zmalloc_used_memory();
2106 if (slaves) {
2107 listIter li;
2108 listNode *ln;
2109
2110 listRewind(server.slaves,&li);
2111 while((ln = listNext(&li))) {
2112 redisClient *slave = listNodeValue(ln);
2113 unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave);
2114 if (obuf_bytes > mem_used)
2115 mem_used = 0;
2116 else
2117 mem_used -= obuf_bytes;
2118 }
2119 }
2120 if (server.aof_state != REDIS_AOF_OFF) {
2121 mem_used -= sdslen(server.aof_buf);
2122 mem_used -= sdslen(server.aof_rewrite_buf);
2123 }
2124
2125 /* Check if we are over the memory limit. */
2126 if (mem_used <= server.maxmemory) return REDIS_OK;
2127
2128 if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION)
2129 return REDIS_ERR; /* We need to free memory, but policy forbids. */
2130
2131 /* Compute how much memory we need to free. */
2132 mem_tofree = mem_used - server.maxmemory;
2133 mem_freed = 0;
2134 while (mem_freed < mem_tofree) {
2135 int j, k, keys_freed = 0;
2136
2137 for (j = 0; j < server.dbnum; j++) {
2138 long bestval = 0; /* just to prevent warning */
2139 sds bestkey = NULL;
2140 struct dictEntry *de;
2141 redisDb *db = server.db+j;
2142 dict *dict;
2143
2144 if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||
2145 server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM)
2146 {
2147 dict = server.db[j].dict;
2148 } else {
2149 dict = server.db[j].expires;
2150 }
2151 if (dictSize(dict) == 0) continue;
2152
2153 /* volatile-random and allkeys-random policy */
2154 if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM ||
2155 server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM)
2156 {
2157 de = dictGetRandomKey(dict);
2158 bestkey = dictGetKey(de);
2159 }
2160
2161 /* volatile-lru and allkeys-lru policy */
2162 else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||
2163 server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
2164 {
2165 for (k = 0; k < server.maxmemory_samples; k++) {
2166 sds thiskey;
2167 long thisval;
2168 robj *o;
2169
2170 de = dictGetRandomKey(dict);
2171 thiskey = dictGetKey(de);
2172 /* When policy is volatile-lru we need an additonal lookup
2173 * to locate the real key, as dict is set to db->expires. */
2174 if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)
2175 de = dictFind(db->dict, thiskey);
2176 o = dictGetVal(de);
2177 thisval = estimateObjectIdleTime(o);
2178
2179 /* Higher idle time is better candidate for deletion */
2180 if (bestkey == NULL || thisval > bestval) {
2181 bestkey = thiskey;
2182 bestval = thisval;
2183 }
2184 }
2185 }
2186
2187 /* volatile-ttl */
2188 else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) {
2189 for (k = 0; k < server.maxmemory_samples; k++) {
2190 sds thiskey;
2191 long thisval;
2192
2193 de = dictGetRandomKey(dict);
2194 thiskey = dictGetKey(de);
2195 thisval = (long) dictGetVal(de);
2196
2197 /* Expire sooner (minor expire unix timestamp) is better
2198 * candidate for deletion */
2199 if (bestkey == NULL || thisval < bestval) {
2200 bestkey = thiskey;
2201 bestval = thisval;
2202 }
2203 }
2204 }
2205
2206 /* Finally remove the selected key. */
2207 if (bestkey) {
2208 long long delta;
2209
2210 robj *keyobj = createStringObject(bestkey,sdslen(bestkey));
2211 propagateExpire(db,keyobj);
2212 /* We compute the amount of memory freed by dbDelete() alone.
2213 * It is possible that actually the memory needed to propagate
2214 * the DEL in AOF and replication link is greater than the one
2215 * we are freeing removing the key, but we can't account for
2216 * that otherwise we would never exit the loop.
2217 *
2218 * AOF and Output buffer memory will be freed eventually so
2219 * we only care about memory used by the key space. */
2220 delta = (long long) zmalloc_used_memory();
2221 dbDelete(db,keyobj);
2222 delta -= (long long) zmalloc_used_memory();
2223 mem_freed += delta;
2224 server.stat_evictedkeys++;
2225 decrRefCount(keyobj);
2226 keys_freed++;
2227
2228 /* When the memory to free starts to be big enough, we may
2229 * start spending so much time here that is impossible to
2230 * deliver data to the slaves fast enough, so we force the
2231 * transmission here inside the loop. */
2232 if (slaves) flushSlavesOutputBuffers();
2233 }
2234 }
2235 if (!keys_freed) return REDIS_ERR; /* nothing to free... */
2236 }
2237 return REDIS_OK;
2238}
2239
2240/* =================================== Main! ================================ */
2241
2242#ifdef __linux__
2243int linuxOvercommitMemoryValue(void) {
2244 FILE *fp = fopen("/proc/sys/vm/overcommit_memory","r");
2245 char buf[64];
2246
2247 if (!fp) return -1;
2248 if (fgets(buf,64,fp) == NULL) {
2249 fclose(fp);
2250 return -1;
2251 }
2252 fclose(fp);
2253
2254 return atoi(buf);
2255}
2256
2257void linuxOvercommitMemoryWarning(void) {
2258 if (linuxOvercommitMemoryValue() == 0) {
2259 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.");
2260 }
2261}
2262#endif /* __linux__ */
2263
2264void createPidFile(void) {
2265 /* Try to write the pid file in a best-effort way. */
2266 FILE *fp = fopen(server.pidfile,"w");
2267 if (fp) {
2268 fprintf(fp,"%d\n",(int)getpid());
2269 fclose(fp);
2270 }
2271}
2272
2273void daemonize(void) {
2274 int fd;
2275
2276 if (fork() != 0) exit(0); /* parent exits */
2277 setsid(); /* create a new session */
2278
2279 /* Every output goes to /dev/null. If Redis is daemonized but
2280 * the 'logfile' is set to 'stdout' in the configuration file
2281 * it will not log at all. */
2282 if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
2283 dup2(fd, STDIN_FILENO);
2284 dup2(fd, STDOUT_FILENO);
2285 dup2(fd, STDERR_FILENO);
2286 if (fd > STDERR_FILENO) close(fd);
2287 }
2288}
2289
2290void version() {
2291 printf("Redis server v=%s sha=%s:%d malloc=%s\n", REDIS_VERSION,
2292 redisGitSHA1(), atoi(redisGitDirty()) > 0, ZMALLOC_LIB);
2293 exit(0);
2294}
2295
2296void usage() {
2297 fprintf(stderr,"Usage: ./redis-server [/path/to/redis.conf] [options]\n");
2298 fprintf(stderr," ./redis-server - (read config from stdin)\n");
2299 fprintf(stderr," ./redis-server -v or --version\n");
2300 fprintf(stderr," ./redis-server -h or --help\n");
2301 fprintf(stderr," ./redis-server --test-memory <megabytes>\n\n");
2302 fprintf(stderr,"Examples:\n");
2303 fprintf(stderr," ./redis-server (run the server with default conf)\n");
2304 fprintf(stderr," ./redis-server /etc/redis/6379.conf\n");
2305 fprintf(stderr," ./redis-server --port 7777\n");
2306 fprintf(stderr," ./redis-server --port 7777 --slaveof 127.0.0.1 8888\n");
2307 fprintf(stderr," ./redis-server /etc/myredis.conf --loglevel verbose\n");
2308 exit(1);
2309}
2310
2311void redisAsciiArt(void) {
2312#include "asciilogo.h"
2313 char *buf = zmalloc(1024*16);
2314
2315 snprintf(buf,1024*16,ascii_logo,
2316 REDIS_VERSION,
2317 redisGitSHA1(),
2318 strtol(redisGitDirty(),NULL,10) > 0,
2319 (sizeof(long) == 8) ? "64" : "32",
2320 server.cluster_enabled ? "cluster" : "stand alone",
2321 server.port,
2322 (long) getpid()
2323 );
2324 redisLogRaw(REDIS_NOTICE|REDIS_LOG_RAW,buf);
2325 zfree(buf);
2326}
2327
2328static void sigtermHandler(int sig) {
2329 REDIS_NOTUSED(sig);
2330
2331 redisLogFromHandler(REDIS_WARNING,"Received SIGTERM, scheduling shutdown...");
2332 server.shutdown_asap = 1;
2333}
2334
2335void setupSignalHandlers(void) {
2336 struct sigaction act;
2337 stack_t stack;
2338
2339 stack.ss_sp = altstack;
2340 stack.ss_flags = 0;
2341 stack.ss_size = SIGSTKSZ;
2342
2343 sigaltstack(&stack, NULL);
2344
2345 /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.
2346 * Otherwise, sa_handler is used. */
2347 sigemptyset(&act.sa_mask);
2348 act.sa_flags = 0;
2349 act.sa_handler = sigtermHandler;
2350 sigaction(SIGTERM, &act, NULL);
2351
2352#ifdef HAVE_BACKTRACE
2353 /* Use alternate stack so we don't clobber stack in case of segv, or when we run out of stack ..
2354 * also resethand & nodefer so we can get interrupted (and killed) if we cause SEGV during SEGV handler */
2355 sigemptyset(&act.sa_mask);
2356 act.sa_flags = SA_NODEFER | SA_ONSTACK | SA_RESETHAND | SA_SIGINFO;
2357 act.sa_sigaction = sigsegvHandler;
2358 sigaction(SIGSEGV, &act, NULL);
2359 sigaction(SIGBUS, &act, NULL);
2360 sigaction(SIGFPE, &act, NULL);
2361 sigaction(SIGILL, &act, NULL);
2362#endif
2363 return;
2364}
2365
2366void memtest(size_t megabytes, int passes);
2367
2368int main(int argc, char **argv) {
2369 long long start;
2370 struct timeval tv;
2371
2372 /* We need to initialize our libraries, and the server configuration. */
2373 zmalloc_enable_thread_safeness();
2374 srand(time(NULL)^getpid());
2375 gettimeofday(&tv,NULL);
2376 dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());
2377 initServerConfig();
2378
2379 if (argc >= 2) {
2380 int j = 1; /* First option to parse in argv[] */
2381 sds options = sdsempty();
2382 char *configfile = NULL;
2383
2384 /* Handle special options --help and --version */
2385 if (strcmp(argv[1], "-v") == 0 ||
2386 strcmp(argv[1], "--version") == 0) version();
2387 if (strcmp(argv[1], "--help") == 0 ||
2388 strcmp(argv[1], "-h") == 0) usage();
2389 if (strcmp(argv[1], "--test-memory") == 0) {
2390 if (argc == 3) {
2391 memtest(atoi(argv[2]),50);
2392 exit(0);
2393 } else {
2394 fprintf(stderr,"Please specify the amount of memory to test in megabytes.\n");
2395 fprintf(stderr,"Example: ./redis-server --test-memory 4096\n\n");
2396 exit(1);
2397 }
2398 }
2399
2400 /* First argument is the config file name? */
2401 if (argv[j][0] != '-' || argv[j][1] != '-')
2402 configfile = argv[j++];
2403 /* All the other options are parsed and conceptually appended to the
2404 * configuration file. For instance --port 6380 will generate the
2405 * string "port 6380\n" to be parsed after the actual file name
2406 * is parsed, if any. */
2407 while(j != argc) {
2408 if (argv[j][0] == '-' && argv[j][1] == '-') {
2409 /* Option name */
2410 if (sdslen(options)) options = sdscat(options,"\n");
2411 options = sdscat(options,argv[j]+2);
2412 options = sdscat(options," ");
2413 } else {
2414 /* Option argument */
2415 options = sdscatrepr(options,argv[j],strlen(argv[j]));
2416 options = sdscat(options," ");
2417 }
2418 j++;
2419 }
2420 resetServerSaveParams();
2421 loadServerConfig(configfile,options);
2422 sdsfree(options);
2423 } else {
2424 redisLog(REDIS_WARNING,"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'");
2425 }
2426 if (server.daemonize) daemonize();
2427 initServer();
2428 if (server.daemonize) createPidFile();
2429 redisAsciiArt();
2430 redisLog(REDIS_WARNING,"Server started, Redis version " REDIS_VERSION);
2431#ifdef __linux__
2432 linuxOvercommitMemoryWarning();
2433#endif
2434 start = ustime();
2435 if (server.aof_state == REDIS_AOF_ON) {
2436 if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK)
2437 redisLog(REDIS_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000);
2438 } else {
2439 if (rdbLoad(server.rdb_filename) == REDIS_OK) {
2440 redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds",
2441 (float)(ustime()-start)/1000000);
2442 } else if (errno != ENOENT) {
2443 redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting.");
2444 exit(1);
2445 }
2446 }
2447 if (server.ipfd > 0)
2448 redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port);
2449 if (server.sofd > 0)
2450 redisLog(REDIS_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket);
2451 aeSetBeforeSleepProc(server.el,beforeSleep);
2452 aeMain(server.el);
2453 aeDeleteEventLoop(server.el);
2454 return 0;
2455}
2456
2457/* The End */