]> git.saurik.com Git - redis.git/blobdiff - src/bio.c
Fixed RESTORE hash failure (Issue #532)
[redis.git] / src / bio.c
index 9199bf23ac57be02ec684dd4b3d4b7d372d1fb29..aa2cdf9fbb5a0d9289eefa825c2aa62048b66f64 100644 (file)
--- a/src/bio.c
+++ b/src/bio.c
@@ -108,9 +108,18 @@ void bioCreateBackgroundJob(int type, void *arg1, void *arg2, void *arg3) {
 void *bioProcessBackgroundJobs(void *arg) {
     struct bio_job *job;
     unsigned long type = (unsigned long) arg;
 void *bioProcessBackgroundJobs(void *arg) {
     struct bio_job *job;
     unsigned long type = (unsigned long) arg;
+    sigset_t sigset;
 
     pthread_detach(pthread_self());
     pthread_mutex_lock(&bio_mutex[type]);
 
     pthread_detach(pthread_self());
     pthread_mutex_lock(&bio_mutex[type]);
+    /* Block SIGALRM so we are sure that only the main thread will
+     * receive the watchdog signal. */
+    sigemptyset(&sigset);
+    sigaddset(&sigset, SIGALRM);
+    if (pthread_sigmask(SIG_BLOCK, &sigset, NULL))
+        redisLog(REDIS_WARNING,
+            "Warning: can't mask SIGALRM in bio.c thread: %s", strerror(errno));
+
     while(1) {
         listNode *ln;
 
     while(1) {
         listNode *ln;
 
@@ -130,7 +139,7 @@ void *bioProcessBackgroundJobs(void *arg) {
         if (type == REDIS_BIO_CLOSE_FILE) {
             close((long)job->arg1);
         } else if (type == REDIS_BIO_AOF_FSYNC) {
         if (type == REDIS_BIO_CLOSE_FILE) {
             close((long)job->arg1);
         } else if (type == REDIS_BIO_AOF_FSYNC) {
-            fsync((long)job->arg1);
+            aof_fsync((long)job->arg1);
         } else {
             redisPanic("Wrong job type in bioProcessBackgroundJobs().");
         }
         } else {
             redisPanic("Wrong job type in bioProcessBackgroundJobs().");
         }
@@ -153,6 +162,11 @@ unsigned long long bioPendingJobsOfType(int type) {
     return val;
 }
 
     return val;
 }
 
+#if 0 /* We don't use the following code for now, and bioWaitPendingJobsLE
+         probably needs a rewrite using conditional variables instead of the
+         current implementation. */
+         
+
 /* Wait until the number of pending jobs of the specified type are
  * less or equal to the specified number.
  *
 /* Wait until the number of pending jobs of the specified type are
  * less or equal to the specified number.
  *
@@ -200,3 +214,4 @@ time_t bioOlderJobOfType(int type) {
     return time;
 }
 
     return time;
 }
 
+#endif