]> git.saurik.com Git - redis.git/commitdiff
fixed a deadlock caused by too much finished processes in queue so that I/O clients...
authorantirez <antirez@gmail.com>
Wed, 20 Jan 2010 21:57:00 +0000 (16:57 -0500)
committerantirez <antirez@gmail.com>
Wed, 20 Jan 2010 21:57:00 +0000 (16:57 -0500)
redis.c

diff --git a/redis.c b/redis.c
index 4aacc41bf45f3288d70d7197978e7640699ef7ed..a7b89b16fe883709c4f1147de3dc2f22118908e1 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -7768,6 +7768,8 @@ static void spawnIOThread(void) {
  * fork() in order to BGSAVE or BGREWRITEAOF. */
 static void waitEmptyIOJobsQueue(void) {
     while(1) {
+        int io_processed_len;
+
         lockThreadedIO();
         if (listLength(server.io_newjobs) == 0 &&
             listLength(server.io_processing) == 0 &&
@@ -7776,8 +7778,18 @@ static void waitEmptyIOJobsQueue(void) {
             unlockThreadedIO();
             return;
         }
+        /* 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
+         * it's blocking. */
+        io_processed_len = listLength(server.io_processed);
         unlockThreadedIO();
-        usleep(10000); /* 10 milliseconds */
+        if (io_processed_len) {
+            vmThreadedIOCompletedJob(NULL,server.io_ready_pipe_read,NULL,0);
+            usleep(1000); /* 1 millisecond */
+        } else {
+            usleep(10000); /* 10 milliseconds */
+        }
     }
 }