From a440ecf0d36d22305f994a4482e60099720c47f3 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 31 Dec 2010 14:30:24 +0100 Subject: [PATCH] major bug and a dead lock fixed --- src/db.c | 5 ++++- src/dscache.c | 21 +++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/db.c b/src/db.c index 7ae23fa0..48663e9c 100644 --- a/src/db.c +++ b/src/db.c @@ -97,11 +97,14 @@ int dbAdd(redisDb *db, robj *key, robj *val) { * * On update (key already existed) 0 is returned. Otherwise 1. */ int dbReplace(redisDb *db, robj *key, robj *val) { - if (dictFind(db->dict,key->ptr) == NULL) { + robj *oldval; + + if ((oldval = dictFetchValue(db->dict,key->ptr)) == NULL) { sds copy = sdsdup(key->ptr); dictAdd(db->dict, copy, val); return 1; } else { + val->storage = oldval->storage; dictReplace(db->dict, key->ptr, val); return 0; } diff --git a/src/dscache.c b/src/dscache.c index a0c252d5..cd2ef850 100644 --- a/src/dscache.c +++ b/src/dscache.c @@ -356,12 +356,10 @@ void *IOThreadEntryPoint(void *arg) { pthread_detach(pthread_self()); lockThreadedIO(); while(1) { - /* Wait for more work to do */ - pthread_cond_wait(&server.io_condvar,&server.io_mutex); /* Get a new job to process */ if (listLength(server.io_newjobs) == 0) { - /* No new jobs in queue, reiterate. */ - unlockThreadedIO(); + /* Wait for more work to do */ + pthread_cond_wait(&server.io_condvar,&server.io_mutex); continue; } ln = listFirst(server.io_newjobs); @@ -439,6 +437,16 @@ void waitEmptyIOJobsQueue(void) { unlockThreadedIO(); return; } + /* If there are new jobs we need to signal the thread to + * process the next one. */ + redisLog(REDIS_DEBUG,"waitEmptyIOJobsQueue: new %d, processing %d", + listLength(server.io_newjobs), + listLength(server.io_processing)); + /* + if (listLength(server.io_newjobs)) { + pthread_cond_signal(&server.io_condvar); + } + */ /* While waiting for empty jobs queue condition we post-process some * finshed job, as I/O threads may be hanging trying to write against * the io_ready_pipe_write FD but there are so much pending jobs that @@ -509,7 +517,8 @@ void cacheScheduleForFlush(redisDb *db, robj *key) { val->storage = REDIS_DS_DIRTY; } - redisLog(REDIS_DEBUG,"Scheduling key %s for saving",key->ptr); + redisLog(REDIS_DEBUG,"Scheduling key %s for saving (%s)",key->ptr, + de ? "key exists" : "key does not exist"); dk = zmalloc(sizeof(*dk)); dk->db = db; dk->key = key; @@ -533,7 +542,7 @@ void cacheCron(void) { redisLog(REDIS_DEBUG,"Creating IO Job to save key %s",dk->key->ptr); /* Lookup the key, in order to put the current value in the IO - * Job and mark ti as DS_SAVING. + * Job and mark it as DS_SAVING. * Otherwise if the key does not exists we schedule a disk store * delete operation, setting the value to NULL. */ de = dictFind(dk->db->dict,dk->key->ptr); -- 2.45.2