From 986630afad7310f4ad548b355be3df076a50032c Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 13 Sep 2011 18:27:08 +0200 Subject: [PATCH] use bio.c instead of libeio for closing the AOF file in background. Some comment added and other minor changes. --- src/aof.c | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/aof.c b/src/aof.c index 1a6abb98..7b15acb8 100644 --- a/src/aof.c +++ b/src/aof.c @@ -1,4 +1,5 @@ #include "redis.h" +#include "bio.h" #include #include @@ -677,8 +678,10 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) { redisLog(REDIS_NOTICE, "Background AOF rewrite terminated with success"); - /* Flush the differences accumulated by the parent to the rewritten AOF. */ - snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", (int)server.bgrewritechildpid); + /* Flush the differences accumulated by the parent to the + * rewritten AOF. */ + snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof", + (int)server.bgrewritechildpid); newfd = open(tmpfile,O_WRONLY|O_APPEND); if (newfd == -1) { redisLog(REDIS_WARNING, @@ -704,7 +707,10 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) { /* The only remaining thing to do is to rename the temporary file to * the configured file and switch the file descriptor used to do AOF - * writes. There are two possible scenarios: + * writes. We don't want close(2) or rename(2) calls to block the + * server on old file deletion. + * + * There are two possible scenarios: * * 1) AOF is DISABLED and this was a one time rewrite. The temporary * file will be renamed to the configured file. When this file already @@ -719,7 +725,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) { * * To mitigate the blocking effect of the unlink operation (either * caused by rename(2) in scenario 1, or by close(2) in scenario 2), we - * use a background thread in libeio to take care of this. First, we + * use a background thread to take care of this. First, we * make scenario 1 identical to scenario 2 by opening the target file * when it exists. The unlink operation after the rename(2) will then * be executed upon calling close(2) for its descriptor. Everything to @@ -728,19 +734,14 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) { * is, as long as the file descriptor is released again. */ if (server.appendfd == -1) { /* AOF disabled */ - struct stat st; - /* Check if the configured filename exists. If so, we need to open - * it to prevent rename(2) from unlinking it. */ - if (stat(server.appendfilename, &st) == ENOENT) { - oldfd = -1; - } else { - /* Don't care if this fails: oldfd will be -1. */ - oldfd = open(server.appendfilename,O_RDONLY|O_NONBLOCK); - } + /* Don't care if this fails: oldfd will be -1 and we handle that. + * One notable case of -1 return is if the old file does + * not exist. */ + oldfd = open(server.appendfilename,O_RDONLY|O_NONBLOCK); } else { /* AOF enabled */ - oldfd = -1; + oldfd = -1; /* We'll set this to the current AOF filedes later. */ } /* Rename the temporary file. This will not unlink the target file if @@ -749,16 +750,16 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) { redisLog(REDIS_WARNING, "Error trying to rename the temporary AOF: %s", strerror(errno)); close(newfd); - if (oldfd != -1) - close(oldfd); + if (oldfd != -1) close(oldfd); goto cleanup; } if (server.appendfd == -1) { - /* AOF disabled */ + /* AOF disabled, we don't need to set the AOF file descriptor + * to this new file, so we can close it. */ close(newfd); } else { - /* AOF enabled */ + /* AOF enabled, replace the old fd with the new one. */ oldfd = server.appendfd; server.appendfd = newfd; if (server.appendfsync != APPENDFSYNC_NO) aof_fsync(newfd); @@ -770,7 +771,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) { redisLog(REDIS_NOTICE, "Background AOF rewrite successful"); /* Asynchronously close the overwritten AOF. */ - if (oldfd != -1) eio_close(oldfd, 0, NULL, 0); + if (oldfd != -1) bioCreateBackgroundJob(REDIS_BIO_CLOSE_FILE,(void*)(long)oldfd); redisLog(REDIS_VERBOSE, "Background AOF rewrite signal handler took %lldus", ustime()-now); -- 2.47.2