]> git.saurik.com Git - redis.git/commitdiff
initial cluster config load code
authorantirez <antirez@gmail.com>
Thu, 7 Apr 2011 10:55:02 +0000 (12:55 +0200)
committerantirez <antirez@gmail.com>
Thu, 7 Apr 2011 10:55:02 +0000 (12:55 +0200)
src/cluster.c
src/sds.c
src/sds.h

index 783c658d43681d2d731e631c6f3bc7e6fa1b151a..46350cc221f4f5301bde8e96140c8c2fe60d62c2 100644 (file)
@@ -34,11 +34,32 @@ void clusterGetRandomName(char *p) {
 
 int clusterLoadConfig(char *filename) {
     FILE *fp = fopen(filename,"r");
+    char *line;
+    int maxline;
    
-    return REDIS_ERR;
     if (fp == NULL) return REDIS_ERR;
+
+    /* Parse the file. Note that single liens of the cluster config file can
+     * be really long as they include all the hash slots of the node.
+     * This means in the worst possible case REDIS_CLUSTER_SLOTS/2 integers.
+     * To simplify we allocate 1024+REDIS_CLUSTER_SLOTS*16 bytes per line. */
+    maxline = 1024+REDIS_CLUSTER_SLOTS*16;
+    line = zmalloc(maxline);
+    while(fgets(line,maxline,fp) != NULL) {
+        int argc;
+        sds *argv = sdssplitargs(line,&argc);
+
+        printf("Node: %s\n", argv[0]);
+
+        sdssplitargs_free(argv,argc);
+    }
+    zfree(line);
     fclose(fp);
 
+    /* Config sanity check */
+    /* TODO: check that myself is set. */
+    return REDIS_ERR;
+
     redisLog(REDIS_NOTICE,"Node configuration loaded, I'm %.40s",
         server.cluster.myself->name);
     return REDIS_OK;
@@ -57,8 +78,8 @@ int clusterSaveConfig(void) {
     sds ci = clusterGenNodesDescription();
     int fd;
     
-    if ((fd = open(server.cluster.configfile,O_WRONLY|O_CREAT,0644)) == -1)
-        goto err;
+    if ((fd = open(server.cluster.configfile,O_WRONLY|O_CREAT|O_TRUNC,0644))
+        == -1) goto err;
     if (write(fd,ci,sdslen(ci)) != (ssize_t)sdslen(ci)) goto err;
     close(fd);
     sdsfree(ci);
@@ -337,6 +358,7 @@ void clusterProcessGossipSection(clusterMsg *hdr, clusterLink *link) {
                 /* Broadcast the failing node name to everybody */
                 clusterSendFail(node->name);
                 clusterUpdateState();
+                clusterSaveConfigOrDie();
             }
         } else {
             /* If it's not in NOADDR state and we don't have it, we
@@ -522,7 +544,10 @@ int clusterProcessPacket(clusterLink *link) {
         clusterProcessGossipSection(hdr,link);
 
         /* Update the cluster state if needed */
-        if (update) clusterUpdateState();
+        if (update) {
+            clusterUpdateState();
+            clusterSaveConfigOrDie();
+        }
     } else if (type == CLUSTERMSG_TYPE_FAIL && sender) {
         clusterNode *failing;
 
@@ -534,6 +559,7 @@ int clusterProcessPacket(clusterLink *link) {
             failing->flags |= REDIS_NODE_FAIL;
             failing->flags &= ~REDIS_NODE_PFAIL;
             clusterUpdateState();
+            clusterSaveConfigOrDie();
         }
     } else {
         redisLog(REDIS_NOTICE,"Received unknown packet type: %d", type);
@@ -1047,6 +1073,7 @@ void clusterCommand(redisClient *c) {
         }
         zfree(slots);
         clusterUpdateState();
+        clusterSaveConfigOrDie();
         addReply(c,shared.ok);
     } else if (!strcasecmp(c->argv[1]->ptr,"info") && c->argc == 2) {
         char *statestr[] = {"ok","fail","needhelp"};
index 8c7540990e8154d0326f885e2a529da062acf21f..37c63b055a241880019c31720994e8f1fd125867 100644 (file)
--- a/src/sds.c
+++ b/src/sds.c
@@ -554,6 +554,13 @@ err:
     return NULL;
 }
 
+void sdssplitargs_free(sds *argv, int argc) {
+    int j;
+
+    for (j = 0 ;j < argc; j++) sdsfree(argv[j]);
+    zfree(argv);
+}
+
 #ifdef SDS_TEST_MAIN
 #include <stdio.h>
 #include "testhelp.h"
index 91a387821bb267b1084f09b340bd7aaef6f5e5d5..6a3178688f5040af7572deb72f628d507cabe4ee 100644 (file)
--- a/src/sds.h
+++ b/src/sds.h
@@ -74,5 +74,6 @@ void sdstoupper(sds s);
 sds sdsfromlonglong(long long value);
 sds sdscatrepr(sds s, char *p, size_t len);
 sds *sdssplitargs(char *line, int *argc);
+void sdssplitargs_free(sds *argv, int argc);
 
 #endif