Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
f2d9f50f
Commit
f2d9f50f
authored
Jan 12, 2010
by
antirez
Browse files
more non blocking VM changes
parent
d663729a
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
f2d9f50f
...
@@ -949,6 +949,7 @@ static unsigned int dictEncObjHash(const void *key) {
...
@@ -949,6 +949,7 @@ static unsigned int dictEncObjHash(const void *key) {
return hash;
return hash;
}
}
/* Sets type and expires */
static dictType setDictType = {
static dictType setDictType = {
dictEncObjHash, /* hash function */
dictEncObjHash, /* hash function */
NULL, /* key dup */
NULL, /* key dup */
...
@@ -958,6 +959,7 @@ static dictType setDictType = {
...
@@ -958,6 +959,7 @@ static dictType setDictType = {
NULL /* val destructor */
NULL /* val destructor */
};
};
/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */
static dictType zsetDictType = {
static dictType zsetDictType = {
dictEncObjHash, /* hash function */
dictEncObjHash, /* hash function */
NULL, /* key dup */
NULL, /* key dup */
...
@@ -967,6 +969,7 @@ static dictType zsetDictType = {
...
@@ -967,6 +969,7 @@ static dictType zsetDictType = {
dictVanillaFree /* val destructor of malloc(sizeof(double)) */
dictVanillaFree /* val destructor of malloc(sizeof(double)) */
};
};
/* Db->dict */
static dictType hashDictType = {
static dictType hashDictType = {
dictObjHash, /* hash function */
dictObjHash, /* hash function */
NULL, /* key dup */
NULL, /* key dup */
...
@@ -976,6 +979,16 @@ static dictType hashDictType = {
...
@@ -976,6 +979,16 @@ static dictType hashDictType = {
dictRedisObjectDestructor /* val destructor */
dictRedisObjectDestructor /* val destructor */
};
};
/* Db->expires */
static dictType keyptrDictType = {
dictObjHash, /* hash function */
NULL, /* key dup */
NULL, /* val dup */
dictObjKeyCompare, /* key compare */
dictRedisObjectDestructor, /* key destructor */
NULL /* val destructor */
};
/* Keylist hash table type has unencoded redis objects as keys and
/* Keylist hash table type has unencoded redis objects as keys and
* lists as values. It's used for blocking operations (BLPOP) */
* lists as values. It's used for blocking operations (BLPOP) */
static dictType keylistDictType = {
static dictType keylistDictType = {
...
@@ -1402,7 +1415,7 @@ static void initServer() {
...
@@ -1402,7 +1415,7 @@ static void initServer() {
}
}
for (j = 0; j < server.dbnum; j++) {
for (j = 0; j < server.dbnum; j++) {
server.db[j].dict = dictCreate(&hashDictType,NULL);
server.db[j].dict = dictCreate(&hashDictType,NULL);
server.db[j].expires = dictCreate(&
set
DictType,NULL);
server.db[j].expires = dictCreate(&
keyptr
DictType,NULL);
server.db[j].blockingkeys = dictCreate(&keylistDictType,NULL);
server.db[j].blockingkeys = dictCreate(&keylistDictType,NULL);
server.db[j].id = j;
server.db[j].id = j;
}
}
...
@@ -2854,21 +2867,16 @@ static int rdbSaveStringObjectRaw(FILE *fp, robj *obj) {
...
@@ -2854,21 +2867,16 @@ static int rdbSaveStringObjectRaw(FILE *fp, robj *obj) {
static int rdbSaveStringObject(FILE *fp, robj *obj) {
static int rdbSaveStringObject(FILE *fp, robj *obj) {
int retval;
int retval;
if (obj->storage == REDIS_VM_MEMORY &&
/* Avoid incr/decr ref count business when possible.
obj->encoding != REDIS_ENCODING_RAW)
* This plays well with copy-on-write given that we are probably
{
* in a child process (BGSAVE). Also this makes sure key objects
* of swapped objects are not incRefCount-ed (an assert does not allow
* this in order to avoid bugs) */
if (obj->encoding != REDIS_ENCODING_RAW) {
obj = getDecodedObject(obj);
obj = getDecodedObject(obj);
retval = rdbSaveStringObjectRaw(fp,obj);
retval = rdbSaveStringObjectRaw(fp,obj);
decrRefCount(obj);
decrRefCount(obj);
} else {
} else {
/* This is a fast path when we are sure the object is not encoded.
* Note that's any *faster* actually as we needed to add the conditional
* but because this may happen in a background process we don't want
* to touch the object fields with incr/decrRefCount in order to
* preveny copy on write of pages.
*
* Also incrRefCount() will have a failing assert() if we try to call
* it against an object with storage != REDIS_VM_MEMORY. */
retval = rdbSaveStringObjectRaw(fp,obj);
retval = rdbSaveStringObjectRaw(fp,obj);
}
}
return retval;
return retval;
...
@@ -6670,7 +6678,12 @@ static int fwriteBulk(FILE *fp, robj *obj) {
...
@@ -6670,7 +6678,12 @@ static int fwriteBulk(FILE *fp, robj *obj) {
char buf[128];
char buf[128];
int decrrc = 0;
int decrrc = 0;
if (obj->storage == REDIS_VM_MEMORY && obj->encoding != REDIS_ENCODING_RAW){
/* Avoid the incr/decr ref count business if possible to help
* copy-on-write (we are often in a child process when this function
* is called).
* Also makes sure that key objects don't get incrRefCount-ed when VM
* is enabled */
if (obj->encoding != REDIS_ENCODING_RAW) {
obj = getDecodedObject(obj);
obj = getDecodedObject(obj);
decrrc = 1;
decrrc = 1;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment