a few non blocking VM bugs fixed

This commit is contained in:
antirez 2010-01-11 12:45:15 -05:00
parent b9bc0eefc4
commit f11b864714
2 changed files with 24 additions and 0 deletions

20
redis.c
View File

@ -7384,6 +7384,11 @@ static void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata,
} }
/* Post process it in the main thread, as there are things we /* Post process it in the main thread, as there are things we
* can do just here to avoid race conditions and/or invasive locks */ * can do just here to avoid race conditions and/or invasive locks */
redisLog(REDIS_DEBUG,"Job type: %d, key at %p (%s) refcount: %d\n", j->type, (void*)j->key, (char*)j->key->ptr, j->key->refcount);
if (j->key->refcount <= 0) {
printf("Ooops ref count is <= 0!\n");
exit(1);
}
de = dictFind(j->db->dict,j->key); de = dictFind(j->db->dict,j->key);
assert(de != NULL); assert(de != NULL);
key = dictGetEntryKey(de); key = dictGetEntryKey(de);
@ -7420,6 +7425,7 @@ static void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata,
key->storage = REDIS_VM_SWAPPED; key->storage = REDIS_VM_SWAPPED;
key->vtype = j->val->type; key->vtype = j->val->type;
decrRefCount(val); /* Deallocate the object from memory. */ decrRefCount(val); /* Deallocate the object from memory. */
dictGetEntryVal(de) = NULL;
vmMarkPagesUsed(j->page,j->pages); vmMarkPagesUsed(j->page,j->pages);
redisLog(REDIS_DEBUG, redisLog(REDIS_DEBUG,
"VM: object %s swapped out at %lld (%lld pages) (threaded)", "VM: object %s swapped out at %lld (%lld pages) (threaded)",
@ -7428,6 +7434,19 @@ static void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata,
server.vm_stats_swapped_objects++; server.vm_stats_swapped_objects++;
server.vm_stats_swapouts++; server.vm_stats_swapouts++;
freeIOJob(j); freeIOJob(j);
/* Put a few more swap requests in queue if we are still
* out of memory */
if (zmalloc_used_memory() > server.vm_max_memory) {
int more = 1;
while(more) {
lockThreadedIO();
more = listLength(server.io_newjobs) <
(unsigned) server.vm_max_threads;
unlockThreadedIO();
/* Don't waste CPU time if swappable objects are rare. */
if (vmSwapOneObjectThreaded() == REDIS_ERR) break;
}
}
} }
} }
if (retval < 0 && errno != EAGAIN) { if (retval < 0 && errno != EAGAIN) {
@ -7572,6 +7591,7 @@ static int vmSwapObjectThreaded(robj *key, robj *val, redisDb *db) {
incrRefCount(val); incrRefCount(val);
j->canceled = 0; j->canceled = 0;
j->thread = (pthread_t) -1; j->thread = (pthread_t) -1;
key->storage = REDIS_VM_SWAPPING;
lockThreadedIO(); lockThreadedIO();
queueIOJob(j); queueIOJob(j);

View File

@ -1,4 +1,5 @@
static struct redisFunctionSym symsTable[] = { static struct redisFunctionSym symsTable[] = {
{"IOThreadEntryPoint",(unsigned long)IOThreadEntryPoint},
{"_redisAssert",(unsigned long)_redisAssert}, {"_redisAssert",(unsigned long)_redisAssert},
{"acceptHandler",(unsigned long)acceptHandler}, {"acceptHandler",(unsigned long)acceptHandler},
{"addReply",(unsigned long)addReply}, {"addReply",(unsigned long)addReply},
@ -60,6 +61,7 @@ static struct redisFunctionSym symsTable[] = {
{"freeClientMultiState",(unsigned long)freeClientMultiState}, {"freeClientMultiState",(unsigned long)freeClientMultiState},
{"freeFakeClient",(unsigned long)freeFakeClient}, {"freeFakeClient",(unsigned long)freeFakeClient},
{"freeHashObject",(unsigned long)freeHashObject}, {"freeHashObject",(unsigned long)freeHashObject},
{"freeIOJob",(unsigned long)freeIOJob},
{"freeListObject",(unsigned long)freeListObject}, {"freeListObject",(unsigned long)freeListObject},
{"freeMemoryIfNeeded",(unsigned long)freeMemoryIfNeeded}, {"freeMemoryIfNeeded",(unsigned long)freeMemoryIfNeeded},
{"freeOneObjectFromFreelist",(unsigned long)freeOneObjectFromFreelist}, {"freeOneObjectFromFreelist",(unsigned long)freeOneObjectFromFreelist},
@ -118,6 +120,7 @@ static struct redisFunctionSym symsTable[] = {
{"processInputBuffer",(unsigned long)processInputBuffer}, {"processInputBuffer",(unsigned long)processInputBuffer},
{"pushGenericCommand",(unsigned long)pushGenericCommand}, {"pushGenericCommand",(unsigned long)pushGenericCommand},
{"qsortCompareSetsByCardinality",(unsigned long)qsortCompareSetsByCardinality}, {"qsortCompareSetsByCardinality",(unsigned long)qsortCompareSetsByCardinality},
{"queueIOJob",(unsigned long)queueIOJob},
{"queueMultiCommand",(unsigned long)queueMultiCommand}, {"queueMultiCommand",(unsigned long)queueMultiCommand},
{"randomkeyCommand",(unsigned long)randomkeyCommand}, {"randomkeyCommand",(unsigned long)randomkeyCommand},
{"rdbLoad",(unsigned long)rdbLoad}, {"rdbLoad",(unsigned long)rdbLoad},
@ -184,6 +187,7 @@ static struct redisFunctionSym symsTable[] = {
{"smoveCommand",(unsigned long)smoveCommand}, {"smoveCommand",(unsigned long)smoveCommand},
{"sortCommand",(unsigned long)sortCommand}, {"sortCommand",(unsigned long)sortCommand},
{"sortCompare",(unsigned long)sortCompare}, {"sortCompare",(unsigned long)sortCompare},
{"spawnIOThread",(unsigned long)spawnIOThread},
{"spopCommand",(unsigned long)spopCommand}, {"spopCommand",(unsigned long)spopCommand},
{"srandmemberCommand",(unsigned long)srandmemberCommand}, {"srandmemberCommand",(unsigned long)srandmemberCommand},
{"sremCommand",(unsigned long)sremCommand}, {"sremCommand",(unsigned long)sremCommand},