mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
VM hash type swappability implemented. Handling of failed pthread_create() call.
This commit is contained in:
parent
c77169b7e9
commit
a97b906092
4
TODO
4
TODO
@ -8,8 +8,6 @@ VERSION 2.0 TODO
|
|||||||
* Save dataset / fsync() on SIGTERM
|
* Save dataset / fsync() on SIGTERM
|
||||||
* MULTI/EXEC should support the "EXEC FSYNC" form?
|
* MULTI/EXEC should support the "EXEC FSYNC" form?
|
||||||
* BLPOP & C. tests (write a non blocking Tcl client as first step)
|
* BLPOP & C. tests (write a non blocking Tcl client as first step)
|
||||||
* ZCOUNT sortedset min max
|
|
||||||
* ZRANK: http://docs.google.com/viewer?a=v&q=cache:tCQaP3ZeN4YJ:courses.csail.mit.edu/6.046/spring04/handouts/ps5-sol.pdf+skip+list+rank+operation+augmented&hl=en&pid=bl&srcid=ADGEEShXuNjTcZyXw_1cq9OaWpSXy3PprjXqVzmM-LE0ETFznLyrDXJKQ_mBPNT10R8ErkoiXD9JbMw_FaoHmOA4yoGVrA7tZWiy393JwfCwuewuP93sjbkzZ_gnEp83jYhPYjThaIzw&sig=AHIEtbRF0GkYCdYRFtTJBE69senXZwFY0w
|
|
||||||
* Once ZRANK is implemented, change the implementation of ZCOUNT to use the augmented skiplist in order to be much faster.
|
* Once ZRANK is implemented, change the implementation of ZCOUNT to use the augmented skiplist in order to be much faster.
|
||||||
* Write doc for ZCOUNT, and for open / closed intervals of sorted sets range operations.
|
* Write doc for ZCOUNT, and for open / closed intervals of sorted sets range operations.
|
||||||
|
|
||||||
@ -29,7 +27,7 @@ Virtual Memory sub-TODO:
|
|||||||
|
|
||||||
* Hashes (GET/SET/DEL/INCRBY/EXISTS/FIELDS/LEN/MSET/MGET). Special encoding for hashes with less than N elements.
|
* Hashes (GET/SET/DEL/INCRBY/EXISTS/FIELDS/LEN/MSET/MGET). Special encoding for hashes with less than N elements.
|
||||||
* Write documentation for APPEND
|
* Write documentation for APPEND
|
||||||
* Implement LEN, SUBSTR, PEEK, POKE, SETBIT, GETBIT
|
* Implement LEN, PEEK, POKE, SETBIT, GETBIT
|
||||||
|
|
||||||
VERSION 2.2 TODO (Fault tolerant sharding)
|
VERSION 2.2 TODO (Fault tolerant sharding)
|
||||||
===========================================
|
===========================================
|
||||||
|
39
redis.c
39
redis.c
@ -8318,6 +8318,38 @@ static double computeObjectSwappability(robj *o) {
|
|||||||
if (z) asize += sizeof(zskiplistNode)*dictSize(d);
|
if (z) asize += sizeof(zskiplistNode)*dictSize(d);
|
||||||
}
|
}
|
||||||
break;
|
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);
|
return (double)age*log(1+asize);
|
||||||
}
|
}
|
||||||
@ -8720,13 +8752,18 @@ static void *IOThreadEntryPoint(void *arg) {
|
|||||||
static void spawnIOThread(void) {
|
static void spawnIOThread(void) {
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
sigset_t mask, omask;
|
sigset_t mask, omask;
|
||||||
|
int err;
|
||||||
|
|
||||||
sigemptyset(&mask);
|
sigemptyset(&mask);
|
||||||
sigaddset(&mask,SIGCHLD);
|
sigaddset(&mask,SIGCHLD);
|
||||||
sigaddset(&mask,SIGHUP);
|
sigaddset(&mask,SIGHUP);
|
||||||
sigaddset(&mask,SIGPIPE);
|
sigaddset(&mask,SIGPIPE);
|
||||||
pthread_sigmask(SIG_SETMASK, &mask, &omask);
|
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);
|
pthread_sigmask(SIG_SETMASK, &omask, NULL);
|
||||||
server.io_active_threads++;
|
server.io_active_threads++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user