mirror of
https://github.com/fluencelabs/redis
synced 2025-03-31 14:51:04 +00:00
cluster configuration saving
This commit is contained in:
parent
e6f0a7b237
commit
c7c7cfbddc
109
src/cluster.c
109
src/cluster.c
@ -1,6 +1,8 @@
|
|||||||
#include "redis.h"
|
#include "redis.h"
|
||||||
|
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
void clusterAcceptHandler(aeEventLoop *el, int fd, void *privdata, int mask);
|
void clusterAcceptHandler(aeEventLoop *el, int fd, void *privdata, int mask);
|
||||||
void clusterReadHandler(aeEventLoop *el, int fd, void *privdata, int mask);
|
void clusterReadHandler(aeEventLoop *el, int fd, void *privdata, int mask);
|
||||||
@ -8,6 +10,7 @@ void clusterSendPing(clusterLink *link, int type);
|
|||||||
void clusterSendFail(char *nodename);
|
void clusterSendFail(char *nodename);
|
||||||
void clusterUpdateState(void);
|
void clusterUpdateState(void);
|
||||||
int clusterNodeGetSlotBit(clusterNode *n, int slot);
|
int clusterNodeGetSlotBit(clusterNode *n, int slot);
|
||||||
|
sds clusterGenNodesDescription(void);
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* Initialization
|
* Initialization
|
||||||
@ -31,7 +34,8 @@ void clusterGetRandomName(char *p) {
|
|||||||
|
|
||||||
int clusterLoadConfig(char *filename) {
|
int clusterLoadConfig(char *filename) {
|
||||||
FILE *fp = fopen(filename,"r");
|
FILE *fp = fopen(filename,"r");
|
||||||
|
|
||||||
|
return REDIS_ERR;
|
||||||
if (fp == NULL) return REDIS_ERR;
|
if (fp == NULL) return REDIS_ERR;
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
@ -45,6 +49,25 @@ fmterr:
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Cluster node configuration is exactly the same as CLUSTER NODES output.
|
||||||
|
*
|
||||||
|
* This function writes the node config and returns 0, on error -1
|
||||||
|
* is returned. */
|
||||||
|
int clusterSaveConfig(char *filename) {
|
||||||
|
sds ci = clusterGenNodesDescription();
|
||||||
|
int fd;
|
||||||
|
|
||||||
|
if ((fd = open(filename,O_WRONLY|O_CREAT,0644)) == -1) goto err;
|
||||||
|
if (write(fd,ci,sdslen(ci)) != (ssize_t)sdslen(ci)) goto err;
|
||||||
|
close(fd);
|
||||||
|
sdsfree(ci);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
sdsfree(ci);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
void clusterInit(void) {
|
void clusterInit(void) {
|
||||||
server.cluster.myself = createClusterNode(NULL,REDIS_NODE_MYSELF);
|
server.cluster.myself = createClusterNode(NULL,REDIS_NODE_MYSELF);
|
||||||
server.cluster.state = REDIS_CLUSTER_FAIL;
|
server.cluster.state = REDIS_CLUSTER_FAIL;
|
||||||
@ -61,6 +84,10 @@ void clusterInit(void) {
|
|||||||
* by the createClusterNode() function. */
|
* by the createClusterNode() function. */
|
||||||
redisLog(REDIS_NOTICE,"No cluster configuration found, I'm %.40s",
|
redisLog(REDIS_NOTICE,"No cluster configuration found, I'm %.40s",
|
||||||
server.cluster.myself->name);
|
server.cluster.myself->name);
|
||||||
|
if (clusterSaveConfig("cluster.conf") == -1) {
|
||||||
|
redisLog(REDIS_WARNING,"Fatal: can't update cluster config file.");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
clusterAddNode(server.cluster.myself);
|
clusterAddNode(server.cluster.myself);
|
||||||
/* We need a listening TCP port for our cluster messaging needs */
|
/* We need a listening TCP port for our cluster messaging needs */
|
||||||
@ -874,6 +901,48 @@ void clusterUpdateState(void) {
|
|||||||
* CLUSTER command
|
* CLUSTER command
|
||||||
* -------------------------------------------------------------------------- */
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
sds clusterGenNodesDescription(void) {
|
||||||
|
sds ci = sdsempty();
|
||||||
|
dictIterator *di;
|
||||||
|
dictEntry *de;
|
||||||
|
|
||||||
|
di = dictGetIterator(server.cluster.nodes);
|
||||||
|
while((de = dictNext(di)) != NULL) {
|
||||||
|
clusterNode *node = dictGetEntryVal(de);
|
||||||
|
|
||||||
|
/* Node coordinates */
|
||||||
|
ci = sdscatprintf(ci,"%.40s %s:%d ",
|
||||||
|
node->name,
|
||||||
|
node->ip,
|
||||||
|
node->port);
|
||||||
|
|
||||||
|
/* Flags */
|
||||||
|
if (node->flags == 0) ci = sdscat(ci,"noflags,");
|
||||||
|
if (node->flags & REDIS_NODE_MYSELF) ci = sdscat(ci,"myself,");
|
||||||
|
if (node->flags & REDIS_NODE_MASTER) ci = sdscat(ci,"master,");
|
||||||
|
if (node->flags & REDIS_NODE_SLAVE) ci = sdscat(ci,"slave,");
|
||||||
|
if (node->flags & REDIS_NODE_PFAIL) ci = sdscat(ci,"fail?,");
|
||||||
|
if (node->flags & REDIS_NODE_FAIL) ci = sdscat(ci,"fail,");
|
||||||
|
if (node->flags & REDIS_NODE_HANDSHAKE) ci =sdscat(ci,"handshake,");
|
||||||
|
if (node->flags & REDIS_NODE_NOADDR) ci = sdscat(ci,"noaddr,");
|
||||||
|
if (ci[sdslen(ci)-1] == ',') ci[sdslen(ci)-1] = ' ';
|
||||||
|
|
||||||
|
/* Slave of... or just "-" */
|
||||||
|
if (node->slaveof)
|
||||||
|
ci = sdscatprintf(ci,"%.40s ",node->slaveof->name);
|
||||||
|
else
|
||||||
|
ci = sdscatprintf(ci,"- ");
|
||||||
|
|
||||||
|
/* Latency from the POV of this node, link status */
|
||||||
|
ci = sdscatprintf(ci,"%ld %ld %s\n",
|
||||||
|
(long) node->ping_sent,
|
||||||
|
(long) node->pong_received,
|
||||||
|
node->link ? "connected" : "disconnected");
|
||||||
|
}
|
||||||
|
dictReleaseIterator(di);
|
||||||
|
return ci;
|
||||||
|
}
|
||||||
|
|
||||||
void clusterCommand(redisClient *c) {
|
void clusterCommand(redisClient *c) {
|
||||||
if (server.cluster_enabled == 0) {
|
if (server.cluster_enabled == 0) {
|
||||||
addReplyError(c,"This instance has cluster support disabled");
|
addReplyError(c,"This instance has cluster support disabled");
|
||||||
@ -905,45 +974,9 @@ void clusterCommand(redisClient *c) {
|
|||||||
clusterAddNode(n);
|
clusterAddNode(n);
|
||||||
addReply(c,shared.ok);
|
addReply(c,shared.ok);
|
||||||
} else if (!strcasecmp(c->argv[1]->ptr,"nodes") && c->argc == 2) {
|
} else if (!strcasecmp(c->argv[1]->ptr,"nodes") && c->argc == 2) {
|
||||||
sds ci = sdsempty();
|
|
||||||
dictIterator *di;
|
|
||||||
dictEntry *de;
|
|
||||||
robj *o;
|
robj *o;
|
||||||
|
sds ci = clusterGenNodesDescription();
|
||||||
|
|
||||||
di = dictGetIterator(server.cluster.nodes);
|
|
||||||
while((de = dictNext(di)) != NULL) {
|
|
||||||
clusterNode *node = dictGetEntryVal(de);
|
|
||||||
|
|
||||||
/* Node coordinates */
|
|
||||||
ci = sdscatprintf(ci,"%.40s %s:%d ",
|
|
||||||
node->name,
|
|
||||||
node->ip,
|
|
||||||
node->port);
|
|
||||||
|
|
||||||
/* Flags */
|
|
||||||
if (node->flags == 0) ci = sdscat(ci,"noflags,");
|
|
||||||
if (node->flags & REDIS_NODE_MYSELF) ci = sdscat(ci,"myself,");
|
|
||||||
if (node->flags & REDIS_NODE_MASTER) ci = sdscat(ci,"master,");
|
|
||||||
if (node->flags & REDIS_NODE_SLAVE) ci = sdscat(ci,"slave,");
|
|
||||||
if (node->flags & REDIS_NODE_PFAIL) ci = sdscat(ci,"fail?,");
|
|
||||||
if (node->flags & REDIS_NODE_FAIL) ci = sdscat(ci,"fail,");
|
|
||||||
if (node->flags & REDIS_NODE_HANDSHAKE) ci =sdscat(ci,"handshake,");
|
|
||||||
if (node->flags & REDIS_NODE_NOADDR) ci = sdscat(ci,"noaddr,");
|
|
||||||
if (ci[sdslen(ci)-1] == ',') ci[sdslen(ci)-1] = ' ';
|
|
||||||
|
|
||||||
/* Slave of... or just "-" */
|
|
||||||
if (node->slaveof)
|
|
||||||
ci = sdscatprintf(ci,"%.40s ",node->slaveof->name);
|
|
||||||
else
|
|
||||||
ci = sdscatprintf(ci,"- ");
|
|
||||||
|
|
||||||
/* Latency from the POV of this node, link status */
|
|
||||||
ci = sdscatprintf(ci,"%ld %ld %s\n",
|
|
||||||
(long) node->ping_sent,
|
|
||||||
(long) node->pong_received,
|
|
||||||
node->link ? "connected" : "disconnected");
|
|
||||||
}
|
|
||||||
dictReleaseIterator(di);
|
|
||||||
o = createObject(REDIS_STRING,ci);
|
o = createObject(REDIS_STRING,ci);
|
||||||
addReplyBulk(c,o);
|
addReplyBulk(c,o);
|
||||||
decrRefCount(o);
|
decrRefCount(o);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user