| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #ifndef __HIRCLUSTER_H
- #define __HIRCLUSTER_H
- #include "hiredis.h"
- #include "async.h"
- #define HIREDIS_VIP_MAJOR 0
- #define HIREDIS_VIP_MINOR 3
- #define HIREDIS_VIP_PATCH 0
- #define REDIS_CLUSTER_SLOTS 16384
- #define REDIS_ROLE_NULL 0
- #define REDIS_ROLE_MASTER 1
- #define REDIS_ROLE_SLAVE 2
- #define HIRCLUSTER_FLAG_NULL 0x0
- /* The flag to decide whether add slave node in
- * redisClusterContext->nodes. This is set in the
- * least significant bit of the flags field in
- * redisClusterContext. (1000000000000) */
- #define HIRCLUSTER_FLAG_ADD_SLAVE 0x1000
- /* The flag to decide whether add open slot
- * for master node. (10000000000000) */
- #define HIRCLUSTER_FLAG_ADD_OPENSLOT 0x2000
- /* The flag to decide whether get the route
- * table by 'cluster slots' command. Default
- * is 'cluster nodes' command.*/
- #define HIRCLUSTER_FLAG_ROUTE_USE_SLOTS 0x4000
- struct dict;
- struct hilist;
- typedef struct cluster_node
- {
- sds name;
- sds addr;
- sds host;
- int port;
- uint8_t role;
- uint8_t myself; /* myself ? */
- redisContext *con;
- redisAsyncContext *acon;
- struct hilist *slots;
- struct hilist *slaves;
- int failure_count;
- void *data; /* Not used by hiredis */
- struct hiarray *migrating; /* copen_slot[] */
- struct hiarray *importing; /* copen_slot[] */
- }cluster_node;
- typedef struct cluster_slot
- {
- uint32_t start;
- uint32_t end;
- cluster_node *node; /* master that this slot region belong to */
- }cluster_slot;
- typedef struct copen_slot
- {
- uint32_t slot_num; /* slot number */
- int migrate; /* migrating or importing? */
- sds remote_name; /* name for the node that this slot migrating to/importing from */
- cluster_node *node; /* master that this slot belong to */
- }copen_slot;
- #ifdef __cplusplus
- extern "C" {
- #endif
- /* Context for a connection to Redis cluster */
- typedef struct redisClusterContext {
- int err; /* Error flags, 0 when there is no error */
- char errstr[128]; /* String representation of error when applicable */
- sds ip;
- int port;
- int flags;
- enum redisConnectionType connection_type;
- struct timeval *timeout;
-
- struct hiarray *slots;
- struct dict *nodes;
- cluster_node *table[REDIS_CLUSTER_SLOTS];
- uint64_t route_version;
- int max_redirect_count;
- int retry_count;
- struct hilist *requests;
- int need_update_route;
- int64_t update_route_time;
- } redisClusterContext;
- redisClusterContext *redisClusterConnect(const char *addrs, int flags);
- redisClusterContext *redisClusterConnectWithTimeout(const char *addrs,
- const struct timeval tv, int flags);
- redisClusterContext *redisClusterConnectNonBlock(const char *addrs, int flags);
- void redisClusterFree(redisClusterContext *cc);
- void redisClusterSetMaxRedirect(redisClusterContext *cc, int max_redirect_count);
- void *redisClusterFormattedCommand(redisClusterContext *cc, char *cmd, int len);
- void *redisClustervCommand(redisClusterContext *cc, const char *format, va_list ap);
- void *redisClusterCommand(redisClusterContext *cc, const char *format, ...);
- void *redisClusterCommandArgv(redisClusterContext *cc, int argc, const char **argv, const size_t *argvlen);
- redisContext *ctx_get_by_node(struct cluster_node *node, const struct timeval *timeout, int flags);
- int redisClusterAppendFormattedCommand(redisClusterContext *cc, char *cmd, int len);
- int redisClustervAppendCommand(redisClusterContext *cc, const char *format, va_list ap);
- int redisClusterAppendCommand(redisClusterContext *cc, const char *format, ...);
- int redisClusterAppendCommandArgv(redisClusterContext *cc, int argc, const char **argv, const size_t *argvlen);
- int redisClusterGetReply(redisClusterContext *cc, void **reply);
- void redisClusterReset(redisClusterContext *cc);
- int cluster_update_route(redisClusterContext *cc);
- int test_cluster_update_route(redisClusterContext *cc);
- struct dict *parse_cluster_nodes(redisClusterContext *cc, char *str, int str_len, int flags);
- struct dict *parse_cluster_slots(redisClusterContext *cc, redisReply *reply, int flags);
- /*############redis cluster async############*/
- struct redisClusterAsyncContext;
- typedef int (adapterAttachFn)(redisAsyncContext*, void*);
- typedef void (redisClusterCallbackFn)(struct redisClusterAsyncContext*, void*, void*);
- /* Context for an async connection to Redis */
- typedef struct redisClusterAsyncContext {
-
- redisClusterContext *cc;
- /* Setup error flags so they can be used directly. */
- int err;
- char errstr[128]; /* String representation of error when applicable */
- /* Not used by hiredis */
- void *data;
- void *adapter;
- adapterAttachFn *attach_fn;
- /* Called when either the connection is terminated due to an error or per
- * user request. The status is set accordingly (REDIS_OK, REDIS_ERR). */
- redisDisconnectCallback *onDisconnect;
- /* Called when the first write event was received. */
- redisConnectCallback *onConnect;
- } redisClusterAsyncContext;
- redisClusterAsyncContext *redisClusterAsyncConnect(const char *addrs, int flags);
- int redisClusterAsyncSetConnectCallback(redisClusterAsyncContext *acc, redisConnectCallback *fn);
- int redisClusterAsyncSetDisconnectCallback(redisClusterAsyncContext *acc, redisDisconnectCallback *fn);
- int redisClusterAsyncFormattedCommand(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, char *cmd, int len);
- int redisClustervAsyncCommand(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, const char *format, va_list ap);
- int redisClusterAsyncCommand(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, const char *format, ...);
- int redisClusterAsyncCommandArgv(redisClusterAsyncContext *acc, redisClusterCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen);
- void redisClusterAsyncDisconnect(redisClusterAsyncContext *acc);
- void redisClusterAsyncFree(redisClusterAsyncContext *acc);
- redisAsyncContext *actx_get_by_node(redisClusterAsyncContext *acc, cluster_node *node);
- #ifdef __cplusplus
- }
- #endif
- #endif
|