mirror of
https://github.com/fluencelabs/redis
synced 2025-05-10 17:57:11 +00:00
VM/direct-saving fixes
This commit is contained in:
parent
e8852d782d
commit
760dec3a6c
@ -465,6 +465,7 @@ unsigned long estimateObjectIdleTime(robj *o) {
|
|||||||
robj *objectCommandLookup(redisClient *c, robj *key) {
|
robj *objectCommandLookup(redisClient *c, robj *key) {
|
||||||
dictEntry *de;
|
dictEntry *de;
|
||||||
|
|
||||||
|
if (server.vm_enabled) lookupKeyRead(c->db,key);
|
||||||
if ((de = dictFind(c->db->dict,key->ptr)) == NULL) return NULL;
|
if ((de = dictFind(c->db->dict,key->ptr)) == NULL) return NULL;
|
||||||
return (robj*) dictGetEntryVal(de);
|
return (robj*) dictGetEntryVal(de);
|
||||||
}
|
}
|
||||||
|
28
src/rdb.c
28
src/rdb.c
@ -376,6 +376,20 @@ off_t rdbSavedObjectPages(robj *o) {
|
|||||||
return (bytes+(server.vm_page_size-1))/server.vm_page_size;
|
return (bytes+(server.vm_page_size-1))/server.vm_page_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getObjectSaveType(robj *o) {
|
||||||
|
/* Fix the type id for specially encoded data types */
|
||||||
|
if (o->type == REDIS_HASH && o->encoding == REDIS_ENCODING_ZIPMAP)
|
||||||
|
return REDIS_HASH_ZIPMAP;
|
||||||
|
else if (o->type == REDIS_LIST && o->encoding == REDIS_ENCODING_ZIPLIST)
|
||||||
|
return REDIS_LIST_ZIPLIST;
|
||||||
|
else if (o->type == REDIS_SET && o->encoding == REDIS_ENCODING_INTSET)
|
||||||
|
return REDIS_SET_INTSET;
|
||||||
|
else if (o->type == REDIS_ZSET && o->encoding == REDIS_ENCODING_ZIPLIST)
|
||||||
|
return REDIS_ZSET_ZIPLIST;
|
||||||
|
else
|
||||||
|
return o->type;
|
||||||
|
}
|
||||||
|
|
||||||
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success */
|
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success */
|
||||||
int rdbSave(char *filename) {
|
int rdbSave(char *filename) {
|
||||||
dictIterator *di = NULL;
|
dictIterator *di = NULL;
|
||||||
@ -432,17 +446,8 @@ int rdbSave(char *filename) {
|
|||||||
* handling if the value is swapped out. */
|
* handling if the value is swapped out. */
|
||||||
if (!server.vm_enabled || o->storage == REDIS_VM_MEMORY ||
|
if (!server.vm_enabled || o->storage == REDIS_VM_MEMORY ||
|
||||||
o->storage == REDIS_VM_SWAPPING) {
|
o->storage == REDIS_VM_SWAPPING) {
|
||||||
int otype = o->type;
|
int otype = getObjectSaveType(o);
|
||||||
|
|
||||||
/* Fix the type id for specially encoded data types */
|
|
||||||
if (otype == REDIS_HASH && o->encoding == REDIS_ENCODING_ZIPMAP)
|
|
||||||
otype = REDIS_HASH_ZIPMAP;
|
|
||||||
else if (otype == REDIS_LIST &&
|
|
||||||
o->encoding == REDIS_ENCODING_ZIPLIST)
|
|
||||||
otype = REDIS_LIST_ZIPLIST;
|
|
||||||
else if (otype == REDIS_SET &&
|
|
||||||
o->encoding == REDIS_ENCODING_INTSET)
|
|
||||||
otype = REDIS_SET_INTSET;
|
|
||||||
/* Save type, key, value */
|
/* Save type, key, value */
|
||||||
if (rdbSaveType(fp,otype) == -1) goto werr;
|
if (rdbSaveType(fp,otype) == -1) goto werr;
|
||||||
if (rdbSaveStringObject(fp,&key) == -1) goto werr;
|
if (rdbSaveStringObject(fp,&key) == -1) goto werr;
|
||||||
@ -453,7 +458,8 @@ int rdbSave(char *filename) {
|
|||||||
/* Get a preview of the object in memory */
|
/* Get a preview of the object in memory */
|
||||||
po = vmPreviewObject(o);
|
po = vmPreviewObject(o);
|
||||||
/* Save type, key, value */
|
/* Save type, key, value */
|
||||||
if (rdbSaveType(fp,po->type) == -1) goto werr;
|
if (rdbSaveType(fp,getObjectSaveType(po)) == -1)
|
||||||
|
goto werr;
|
||||||
if (rdbSaveStringObject(fp,&key) == -1) goto werr;
|
if (rdbSaveStringObject(fp,&key) == -1) goto werr;
|
||||||
if (rdbSaveObject(fp,po) == -1) goto werr;
|
if (rdbSaveObject(fp,po) == -1) goto werr;
|
||||||
/* Remove the loaded object from memory */
|
/* Remove the loaded object from memory */
|
||||||
|
@ -770,6 +770,7 @@ off_t rdbSavedObjectLen(robj *o);
|
|||||||
off_t rdbSavedObjectPages(robj *o);
|
off_t rdbSavedObjectPages(robj *o);
|
||||||
robj *rdbLoadObject(int type, FILE *fp);
|
robj *rdbLoadObject(int type, FILE *fp);
|
||||||
void backgroundSaveDoneHandler(int statloc);
|
void backgroundSaveDoneHandler(int statloc);
|
||||||
|
int getObjectSaveType(robj *o);
|
||||||
|
|
||||||
/* AOF persistence */
|
/* AOF persistence */
|
||||||
void flushAppendOnlyFile(void);
|
void flushAppendOnlyFile(void);
|
||||||
|
8
src/vm.c
8
src/vm.c
@ -30,12 +30,12 @@
|
|||||||
|
|
||||||
/* Create a VM pointer object. This kind of objects are used in place of
|
/* Create a VM pointer object. This kind of objects are used in place of
|
||||||
* values in the key -> value hash table, for swapped out objects. */
|
* values in the key -> value hash table, for swapped out objects. */
|
||||||
vmpointer *createVmPointer(int vtype) {
|
vmpointer *createVmPointer(robj *o) {
|
||||||
vmpointer *vp = zmalloc(sizeof(vmpointer));
|
vmpointer *vp = zmalloc(sizeof(vmpointer));
|
||||||
|
|
||||||
vp->type = REDIS_VMPOINTER;
|
vp->type = REDIS_VMPOINTER;
|
||||||
vp->storage = REDIS_VM_SWAPPED;
|
vp->storage = REDIS_VM_SWAPPED;
|
||||||
vp->vtype = vtype;
|
vp->vtype = getObjectSaveType(o);
|
||||||
return vp;
|
return vp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +272,7 @@ vmpointer *vmSwapObjectBlocking(robj *val) {
|
|||||||
if (vmFindContiguousPages(&page,pages) == REDIS_ERR) return NULL;
|
if (vmFindContiguousPages(&page,pages) == REDIS_ERR) return NULL;
|
||||||
if (vmWriteObjectOnSwap(val,page) == REDIS_ERR) return NULL;
|
if (vmWriteObjectOnSwap(val,page) == REDIS_ERR) return NULL;
|
||||||
|
|
||||||
vp = createVmPointer(val->type);
|
vp = createVmPointer(val);
|
||||||
vp->page = page;
|
vp->page = page;
|
||||||
vp->usedpages = pages;
|
vp->usedpages = pages;
|
||||||
decrRefCount(val); /* Deallocate the object from memory. */
|
decrRefCount(val); /* Deallocate the object from memory. */
|
||||||
@ -663,7 +663,7 @@ void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata,
|
|||||||
printf("val->ptr: %s\n",(char*)j->val->ptr);
|
printf("val->ptr: %s\n",(char*)j->val->ptr);
|
||||||
}
|
}
|
||||||
redisAssert(j->val->storage == REDIS_VM_SWAPPING);
|
redisAssert(j->val->storage == REDIS_VM_SWAPPING);
|
||||||
vp = createVmPointer(j->val->type);
|
vp = createVmPointer(j->val);
|
||||||
vp->page = j->page;
|
vp->page = j->page;
|
||||||
vp->usedpages = j->pages;
|
vp->usedpages = j->pages;
|
||||||
dictGetEntryVal(de) = vp;
|
dictGetEntryVal(de) = vp;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user