]> git.saurik.com Git - redis.git/commitdiff
Merge branch 'issue_193' of git://github.com/gnrfan/redis
authorantirez <antirez@gmail.com>
Mon, 22 Mar 2010 16:29:20 +0000 (17:29 +0100)
committerantirez <antirez@gmail.com>
Mon, 22 Mar 2010 16:29:20 +0000 (17:29 +0100)
1  2 
redis.c

diff --combined redis.c
index e0486dc85a6eaf0a125467ccbf0099de9d654e60,72cdd256b0590a713c6cd531fa7a97c0cd97ac0d..e3afa53e81e01bf94e067d0a399ac82d67ccea1e
+++ b/redis.c
@@@ -27,7 -27,7 +27,7 @@@
   * POSSIBILITY OF SUCH DAMAGE.
   */
  
 -#define REDIS_VERSION "1.3.6"
 +#define REDIS_VERSION "1.3.7"
  
  #include "fmacros.h"
  #include "config.h"
@@@ -1102,8 -1102,6 +1102,8 @@@ static dictType keylistDictType = 
      dictListDestructor          /* val destructor */
  };
  
 +static void version();
 +
  /* ========================= Random utility functions ======================= */
  
  /* Redis generally does not try to recover from out of memory conditions
@@@ -1616,12 -1614,15 +1616,15 @@@ static void loadServerConfig(char *file
      char buf[REDIS_CONFIGLINE_MAX+1], *err = NULL;
      int linenum = 0;
      sds line = NULL;
+     char *errormsg = "Fatal error, can't open config file '%s'";
+     char *errorbuf = zmalloc(sizeof(char)*(strlen(errormsg)+strlen(filename)));
+     sprintf(errorbuf, errormsg, filename);
  
      if (filename[0] == '-' && filename[1] == '\0')
          fp = stdin;
      else {
          if ((fp = fopen(filename,"r")) == NULL) {
-             redisLog(REDIS_WARNING,"Fatal error, can't open config file");
+             redisLog(REDIS_WARNING, errorbuf);
              exit(1);
          }
      }
              if (server.dbnum < 1) {
                  err = "Invalid number of databases"; goto loaderr;
              }
 +        } else if (!strcasecmp(argv[0],"include") && argc == 2) {
 +            loadServerConfig(argv[1]);
          } else if (!strcasecmp(argv[0],"maxclients") && argc == 2) {
              server.maxclients = atoi(argv[1]);
          } else if (!strcasecmp(argv[0],"maxmemory") && argc == 2) {
@@@ -6488,6 -6487,9 +6491,6 @@@ static sds genRedisInfoString(void) 
      int j;
      char hmem[64];
  
 -    server.hash_max_zipmap_entries = REDIS_HASH_MAX_ZIPMAP_ENTRIES;
 -    server.hash_max_zipmap_value = REDIS_HASH_MAX_ZIPMAP_VALUE;
 -  
      bytesToHuman(hmem,zmalloc_used_memory());
      info = sdscatprintf(sdsempty(),
          "redis_version:%s\r\n"
@@@ -8319,38 -8321,6 +8322,38 @@@ static double computeObjectSwappability
              if (z) asize += sizeof(zskiplistNode)*dictSize(d);
          }
          break;
 +    case REDIS_HASH:
 +        if (o->encoding == REDIS_ENCODING_ZIPMAP) {
 +            unsigned char *p = zipmapRewind((unsigned char*)o->ptr);
 +            unsigned int len = zipmapLen((unsigned char*)o->ptr);
 +            unsigned int klen, vlen;
 +            unsigned char *key, *val;
 +
 +            if ((p = zipmapNext(p,&key,&klen,&val,&vlen)) == NULL) {
 +                klen = 0;
 +                vlen = 0;
 +            }
 +            asize = len*(klen+vlen+3);
 +        } else if (o->encoding == REDIS_ENCODING_HT) {
 +            d = o->ptr;
 +            asize = sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d));
 +            if (dictSize(d)) {
 +                long elesize;
 +                robj *ele;
 +
 +                de = dictGetRandomKey(d);
 +                ele = dictGetEntryKey(de);
 +                elesize = (ele->encoding == REDIS_ENCODING_RAW) ?
 +                                (sizeof(*o)+sdslen(ele->ptr)) :
 +                                sizeof(*o);
 +                ele = dictGetEntryVal(de);
 +                elesize = (ele->encoding == REDIS_ENCODING_RAW) ?
 +                                (sizeof(*o)+sdslen(ele->ptr)) :
 +                                sizeof(*o);
 +                asize += (sizeof(struct dictEntry)+elesize)*dictSize(d);
 +            }
 +        }
 +        break;
      }
      return (double)age*log(1+asize);
  }
@@@ -8753,18 -8723,13 +8756,18 @@@ static void *IOThreadEntryPoint(void *a
  static void spawnIOThread(void) {
      pthread_t thread;
      sigset_t mask, omask;
 +    int err;
  
      sigemptyset(&mask);
      sigaddset(&mask,SIGCHLD);
      sigaddset(&mask,SIGHUP);
      sigaddset(&mask,SIGPIPE);
      pthread_sigmask(SIG_SETMASK, &mask, &omask);
 -    pthread_create(&thread,&server.io_threads_attr,IOThreadEntryPoint,NULL);
 +    while ((err = pthread_create(&thread,&server.io_threads_attr,IOThreadEntryPoint,NULL)) != 0) {
 +        redisLog(REDIS_WARNING,"Unable to spawn an I/O thread: %s",
 +            strerror(err));
 +        usleep(1000000);
 +    }
      pthread_sigmask(SIG_SETMASK, &omask, NULL);
      server.io_active_threads++;
  }
@@@ -9160,19 -9125,11 +9163,19 @@@ static void daemonize(void) 
      }
  }
  
 +static void version() {
 +    printf("Redis server version %s\n", REDIS_VERSION);
 +    exit(0);
 +}
 +
  int main(int argc, char **argv) {
      time_t start;
  
      initServerConfig();
      if (argc == 2) {
 +        if ((strcmp(argv[1], "-v") == 0) || (strcmp(argv[1], "--version") == 0)) {
 +            version();
 +        }
          resetServerSaveParams();
          loadServerConfig(argv[1]);
      } else if (argc > 2) {