X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/e3e69935108585c448bfd2ff5ba34fd7d9a6e4b9..f15e33a884e45923a104ac4bfb230199e2a2f443:/src/redis.h diff --git a/src/redis.h b/src/redis.h index 875f9afe..dda0f6c9 100644 --- a/src/redis.h +++ b/src/redis.h @@ -55,6 +55,10 @@ #define REDIS_AUTO_AOFREWRITE_MIN_SIZE (1024*1024) #define REDIS_SLOWLOG_LOG_SLOWER_THAN 10000 #define REDIS_SLOWLOG_MAX_LEN 64 +#define REDIS_MAX_CLIENTS 10000 + +#define REDIS_REPL_TIMEOUT 60 +#define REDIS_REPL_PING_SLAVE_PERIOD 10 /* Hash table parameters */ #define REDIS_HT_MINFILL 10 /* Minimal hash table fill 10% */ @@ -133,6 +137,7 @@ #define REDIS_UNBLOCKED 256 /* This client was unblocked and is stored in server.unblocked_clients */ #define REDIS_LUA_CLIENT 512 /* This is a non connected client used by Lua */ +#define REDIS_ASKING 1024 /* Client issued the ASKING command */ /* Client request types */ #define REDIS_REQ_INLINE 1 @@ -208,10 +213,10 @@ #define REDIS_MAXMEMORY_NO_EVICTION 5 /* Scripting */ -#define REDIS_LUA_TIME_LIMIT 60000 /* milliseconds */ +#define REDIS_LUA_TIME_LIMIT 5000 /* milliseconds */ /* We can print the stacktrace, so our assert is defined this way: */ -#define redisAssertWithClientInfo(_c,_e) ((_e)?(void)0 : (_redisAssertWithClientInfo(_c,#_e,__FILE__,__LINE__),_exit(1))) +#define redisAssertWithInfo(_c,_o,_e) ((_e)?(void)0 : (_redisAssertWithInfo(_c,_o,#_e,__FILE__,__LINE__),_exit(1))) #define redisAssert(_e) ((_e)?(void)0 : (_redisAssert(#_e,__FILE__,__LINE__),_exit(1))) #define redisPanic(_e) _redisPanic(#_e,__FILE__,__LINE__),_exit(1) @@ -344,7 +349,7 @@ struct sharedObjectsStruct { robj *crlf, *ok, *err, *emptybulk, *czero, *cone, *cnegone, *pong, *space, *colon, *nullbulk, *nullmultibulk, *queued, *emptymultibulk, *wrongtypeerr, *nokeyerr, *syntaxerr, *sameobjecterr, - *outofrangeerr, *noscripterr, *loadingerr, *plus, + *outofrangeerr, *noscripterr, *loadingerr, *slowscripterr, *plus, *select0, *select1, *select2, *select3, *select4, *select5, *select6, *select7, *select8, *select9, *messagebulk, *pmessagebulk, *subscribebulk, *unsubscribebulk, *mbulk3, @@ -445,6 +450,7 @@ typedef struct { #define CLUSTERMSG_TYPE_PONG 1 /* Pong (reply to Ping) */ #define CLUSTERMSG_TYPE_MEET 2 /* Meet "let's join" message */ #define CLUSTERMSG_TYPE_FAIL 3 /* Mark node xxx as failing */ +#define CLUSTERMSG_TYPE_PUBLISH 4 /* Pub/Sub Publish propatagion */ /* Initially we don't know our "name", but we'll find it once we connect * to the first node, using the getsockname() function. Then we'll use this @@ -463,16 +469,28 @@ typedef struct { char nodename[REDIS_CLUSTER_NAMELEN]; } clusterMsgDataFail; +typedef struct { + uint32_t channel_len; + uint32_t message_len; + unsigned char bulk_data[8]; /* defined as 8 just for alignment concerns. */ +} clusterMsgDataPublish; + union clusterMsgData { /* PING, MEET and PONG */ struct { /* Array of N clusterMsgDataGossip structures */ clusterMsgDataGossip gossip[1]; } ping; + /* FAIL */ struct { clusterMsgDataFail about; } fail; + + /* PUBLISH */ + struct { + clusterMsgDataPublish msg; + } publish; }; typedef struct { @@ -502,6 +520,7 @@ struct redisServer { int port; char *bindaddr; char *unixsocket; + mode_t unixsocketperm; int ipfd; int sofd; int cfd; @@ -575,6 +594,8 @@ struct redisServer { char *masterauth; char *masterhost; int masterport; + int repl_ping_slave_period; + int repl_timeout; redisClient *master; /* client that is master for this slave */ int repl_syncio_timeout; /* timeout for synchronous I/O calls */ int replstate; /* replication status if the instance is a slave */ @@ -624,6 +645,8 @@ struct redisServer { long long lua_time_start; int lua_random_dirty; /* True if a random command was called during the exection of the current script. */ + int lua_timedout; /* True if we reached the time limit for script + execution. */ }; typedef struct pubsubPattern { @@ -930,6 +953,7 @@ int pubsubUnsubscribeAllChannels(redisClient *c, int notify); int pubsubUnsubscribeAllPatterns(redisClient *c, int notify); void freePubsubPattern(void *p); int listMatchPubsubPattern(void *a, void *b); +int pubsubPublishMessage(robj *channel, robj *message); /* Configuration */ void loadServerConfig(char *filename); @@ -976,6 +1000,7 @@ clusterNode *createClusterNode(char *nodename, int flags); int clusterAddNode(clusterNode *node); void clusterCron(void); clusterNode *getNodeByQuery(redisClient *c, struct redisCommand *cmd, robj **argv, int argc, int *hashslot, int *ask); +void clusterPropagatePublish(robj *channel, robj *message); /* Scripting */ void scriptingInit(void); @@ -1105,11 +1130,13 @@ void unwatchCommand(redisClient *c); void clusterCommand(redisClient *c); void restoreCommand(redisClient *c); void migrateCommand(redisClient *c); +void askingCommand(redisClient *c); void dumpCommand(redisClient *c); void objectCommand(redisClient *c); void clientCommand(redisClient *c); void evalCommand(redisClient *c); void evalShaCommand(redisClient *c); +void scriptCommand(redisClient *c); #if defined(__GNUC__) void *calloc(size_t count, size_t size) __attribute__ ((deprecated)); @@ -1119,7 +1146,7 @@ void *realloc(void *ptr, size_t size) __attribute__ ((deprecated)); #endif /* Debugging stuff */ -void _redisAssertWithClientInfo(redisClient *c, char *estr, char *file, int line); +void _redisAssertWithInfo(redisClient *c, robj *o, char *estr, char *file, int line); void _redisAssert(char *estr, char *file, int line); void _redisPanic(char *msg, char *file, int line);