summaryrefslogtreecommitdiff
path: root/hircluster.h
diff options
context:
space:
mode:
Diffstat (limited to 'hircluster.h')
-rw-r--r--hircluster.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/hircluster.h b/hircluster.h
new file mode 100644
index 0000000..4c55c50
--- /dev/null
+++ b/hircluster.h
@@ -0,0 +1,177 @@
+
+#ifndef __HIRCLUSTER_H
+#define __HIRCLUSTER_H
+
+#include "hiredis.h"
+#include "async.h"
+
+#define HIREDIS_VIP_MAJOR 0
+#define HIREDIS_VIP_MINOR 4
+#define HIREDIS_VIP_PATCH 4
+
+#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 add open slot
+ * for master node. (100000000000000) */
+#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