]> git.saurik.com Git - redis.git/commitdiff
Merge pull request #431 from anydot/f-signal
authorSalvatore Sanfilippo <antirez@gmail.com>
Thu, 5 Apr 2012 08:52:40 +0000 (01:52 -0700)
committerSalvatore Sanfilippo <antirez@gmail.com>
Thu, 5 Apr 2012 08:52:40 +0000 (01:52 -0700)
allocate alternate signal stack, change of sigaction flags for sigterm

src/cluster.c
src/help.h
src/redis.c
src/zmalloc.h
tests/integration/replication.tcl
tests/unit/dump.tcl
utils/generate-command-help.rb

index 6f771428a73d4f22c1ef403aa078d82dfcdb47ed..8cd20c84d740c9e1686d5b71f2ab2be55f8fb70d 100644 (file)
@@ -1586,7 +1586,7 @@ void migrateCommand(redisClient *c) {
     int fd;
     long timeout;
     long dbid;
-    long long ttl;
+    long long ttl, expireat;
     robj *o;
     rio cmd, payload;
 
@@ -1624,13 +1624,16 @@ void migrateCommand(redisClient *c) {
     redisAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,"SELECT",6));
     redisAssertWithInfo(c,NULL,rioWriteBulkLongLong(&cmd,dbid));
 
-    ttl = getExpire(c->db,c->argv[3])-mstime();
-    if (ttl < 1) ttl = 1;
+    expireat = getExpire(c->db,c->argv[3]);
+    if (expireat != -1) {
+        ttl = expireat-mstime();
+        if (ttl < 1) ttl = 1;
+    }
     redisAssertWithInfo(c,NULL,rioWriteBulkCount(&cmd,'*',4));
     redisAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,"RESTORE",7));
     redisAssertWithInfo(c,NULL,c->argv[3]->encoding == REDIS_ENCODING_RAW);
     redisAssertWithInfo(c,NULL,rioWriteBulkString(&cmd,c->argv[3]->ptr,sdslen(c->argv[3]->ptr)));
-    redisAssertWithInfo(c,NULL,rioWriteBulkLongLong(&cmd,(ttl == -1) ? 0 : ttl));
+    redisAssertWithInfo(c,NULL,rioWriteBulkLongLong(&cmd,(expireat==-1) ? 0 : ttl));
 
     /* Finally the last argument that is the serailized object payload
      * in the DUMP format. */
index 51613c9b3b42317144899116a4c079d14ba32e0d..cde95c1f8414d7c1415b9c4cd2b4cb166e8526db 100644 (file)
@@ -1,4 +1,4 @@
-/* Automatically generated by generate-command-help.rb, do not edit. */
+/* Automatically generated by utils/generate-command-help.rb, do not edit. */
 
 #ifndef __REDIS_HELP_H
 #define __REDIS_HELP_H
@@ -13,7 +13,8 @@ static char *commandGroups[] = {
     "pubsub",
     "transactions",
     "connection",
-    "server"
+    "server",
+    "scripting"
 };
 
 struct commandHelp {
@@ -27,612 +28,697 @@ struct commandHelp {
     "key value",
     "Append a value to a key",
     1,
-    "1.3.3" },
+    "2.0.0" },
     { "AUTH",
     "password",
     "Authenticate to the server",
     8,
-    "0.08" },
+    "1.0.0" },
     { "BGREWRITEAOF",
     "-",
     "Asynchronously rewrite the append-only file",
     9,
-    "1.07" },
+    "1.0.0" },
     { "BGSAVE",
     "-",
     "Asynchronously save the dataset to disk",
     9,
-    "0.07" },
+    "1.0.0" },
     { "BLPOP",
     "key [key ...] timeout",
     "Remove and get the first element in a list, or block until one is available",
     2,
-    "1.3.1" },
+    "2.0.0" },
     { "BRPOP",
     "key [key ...] timeout",
     "Remove and get the last element in a list, or block until one is available",
     2,
-    "1.3.1" },
+    "2.0.0" },
     { "BRPOPLPUSH",
     "source destination timeout",
     "Pop a value from a list, push it to another list and return it; or block until one is available",
     2,
-    "2.1.7" },
+    "2.2.0" },
     { "CONFIG GET",
     "parameter",
     "Get the value of a configuration parameter",
     9,
-    "2.0" },
+    "2.0.0" },
     { "CONFIG RESETSTAT",
     "-",
     "Reset the stats returned by INFO",
     9,
-    "2.0" },
+    "2.0.0" },
     { "CONFIG SET",
     "parameter value",
     "Set a configuration parameter to the given value",
     9,
-    "2.0" },
+    "2.0.0" },
     { "DBSIZE",
     "-",
     "Return the number of keys in the selected database",
     9,
-    "0.07" },
+    "1.0.0" },
     { "DEBUG OBJECT",
     "key",
     "Get debugging information about a key",
     9,
-    "0.101" },
+    "1.0.0" },
     { "DEBUG SEGFAULT",
     "-",
     "Make the server crash",
     9,
-    "0.101" },
+    "1.0.0" },
     { "DECR",
     "key",
     "Decrement the integer value of a key by one",
     1,
-    "0.07" },
+    "1.0.0" },
     { "DECRBY",
     "key decrement",
     "Decrement the integer value of a key by the given number",
     1,
-    "0.07" },
+    "1.0.0" },
     { "DEL",
     "key [key ...]",
     "Delete a key",
     0,
-    "0.07" },
+    "1.0.0" },
     { "DISCARD",
     "-",
     "Discard all commands issued after MULTI",
     7,
-    "1.3.3" },
+    "2.0.0" },
+    { "DUMP",
+    "key",
+    "Return a serialized verison of the value stored at the specified key.",
+    0,
+    "2.6.0" },
     { "ECHO",
     "message",
     "Echo the given string",
     8,
-    "0.07" },
+    "1.0.0" },
+    { "EVAL",
+    "script numkeys key [key ...] arg [arg ...]",
+    "Execute a Lua script server side",
+    10,
+    "2.6.0" },
     { "EXEC",
     "-",
     "Execute all commands issued after MULTI",
     7,
-    "1.1.95" },
+    "1.2.0" },
     { "EXISTS",
     "key",
     "Determine if a key exists",
-    9,
-    "0.07" },
+    0,
+    "1.0.0" },
     { "EXPIRE",
     "key seconds",
     "Set a key's time to live in seconds",
     0,
-    "0.09" },
+    "1.0.0" },
     { "EXPIREAT",
     "key timestamp",
     "Set the expiration for a key as a UNIX timestamp",
     0,
-    "1.1" },
+    "1.2.0" },
     { "FLUSHALL",
     "-",
     "Remove all keys from all databases",
     9,
-    "0.07" },
+    "1.0.0" },
     { "FLUSHDB",
     "-",
     "Remove all keys from the current database",
     9,
-    "0.07" },
+    "1.0.0" },
     { "GET",
     "key",
     "Get the value of a key",
     1,
-    "0.07" },
+    "1.0.0" },
     { "GETBIT",
     "key offset",
     "Returns the bit value at offset in the string value stored at key",
     1,
-    "2.1.8" },
+    "2.2.0" },
+    { "GETRANGE",
+    "key start end",
+    "Get a substring of the string stored at a key",
+    1,
+    "2.4.0" },
     { "GETSET",
     "key value",
     "Set the string value of a key and return its old value",
     1,
-    "0.091" },
+    "1.0.0" },
     { "HDEL",
-    "key field",
-    "Delete a hash field",
+    "key field [field ...]",
+    "Delete one or more hash fields",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HEXISTS",
     "key field",
     "Determine if a hash field exists",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HGET",
     "key field",
     "Get the value of a hash field",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HGETALL",
     "key",
     "Get all the fields and values in a hash",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HINCRBY",
     "key field increment",
     "Increment the integer value of a hash field by the given number",
     5,
-    "1.3.10" },
+    "2.0.0" },
+    { "HINCRBYFLOAT",
+    "key field increment",
+    "Increment the float value of a hash field by the given amount",
+    5,
+    "2.6.0" },
     { "HKEYS",
     "key",
     "Get all the fields in a hash",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HLEN",
     "key",
     "Get the number of fields in a hash",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HMGET",
     "key field [field ...]",
     "Get the values of all the given hash fields",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HMSET",
     "key field value [field value ...]",
     "Set multiple hash fields to multiple values",
     5,
-    "1.3.8" },
+    "2.0.0" },
     { "HSET",
     "key field value",
     "Set the string value of a hash field",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "HSETNX",
     "key field value",
     "Set the value of a hash field, only if the field does not exist",
     5,
-    "1.3.8" },
+    "2.0.0" },
     { "HVALS",
     "key",
     "Get all the values in a hash",
     5,
-    "1.3.10" },
+    "2.0.0" },
     { "INCR",
     "key",
     "Increment the integer value of a key by one",
     1,
-    "0.07" },
+    "1.0.0" },
     { "INCRBY",
     "key increment",
-    "Increment the integer value of a key by the given number",
+    "Increment the integer value of a key by the given amount",
     1,
-    "0.07" },
+    "1.0.0" },
+    { "INCRBYFLOAT",
+    "key increment",
+    "Increment the float value of a key by the given amount",
+    1,
+    "2.6.0" },
     { "INFO",
     "-",
     "Get information and statistics about the server",
     9,
-    "0.07" },
+    "1.0.0" },
     { "KEYS",
     "pattern",
     "Find all keys matching the given pattern",
     0,
-    "0.07" },
+    "1.0.0" },
     { "LASTSAVE",
     "-",
     "Get the UNIX time stamp of the last successful save to disk",
     9,
-    "0.07" },
+    "1.0.0" },
     { "LINDEX",
     "key index",
     "Get an element from a list by its index",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LINSERT",
     "key BEFORE|AFTER pivot value",
     "Insert an element before or after another element in a list",
     2,
-    "2.1.1" },
+    "2.2.0" },
     { "LLEN",
     "key",
     "Get the length of a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LPOP",
     "key",
     "Remove and get the first element in a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LPUSH",
-    "key value",
-    "Prepend a value to a list",
+    "key value [value ...]",
+    "Prepend one or multiple values to a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LPUSHX",
     "key value",
     "Prepend a value to a list, only if the list exists",
     2,
-    "2.1.1" },
+    "2.2.0" },
     { "LRANGE",
     "key start stop",
     "Get a range of elements from a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LREM",
     "key count value",
     "Remove elements from a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LSET",
     "key index value",
     "Set the value of an element in a list by its index",
     2,
-    "0.07" },
+    "1.0.0" },
     { "LTRIM",
     "key start stop",
     "Trim a list to the specified range",
     2,
-    "0.07" },
+    "1.0.0" },
     { "MGET",
     "key [key ...]",
     "Get the values of all the given keys",
     1,
-    "0.07" },
+    "1.0.0" },
+    { "MIGRATE",
+    "host port key destination db timeout",
+    "Atomically transfer a key from a Redis instance to another one.",
+    0,
+    "2.6.0" },
     { "MONITOR",
     "-",
     "Listen for all requests received by the server in real time",
     9,
-    "0.07" },
+    "1.0.0" },
     { "MOVE",
     "key db",
     "Move a key to another database",
     0,
-    "0.07" },
+    "1.0.0" },
     { "MSET",
     "key value [key value ...]",
     "Set multiple keys to multiple values",
     1,
-    "1.001" },
+    "1.0.1" },
     { "MSETNX",
     "key value [key value ...]",
     "Set multiple keys to multiple values, only if none of the keys exist",
     1,
-    "1.001" },
+    "1.0.1" },
     { "MULTI",
     "-",
     "Mark the start of a transaction block",
     7,
-    "1.1.95" },
+    "1.2.0" },
+    { "OBJECT",
+    "subcommand [arguments [arguments ...]]",
+    "Inspect the internals of Redis objects",
+    0,
+    "2.2.3" },
     { "PERSIST",
     "key",
     "Remove the expiration from a key",
     0,
-    "2.1.2" },
+    "2.2.0" },
+    { "PEXPIRE",
+    "key milliseconds",
+    "Set a key's time to live in milliseconds",
+    0,
+    "2.6.0" },
+    { "PEXPIREAT",
+    "key milliseconds timestamp",
+    "Set the expiration for a key as a UNIX timestamp specified in milliseconds",
+    0,
+    "2.6.0" },
     { "PING",
     "-",
     "Ping the server",
     8,
-    "0.07" },
+    "1.0.0" },
+    { "PSETEX",
+    "key milliseconds value",
+    "Set the value and expiration in milliseconds of a key",
+    1,
+    "2.6.0" },
     { "PSUBSCRIBE",
-    "pattern",
+    "pattern [pattern ...]",
     "Listen for messages published to channels matching the given patterns",
     6,
-    "1.3.8" },
+    "2.0.0" },
+    { "PTTL",
+    "key",
+    "Get the time to live for a key in milliseconds",
+    0,
+    "2.6.0" },
     { "PUBLISH",
     "channel message",
     "Post a message to a channel",
     6,
-    "1.3.8" },
+    "2.0.0" },
     { "PUNSUBSCRIBE",
     "[pattern [pattern ...]]",
     "Stop listening for messages posted to channels matching the given patterns",
     6,
-    "1.3.8" },
+    "2.0.0" },
     { "QUIT",
     "-",
     "Close the connection",
     8,
-    "0.07" },
+    "1.0.0" },
     { "RANDOMKEY",
     "-",
     "Return a random key from the keyspace",
     0,
-    "0.07" },
+    "1.0.0" },
     { "RENAME",
     "key newkey",
     "Rename a key",
     0,
-    "0.07" },
+    "1.0.0" },
     { "RENAMENX",
     "key newkey",
     "Rename a key, only if the new key does not exist",
     0,
-    "0.07" },
+    "1.0.0" },
+    { "RESTORE",
+    "key ttl serialized value",
+    "Create a key using the provided serialized value, previously obtained using DUMP.",
+    0,
+    "2.6.0" },
     { "RPOP",
     "key",
     "Remove and get the last element in a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "RPOPLPUSH",
     "source destination",
     "Remove the last element in a list, append it to another list and return it",
     2,
-    "1.1" },
+    "1.2.0" },
     { "RPUSH",
-    "key value",
-    "Append a value to a list",
+    "key value [value ...]",
+    "Append one or multiple values to a list",
     2,
-    "0.07" },
+    "1.0.0" },
     { "RPUSHX",
     "key value",
     "Append a value to a list, only if the list exists",
     2,
-    "2.1.1" },
+    "2.2.0" },
     { "SADD",
-    "key member",
-    "Add a member to a set",
+    "key member [member ...]",
+    "Add one or more members to a set",
     3,
-    "0.07" },
+    "1.0.0" },
     { "SAVE",
     "-",
     "Synchronously save the dataset to disk",
     9,
-    "0.07" },
+    "1.0.0" },
     { "SCARD",
     "key",
     "Get the number of members in a set",
     3,
-    "0.07" },
+    "1.0.0" },
+    { "SCRIPT EXISTS",
+    "script [script ...]",
+    "Check existence of scripts in the script cache.",
+    10,
+    "2.6.0" },
+    { "SCRIPT FLUSH",
+    "-",
+    "Remove all the scripts from the script cache.",
+    10,
+    "2.6.0" },
+    { "SCRIPT KILL",
+    "-",
+    "Kill the script currently in execution.",
+    10,
+    "2.6.0" },
+    { "SCRIPT LOAD",
+    "script",
+    "Load the specified Lua script into the script cache.",
+    10,
+    "2.6.0" },
     { "SDIFF",
     "key [key ...]",
     "Subtract multiple sets",
     3,
-    "0.100" },
+    "1.0.0" },
     { "SDIFFSTORE",
     "destination key [key ...]",
     "Subtract multiple sets and store the resulting set in a key",
     3,
-    "0.100" },
+    "1.0.0" },
     { "SELECT",
     "index",
     "Change the selected database for the current connection",
     8,
-    "0.07" },
+    "1.0.0" },
     { "SET",
     "key value",
     "Set the string value of a key",
     1,
-    "0.07" },
+    "1.0.0" },
     { "SETBIT",
     "key offset value",
     "Sets or clears the bit at offset in the string value stored at key",
     1,
-    "2.1.8" },
+    "2.2.0" },
     { "SETEX",
     "key seconds value",
     "Set the value and expiration of a key",
     1,
-    "1.3.10" },
+    "2.0.0" },
     { "SETNX",
     "key value",
     "Set the value of a key, only if the key does not exist",
     1,
-    "0.07" },
+    "1.0.0" },
     { "SETRANGE",
     "key offset value",
     "Overwrite part of a string at key starting at the specified offset",
     1,
-    "2.1.8" },
+    "2.2.0" },
     { "SHUTDOWN",
-    "-",
+    "[NOSAVE] [SAVE]",
     "Synchronously save the dataset to disk and then shut down the server",
     9,
-    "0.07" },
+    "1.0.0" },
     { "SINTER",
     "key [key ...]",
     "Intersect multiple sets",
     3,
-    "0.07" },
+    "1.0.0" },
     { "SINTERSTORE",
     "destination key [key ...]",
     "Intersect multiple sets and store the resulting set in a key",
     3,
-    "0.07" },
+    "1.0.0" },
     { "SISMEMBER",
     "key member",
     "Determine if a given value is a member of a set",
     3,
-    "0.07" },
+    "1.0.0" },
     { "SLAVEOF",
     "host port",
     "Make the server a slave of another instance, or promote it as master",
     9,
-    "0.100" },
+    "1.0.0" },
+    { "SLOWLOG",
+    "subcommand [argument]",
+    "Manages the Redis slow queries log",
+    9,
+    "2.2.12" },
     { "SMEMBERS",
     "key",
     "Get all the members in a set",
     3,
-    "0.07" },
+    "1.0.0" },
     { "SMOVE",
     "source destination member",
     "Move a member from one set to another",
     3,
-    "0.091" },
+    "1.0.0" },
     { "SORT",
     "key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]",
     "Sort the elements in a list, set or sorted set",
     0,
-    "0.07" },
+    "1.0.0" },
     { "SPOP",
     "key",
     "Remove and return a random member from a set",
     3,
-    "0.101" },
+    "1.0.0" },
     { "SRANDMEMBER",
     "key",
     "Get a random member from a set",
     3,
-    "1.001" },
+    "1.0.0" },
     { "SREM",
-    "key member",
-    "Remove a member from a set",
+    "key member [member ...]",
+    "Remove one or more members from a set",
     3,
-    "0.07" },
+    "1.0.0" },
     { "STRLEN",
     "key",
     "Get the length of the value stored in a key",
     1,
-    "2.1.2" },
+    "2.2.0" },
     { "SUBSCRIBE",
-    "channel",
+    "channel [channel ...]",
     "Listen for messages published to the given channels",
     6,
-    "1.3.8" },
-    { "SUBSTR",
-    "key start end",
-    "Get a substring of the string stored at a key",
-    1,
-    "1.3.4" },
+    "2.0.0" },
     { "SUNION",
     "key [key ...]",
     "Add multiple sets",
     3,
-    "0.091" },
+    "1.0.0" },
     { "SUNIONSTORE",
     "destination key [key ...]",
     "Add multiple sets and store the resulting set in a key",
     3,
-    "0.091" },
+    "1.0.0" },
     { "SYNC",
     "-",
     "Internal command used for replication",
     9,
-    "0.07" },
+    "1.0.0" },
+    { "TIME",
+    "-",
+    "Return the current server time",
+    9,
+    "2.6.0" },
     { "TTL",
     "key",
     "Get the time to live for a key",
     0,
-    "0.100" },
+    "1.0.0" },
     { "TYPE",
     "key",
     "Determine the type stored at key",
     0,
-    "0.07" },
+    "1.0.0" },
     { "UNSUBSCRIBE",
     "[channel [channel ...]]",
     "Stop listening for messages posted to the given channels",
     6,
-    "1.3.8" },
+    "2.0.0" },
     { "UNWATCH",
     "-",
     "Forget about all watched keys",
     7,
-    "2.1.0" },
+    "2.2.0" },
     { "WATCH",
     "key [key ...]",
     "Watch the given keys to determine execution of the MULTI/EXEC block",
     7,
-    "2.1.0" },
+    "2.2.0" },
     { "ZADD",
-    "key score member",
-    "Add a member to a sorted set, or update its score if it already exists",
+    "key score member [score] [member]",
+    "Add one or more members to a sorted set, or update its score if it already exists",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZCARD",
     "key",
     "Get the number of members in a sorted set",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZCOUNT",
     "key min max",
     "Count the members in a sorted set with scores within the given values",
     4,
-    "1.3.3" },
+    "2.0.0" },
     { "ZINCRBY",
     "key increment member",
     "Increment the score of a member in a sorted set",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZINTERSTORE",
     "destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]",
     "Intersect multiple sorted sets and store the resulting sorted set in a new key",
     4,
-    "1.3.10" },
+    "2.0.0" },
     { "ZRANGE",
     "key start stop [WITHSCORES]",
     "Return a range of members in a sorted set, by index",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZRANGEBYSCORE",
     "key min max [WITHSCORES] [LIMIT offset count]",
     "Return a range of members in a sorted set, by score",
     4,
-    "1.050" },
+    "1.0.5" },
     { "ZRANK",
     "key member",
     "Determine the index of a member in a sorted set",
     4,
-    "1.3.4" },
+    "2.0.0" },
     { "ZREM",
-    "key member",
-    "Remove a member from a sorted set",
+    "key member [member ...]",
+    "Remove one or more members from a sorted set",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZREMRANGEBYRANK",
     "key start stop",
     "Remove all members in a sorted set within the given indexes",
     4,
-    "1.3.4" },
+    "2.0.0" },
     { "ZREMRANGEBYSCORE",
     "key min max",
     "Remove all members in a sorted set within the given scores",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZREVRANGE",
     "key start stop [WITHSCORES]",
     "Return a range of members in a sorted set, by index, with scores ordered from high to low",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZREVRANGEBYSCORE",
     "key max min [WITHSCORES] [LIMIT offset count]",
     "Return a range of members in a sorted set, by score, with scores ordered from high to low",
     4,
-    "2.1.6" },
+    "2.2.0" },
     { "ZREVRANK",
     "key member",
     "Determine the index of a member in a sorted set, with scores ordered from high to low",
     4,
-    "1.3.4" },
+    "2.0.0" },
     { "ZSCORE",
     "key member",
     "Get the score associated with the given member in a sorted set",
     4,
-    "1.1" },
+    "1.2.0" },
     { "ZUNIONSTORE",
     "destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]",
     "Add multiple sorted sets and store the resulting sorted set in a new key",
     4,
-    "1.3.10" }
+    "2.0.0" }
 };
 
 #endif
index b625c02e09831572abe432153bb78069c4aab790..bb97c8d5939c6dad1690459240ba93864a7de9fe 100644 (file)
@@ -48,6 +48,7 @@
 #include <float.h>
 #include <math.h>
 #include <sys/resource.h>
+#include <sys/utsname.h>
 
 /* Our shared "common" objects */
 
@@ -225,7 +226,7 @@ struct redisCommand redisCommandTable[] = {
     {"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0},
     {"pttl",pttlCommand,2,"r",0,NULL,1,1,1,0,0},
     {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0},
-    {"slaveof",slaveofCommand,3,"aws",0,NULL,0,0,0,0,0},
+    {"slaveof",slaveofCommand,3,"as",0,NULL,0,0,0,0,0},
     {"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0},
     {"config",configCommand,-2,"ar",0,NULL,0,0,0,0,0},
     {"subscribe",subscribeCommand,-2,"rps",0,NULL,0,0,0,0,0},
@@ -256,7 +257,6 @@ struct redisCommand redisCommandTable[] = {
 void redisLogRaw(int level, const char *msg) {
     const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING };
     const char *c = ".-*#";
-    time_t now = time(NULL);
     FILE *fp;
     char buf[64];
     int rawmode = (level & REDIS_LOG_RAW);
@@ -270,7 +270,12 @@ void redisLogRaw(int level, const char *msg) {
     if (rawmode) {
         fprintf(fp,"%s",msg);
     } else {
-        strftime(buf,sizeof(buf),"%d %b %H:%M:%S",localtime(&now));
+        int off;
+        struct timeval tv;
+
+        gettimeofday(&tv,NULL);
+        off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec));
+        snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000);
         fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg);
     }
     fflush(fp);
@@ -1082,7 +1087,7 @@ void initServerConfig() {
     server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT;
     server.repl_serve_stale_data = 1;
     server.repl_slave_ro = 1;
-    server.repl_down_since = -1;
+    server.repl_down_since = time(NULL);
 
     /* Client output buffer limits */
     server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0;
@@ -1738,12 +1743,16 @@ sds genRedisInfoString(char *section) {
 
     /* Server */
     if (allsections || defsections || !strcasecmp(section,"server")) {
+        struct utsname name;
+
         if (sections++) info = sdscat(info,"\r\n");
+        uname(&name);
         info = sdscatprintf(info,
             "# Server\r\n"
             "redis_version:%s\r\n"
             "redis_git_sha1:%s\r\n"
             "redis_git_dirty:%d\r\n"
+            "os:%s %s %s\r\n"
             "arch_bits:%d\r\n"
             "multiplexing_api:%s\r\n"
             "gcc_version:%d.%d.%d\r\n"
@@ -1756,6 +1765,7 @@ sds genRedisInfoString(char *section) {
             REDIS_VERSION,
             redisGitSHA1(),
             strtol(redisGitDirty(),NULL,10) > 0,
+            name.sysname, name.release, name.machine,
             server.arch_bits,
             aeGetApiName(),
 #ifdef __GNUC__
index 8079fb5319a0e568b8d64e0bc44c3c5117e3614b..ff555619e5f811edbdc37413ca1f782616570794 100644 (file)
@@ -38,7 +38,7 @@
 #if defined(USE_TCMALLOC)
 #define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR))
 #include <google/tcmalloc.h>
-#if TC_VERSION_MAJOR >= 1 && TC_VERSION_MINOR >= 6
+#if (TC_VERSION_MAJOR == 1 && TC_VERSION_MINOR >= 6) || (TC_VERSION_MAJOR > 1)
 #define HAVE_MALLOC_SIZE 1
 #define zmalloc_size(p) tc_malloc_size(p)
 #else
@@ -49,7 +49,7 @@
 #define ZMALLOC_LIB ("jemalloc-" __xstr(JEMALLOC_VERSION_MAJOR) "." __xstr(JEMALLOC_VERSION_MINOR) "." __xstr(JEMALLOC_VERSION_BUGFIX))
 #define JEMALLOC_MANGLE
 #include <jemalloc/jemalloc.h>
-#if JEMALLOC_VERSION_MAJOR >= 2 && JEMALLOC_VERSION_MINOR >= 1
+#if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2)
 #define HAVE_MALLOC_SIZE 1
 #define zmalloc_size(p) JEMALLOC_P(malloc_usable_size)(p)
 #else
index 2c7d98deaa09a679a2e8b744ac626b4030d092e2..7c1edb550a2ae0a65095610fca3259e529e41ea0 100644 (file)
@@ -97,7 +97,7 @@ start_server {tags {"repl"}} {
                     [lindex $slaves 2] slaveof $master_host $master_port
 
                     # Wait for all the three slaves to reach the "online" state
-                    set retry 100
+                    set retry 500
                     while {$retry} {
                         set info [r -3 info]
                         if {[string match {*slave0:*,online*slave1:*,online*slave2:*,online*} $info]} {
index 6b432377ee9da4d22b213f9f8773c63254f455c0..b73cde0c17b4c335d0816ad034c7a389a4287745 100644 (file)
@@ -42,6 +42,52 @@ start_server {tags {"dump"}} {
             assert {[$first exists key] == 0}
             assert {[$second exists key] == 1}
             assert {[$second get key] eq {Some Value}}
+            assert {[$second ttl key] == -1}
+        }
+    }
+
+    test {MIGRATE propagates TTL correctly} {
+        set first [srv 0 client]
+        r set key "Some Value"
+        start_server {tags {"repl"}} {
+            set second [srv 0 client]
+            set second_host [srv 0 host]
+            set second_port [srv 0 port]
+
+            assert {[$first exists key] == 1}
+            assert {[$second exists key] == 0}
+            $first expire key 10
+            set ret [r -1 migrate $second_host $second_port key 9 5000]
+            assert {$ret eq {OK}}
+            assert {[$first exists key] == 0}
+            assert {[$second exists key] == 1}
+            assert {[$second get key] eq {Some Value}}
+            assert {[$second ttl key] >= 7 && [$second ttl key] <= 10}
+        }
+    }
+
+    test {MIGRATE can correctly transfer large values} {
+        set first [srv 0 client]
+        r del key
+        for {set j 0} {$j < 5000} {incr j} {
+            r rpush key 1 2 3 4 5 6 7 8 9 10
+            r rpush key "item 1" "item 2" "item 3" "item 4" "item 5" \
+                        "item 6" "item 7" "item 8" "item 9" "item 10"
+        }
+        assert {[string length [r dump key]] > (1024*64)}
+        start_server {tags {"repl"}} {
+            set second [srv 0 client]
+            set second_host [srv 0 host]
+            set second_port [srv 0 port]
+
+            assert {[$first exists key] == 1}
+            assert {[$second exists key] == 0}
+            set ret [r -1 migrate $second_host $second_port key 9 10000]
+            assert {$ret eq {OK}}
+            assert {[$first exists key] == 0}
+            assert {[$second exists key] == 1}
+            assert {[$second ttl key] == -1}
+            assert {[$second llen key] == 5000*20}
         }
     }
 
index 96cccc2bfbc1a8e0be5cb4379c48c434068a1fde..f6ca8874b4ebb937d861f39aa5e6426465829569 100755 (executable)
@@ -10,7 +10,8 @@ GROUPS = [
   "pubsub",
   "transactions",
   "connection",
-  "server"
+  "server",
+  "scripting"
 ].freeze
 
 GROUPS_BY_NAME = Hash[*
@@ -48,7 +49,7 @@ def commands
   require "json"
   require "uri"
 
-  url = URI.parse "https://github.com/antirez/redis-doc/raw/master/commands.json"
+  url = URI.parse "https://raw.github.com/antirez/redis-doc/master/commands.json"
   client = Net::HTTP.new url.host, url.port
   client.use_ssl = true
   response = client.get url.path