mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 09:00:51 +00:00
a few non blocking VM bugs fixed
This commit is contained in:
parent
b9bc0eefc4
commit
f11b864714
20
redis.c
20
redis.c
@ -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);
|
||||||
|
@ -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},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user