From: antirez Date: Mon, 22 Mar 2010 16:29:09 +0000 (+0100) Subject: Merge branch 'issue_191' of git://github.com/gnrfan/redis X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/5e2022bb484791b1b3099b7ce304f02b1f4a3212?hp=-c Merge branch 'issue_191' of git://github.com/gnrfan/redis --- 5e2022bb484791b1b3099b7ce304f02b1f4a3212 diff --combined redis.c index 1d70dbe6,ce4c50b6..e0486dc8 --- a/redis.c +++ 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,6 -1102,8 +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 @@@ -1701,8 -1703,6 +1703,8 @@@ static void loadServerConfig(char *file 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) { @@@ -6486,6 -6486,9 +6488,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" @@@ -8317,38 -8320,6 +8319,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); } @@@ -8751,18 -8722,13 +8753,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++; } @@@ -9158,11 -9124,19 +9160,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) {