more AOF server struct fields renamed.
This commit is contained in:
parent
9868316d3f
commit
0bb9c8b70d
108
src/aof.c
108
src/aof.c
@ -21,38 +21,38 @@ void aof_background_fsync(int fd) {
|
|||||||
void stopAppendOnly(void) {
|
void stopAppendOnly(void) {
|
||||||
redisAssert(server.aof_state != REDIS_AOF_OFF);
|
redisAssert(server.aof_state != REDIS_AOF_OFF);
|
||||||
flushAppendOnlyFile(1);
|
flushAppendOnlyFile(1);
|
||||||
aof_fsync(server.appendfd);
|
aof_fsync(server.aof_fd);
|
||||||
close(server.appendfd);
|
close(server.aof_fd);
|
||||||
|
|
||||||
server.appendfd = -1;
|
server.aof_fd = -1;
|
||||||
server.appendseldb = -1;
|
server.aof_selected_db = -1;
|
||||||
server.aof_state = REDIS_AOF_OFF;
|
server.aof_state = REDIS_AOF_OFF;
|
||||||
/* rewrite operation in progress? kill it, wait child exit */
|
/* rewrite operation in progress? kill it, wait child exit */
|
||||||
if (server.bgrewritechildpid != -1) {
|
if (server.aof_child_pid != -1) {
|
||||||
int statloc;
|
int statloc;
|
||||||
|
|
||||||
if (kill(server.bgrewritechildpid,SIGKILL) != -1)
|
if (kill(server.aof_child_pid,SIGKILL) != -1)
|
||||||
wait3(&statloc,0,NULL);
|
wait3(&statloc,0,NULL);
|
||||||
/* reset the buffer accumulating changes while the child saves */
|
/* reset the buffer accumulating changes while the child saves */
|
||||||
sdsfree(server.bgrewritebuf);
|
sdsfree(server.aof_rewrite_buf);
|
||||||
server.bgrewritebuf = sdsempty();
|
server.aof_rewrite_buf = sdsempty();
|
||||||
aofRemoveTempFile(server.bgrewritechildpid);
|
aofRemoveTempFile(server.aof_child_pid);
|
||||||
server.bgrewritechildpid = -1;
|
server.aof_child_pid = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called when the user switches from "appendonly no" to "appendonly yes"
|
/* Called when the user switches from "appendonly no" to "appendonly yes"
|
||||||
* at runtime using the CONFIG command. */
|
* at runtime using the CONFIG command. */
|
||||||
int startAppendOnly(void) {
|
int startAppendOnly(void) {
|
||||||
server.lastfsync = time(NULL);
|
server.aof_last_fsync = time(NULL);
|
||||||
server.appendfd = open(server.aof_filename,O_WRONLY|O_APPEND|O_CREAT,0644);
|
server.aof_fd = open(server.aof_filename,O_WRONLY|O_APPEND|O_CREAT,0644);
|
||||||
redisAssert(server.aof_state == REDIS_AOF_OFF);
|
redisAssert(server.aof_state == REDIS_AOF_OFF);
|
||||||
if (server.appendfd == -1) {
|
if (server.aof_fd == -1) {
|
||||||
redisLog(REDIS_WARNING,"Redis needs to enable the AOF but can't open the append only file: %s",strerror(errno));
|
redisLog(REDIS_WARNING,"Redis needs to enable the AOF but can't open the append only file: %s",strerror(errno));
|
||||||
return REDIS_ERR;
|
return REDIS_ERR;
|
||||||
}
|
}
|
||||||
if (rewriteAppendOnlyFileBackground() == REDIS_ERR) {
|
if (rewriteAppendOnlyFileBackground() == REDIS_ERR) {
|
||||||
close(server.appendfd);
|
close(server.aof_fd);
|
||||||
redisLog(REDIS_WARNING,"Redis needs to enable the AOF but can't trigger a background AOF rewrite operation. Check the above logs for more info about the error.");
|
redisLog(REDIS_WARNING,"Redis needs to enable the AOF but can't trigger a background AOF rewrite operation. Check the above logs for more info about the error.");
|
||||||
return REDIS_ERR;
|
return REDIS_ERR;
|
||||||
}
|
}
|
||||||
@ -84,7 +84,7 @@ void flushAppendOnlyFile(int force) {
|
|||||||
ssize_t nwritten;
|
ssize_t nwritten;
|
||||||
int sync_in_progress = 0;
|
int sync_in_progress = 0;
|
||||||
|
|
||||||
if (sdslen(server.aofbuf) == 0) return;
|
if (sdslen(server.aof_buf) == 0) return;
|
||||||
|
|
||||||
if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
|
if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
|
||||||
sync_in_progress = bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC) != 0;
|
sync_in_progress = bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC) != 0;
|
||||||
@ -118,8 +118,8 @@ void flushAppendOnlyFile(int force) {
|
|||||||
* While this will save us against the server being killed I don't think
|
* While this will save us against the server being killed I don't think
|
||||||
* there is much to do about the whole server stopping for power problems
|
* there is much to do about the whole server stopping for power problems
|
||||||
* or alike */
|
* or alike */
|
||||||
nwritten = write(server.appendfd,server.aofbuf,sdslen(server.aofbuf));
|
nwritten = write(server.aof_fd,server.aof_buf,sdslen(server.aof_buf));
|
||||||
if (nwritten != (signed)sdslen(server.aofbuf)) {
|
if (nwritten != (signed)sdslen(server.aof_buf)) {
|
||||||
/* Ooops, we are in troubles. The best thing to do for now is
|
/* Ooops, we are in troubles. The best thing to do for now is
|
||||||
* aborting instead of giving the illusion that everything is
|
* aborting instead of giving the illusion that everything is
|
||||||
* working as expected. */
|
* working as expected. */
|
||||||
@ -134,29 +134,29 @@ void flushAppendOnlyFile(int force) {
|
|||||||
|
|
||||||
/* Re-use AOF buffer when it is small enough. The maximum comes from the
|
/* Re-use AOF buffer when it is small enough. The maximum comes from the
|
||||||
* arena size of 4k minus some overhead (but is otherwise arbitrary). */
|
* arena size of 4k minus some overhead (but is otherwise arbitrary). */
|
||||||
if ((sdslen(server.aofbuf)+sdsavail(server.aofbuf)) < 4000) {
|
if ((sdslen(server.aof_buf)+sdsavail(server.aof_buf)) < 4000) {
|
||||||
sdsclear(server.aofbuf);
|
sdsclear(server.aof_buf);
|
||||||
} else {
|
} else {
|
||||||
sdsfree(server.aofbuf);
|
sdsfree(server.aof_buf);
|
||||||
server.aofbuf = sdsempty();
|
server.aof_buf = sdsempty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't fsync if no-appendfsync-on-rewrite is set to yes and there are
|
/* Don't fsync if no-appendfsync-on-rewrite is set to yes and there are
|
||||||
* children doing I/O in the background. */
|
* children doing I/O in the background. */
|
||||||
if (server.aof_no_fsync_on_rewrite &&
|
if (server.aof_no_fsync_on_rewrite &&
|
||||||
(server.bgrewritechildpid != -1 || server.bgsavechildpid != -1))
|
(server.aof_child_pid != -1 || server.bgsavechildpid != -1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Perform the fsync if needed. */
|
/* Perform the fsync if needed. */
|
||||||
if (server.aof_fsync == AOF_FSYNC_ALWAYS) {
|
if (server.aof_fsync == AOF_FSYNC_ALWAYS) {
|
||||||
/* aof_fsync is defined as fdatasync() for Linux in order to avoid
|
/* aof_fsync is defined as fdatasync() for Linux in order to avoid
|
||||||
* flushing metadata. */
|
* flushing metadata. */
|
||||||
aof_fsync(server.appendfd); /* Let's try to get this data on the disk */
|
aof_fsync(server.aof_fd); /* Let's try to get this data on the disk */
|
||||||
server.lastfsync = server.unixtime;
|
server.aof_last_fsync = server.unixtime;
|
||||||
} else if ((server.aof_fsync == AOF_FSYNC_EVERYSEC &&
|
} else if ((server.aof_fsync == AOF_FSYNC_EVERYSEC &&
|
||||||
server.unixtime > server.lastfsync)) {
|
server.unixtime > server.aof_last_fsync)) {
|
||||||
if (!sync_in_progress) aof_background_fsync(server.appendfd);
|
if (!sync_in_progress) aof_background_fsync(server.aof_fd);
|
||||||
server.lastfsync = server.unixtime;
|
server.aof_last_fsync = server.unixtime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -228,13 +228,13 @@ void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **argv, int a
|
|||||||
|
|
||||||
/* The DB this command was targetting is not the same as the last command
|
/* The DB this command was targetting is not the same as the last command
|
||||||
* we appendend. To issue a SELECT command is needed. */
|
* we appendend. To issue a SELECT command is needed. */
|
||||||
if (dictid != server.appendseldb) {
|
if (dictid != server.aof_selected_db) {
|
||||||
char seldb[64];
|
char seldb[64];
|
||||||
|
|
||||||
snprintf(seldb,sizeof(seldb),"%d",dictid);
|
snprintf(seldb,sizeof(seldb),"%d",dictid);
|
||||||
buf = sdscatprintf(buf,"*2\r\n$6\r\nSELECT\r\n$%lu\r\n%s\r\n",
|
buf = sdscatprintf(buf,"*2\r\n$6\r\nSELECT\r\n$%lu\r\n%s\r\n",
|
||||||
(unsigned long)strlen(seldb),seldb);
|
(unsigned long)strlen(seldb),seldb);
|
||||||
server.appendseldb = dictid;
|
server.aof_selected_db = dictid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd->proc == expireCommand || cmd->proc == pexpireCommand ||
|
if (cmd->proc == expireCommand || cmd->proc == pexpireCommand ||
|
||||||
@ -260,14 +260,14 @@ void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **argv, int a
|
|||||||
* of re-entering the event loop, so before the client will get a
|
* of re-entering the event loop, so before the client will get a
|
||||||
* positive reply about the operation performed. */
|
* positive reply about the operation performed. */
|
||||||
if (server.aof_state == REDIS_AOF_ON)
|
if (server.aof_state == REDIS_AOF_ON)
|
||||||
server.aofbuf = sdscatlen(server.aofbuf,buf,sdslen(buf));
|
server.aof_buf = sdscatlen(server.aof_buf,buf,sdslen(buf));
|
||||||
|
|
||||||
/* If a background append only file rewriting is in progress we want to
|
/* If a background append only file rewriting is in progress we want to
|
||||||
* accumulate the differences between the child DB and the current one
|
* accumulate the differences between the child DB and the current one
|
||||||
* in a buffer, so that when the child process will do its work we
|
* in a buffer, so that when the child process will do its work we
|
||||||
* can append the differences to the new append only file. */
|
* can append the differences to the new append only file. */
|
||||||
if (server.bgrewritechildpid != -1)
|
if (server.aof_child_pid != -1)
|
||||||
server.bgrewritebuf = sdscatlen(server.bgrewritebuf,buf,sdslen(buf));
|
server.aof_rewrite_buf = sdscatlen(server.aof_rewrite_buf,buf,sdslen(buf));
|
||||||
|
|
||||||
sdsfree(buf);
|
sdsfree(buf);
|
||||||
}
|
}
|
||||||
@ -763,10 +763,10 @@ werr:
|
|||||||
* 1) The user calls BGREWRITEAOF
|
* 1) The user calls BGREWRITEAOF
|
||||||
* 2) Redis calls this function, that forks():
|
* 2) Redis calls this function, that forks():
|
||||||
* 2a) the child rewrite the append only file in a temp file.
|
* 2a) the child rewrite the append only file in a temp file.
|
||||||
* 2b) the parent accumulates differences in server.bgrewritebuf.
|
* 2b) the parent accumulates differences in server.aof_rewrite_buf.
|
||||||
* 3) When the child finished '2a' exists.
|
* 3) When the child finished '2a' exists.
|
||||||
* 4) The parent will trap the exit code, if it's OK, will append the
|
* 4) The parent will trap the exit code, if it's OK, will append the
|
||||||
* data accumulated into server.bgrewritebuf into the temp file, and
|
* data accumulated into server.aof_rewrite_buf into the temp file, and
|
||||||
* finally will rename(2) the temp file in the actual file name.
|
* finally will rename(2) the temp file in the actual file name.
|
||||||
* The the new file is reopened as the new append only file. Profit!
|
* The the new file is reopened as the new append only file. Profit!
|
||||||
*/
|
*/
|
||||||
@ -774,7 +774,7 @@ int rewriteAppendOnlyFileBackground(void) {
|
|||||||
pid_t childpid;
|
pid_t childpid;
|
||||||
long long start;
|
long long start;
|
||||||
|
|
||||||
if (server.bgrewritechildpid != -1) return REDIS_ERR;
|
if (server.aof_child_pid != -1) return REDIS_ERR;
|
||||||
start = ustime();
|
start = ustime();
|
||||||
if ((childpid = fork()) == 0) {
|
if ((childpid = fork()) == 0) {
|
||||||
char tmpfile[256];
|
char tmpfile[256];
|
||||||
@ -800,20 +800,20 @@ int rewriteAppendOnlyFileBackground(void) {
|
|||||||
redisLog(REDIS_NOTICE,
|
redisLog(REDIS_NOTICE,
|
||||||
"Background append only file rewriting started by pid %d",childpid);
|
"Background append only file rewriting started by pid %d",childpid);
|
||||||
server.aof_rewrite_scheduled = 0;
|
server.aof_rewrite_scheduled = 0;
|
||||||
server.bgrewritechildpid = childpid;
|
server.aof_child_pid = childpid;
|
||||||
updateDictResizePolicy();
|
updateDictResizePolicy();
|
||||||
/* We set appendseldb to -1 in order to force the next call to the
|
/* We set appendseldb to -1 in order to force the next call to the
|
||||||
* feedAppendOnlyFile() to issue a SELECT command, so the differences
|
* feedAppendOnlyFile() to issue a SELECT command, so the differences
|
||||||
* accumulated by the parent into server.bgrewritebuf will start
|
* accumulated by the parent into server.aof_rewrite_buf will start
|
||||||
* with a SELECT statement and it will be safe to merge. */
|
* with a SELECT statement and it will be safe to merge. */
|
||||||
server.appendseldb = -1;
|
server.aof_selected_db = -1;
|
||||||
return REDIS_OK;
|
return REDIS_OK;
|
||||||
}
|
}
|
||||||
return REDIS_OK; /* unreached */
|
return REDIS_OK; /* unreached */
|
||||||
}
|
}
|
||||||
|
|
||||||
void bgrewriteaofCommand(redisClient *c) {
|
void bgrewriteaofCommand(redisClient *c) {
|
||||||
if (server.bgrewritechildpid != -1) {
|
if (server.aof_child_pid != -1) {
|
||||||
addReplyError(c,"Background append only file rewriting already in progress");
|
addReplyError(c,"Background append only file rewriting already in progress");
|
||||||
} else if (server.bgsavechildpid != -1) {
|
} else if (server.bgsavechildpid != -1) {
|
||||||
server.aof_rewrite_scheduled = 1;
|
server.aof_rewrite_scheduled = 1;
|
||||||
@ -839,7 +839,7 @@ void aofRemoveTempFile(pid_t childpid) {
|
|||||||
void aofUpdateCurrentSize(void) {
|
void aofUpdateCurrentSize(void) {
|
||||||
struct redis_stat sb;
|
struct redis_stat sb;
|
||||||
|
|
||||||
if (redis_fstat(server.appendfd,&sb) == -1) {
|
if (redis_fstat(server.aof_fd,&sb) == -1) {
|
||||||
redisLog(REDIS_WARNING,"Unable to check the AOF length: %s",
|
redisLog(REDIS_WARNING,"Unable to check the AOF length: %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
} else {
|
} else {
|
||||||
@ -862,7 +862,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
|
|||||||
/* Flush the differences accumulated by the parent to the
|
/* Flush the differences accumulated by the parent to the
|
||||||
* rewritten AOF. */
|
* rewritten AOF. */
|
||||||
snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof",
|
snprintf(tmpfile,256,"temp-rewriteaof-bg-%d.aof",
|
||||||
(int)server.bgrewritechildpid);
|
(int)server.aof_child_pid);
|
||||||
newfd = open(tmpfile,O_WRONLY|O_APPEND);
|
newfd = open(tmpfile,O_WRONLY|O_APPEND);
|
||||||
if (newfd == -1) {
|
if (newfd == -1) {
|
||||||
redisLog(REDIS_WARNING,
|
redisLog(REDIS_WARNING,
|
||||||
@ -870,8 +870,8 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
nwritten = write(newfd,server.bgrewritebuf,sdslen(server.bgrewritebuf));
|
nwritten = write(newfd,server.aof_rewrite_buf,sdslen(server.aof_rewrite_buf));
|
||||||
if (nwritten != (signed)sdslen(server.bgrewritebuf)) {
|
if (nwritten != (signed)sdslen(server.aof_rewrite_buf)) {
|
||||||
if (nwritten == -1) {
|
if (nwritten == -1) {
|
||||||
redisLog(REDIS_WARNING,
|
redisLog(REDIS_WARNING,
|
||||||
"Error trying to flush the parent diff to the rewritten AOF: %s", strerror(errno));
|
"Error trying to flush the parent diff to the rewritten AOF: %s", strerror(errno));
|
||||||
@ -913,7 +913,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
|
|||||||
* guarantee atomicity for this switch has already happened by then, so
|
* guarantee atomicity for this switch has already happened by then, so
|
||||||
* we don't care what the outcome or duration of that close operation
|
* we don't care what the outcome or duration of that close operation
|
||||||
* is, as long as the file descriptor is released again. */
|
* is, as long as the file descriptor is released again. */
|
||||||
if (server.appendfd == -1) {
|
if (server.aof_fd == -1) {
|
||||||
/* AOF disabled */
|
/* AOF disabled */
|
||||||
|
|
||||||
/* Don't care if this fails: oldfd will be -1 and we handle that.
|
/* Don't care if this fails: oldfd will be -1 and we handle that.
|
||||||
@ -935,26 +935,26 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (server.appendfd == -1) {
|
if (server.aof_fd == -1) {
|
||||||
/* AOF disabled, we don't need to set the AOF file descriptor
|
/* AOF disabled, we don't need to set the AOF file descriptor
|
||||||
* to this new file, so we can close it. */
|
* to this new file, so we can close it. */
|
||||||
close(newfd);
|
close(newfd);
|
||||||
} else {
|
} else {
|
||||||
/* AOF enabled, replace the old fd with the new one. */
|
/* AOF enabled, replace the old fd with the new one. */
|
||||||
oldfd = server.appendfd;
|
oldfd = server.aof_fd;
|
||||||
server.appendfd = newfd;
|
server.aof_fd = newfd;
|
||||||
if (server.aof_fsync == AOF_FSYNC_ALWAYS)
|
if (server.aof_fsync == AOF_FSYNC_ALWAYS)
|
||||||
aof_fsync(newfd);
|
aof_fsync(newfd);
|
||||||
else if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
|
else if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
|
||||||
aof_background_fsync(newfd);
|
aof_background_fsync(newfd);
|
||||||
server.appendseldb = -1; /* Make sure SELECT is re-issued */
|
server.aof_selected_db = -1; /* Make sure SELECT is re-issued */
|
||||||
aofUpdateCurrentSize();
|
aofUpdateCurrentSize();
|
||||||
server.aof_rewrite_base_size = server.aof_current_size;
|
server.aof_rewrite_base_size = server.aof_current_size;
|
||||||
|
|
||||||
/* Clear regular AOF buffer since its contents was just written to
|
/* Clear regular AOF buffer since its contents was just written to
|
||||||
* the new AOF from the background rewrite buffer. */
|
* the new AOF from the background rewrite buffer. */
|
||||||
sdsfree(server.aofbuf);
|
sdsfree(server.aof_buf);
|
||||||
server.aofbuf = sdsempty();
|
server.aof_buf = sdsempty();
|
||||||
}
|
}
|
||||||
|
|
||||||
redisLog(REDIS_NOTICE, "Background AOF rewrite successful");
|
redisLog(REDIS_NOTICE, "Background AOF rewrite successful");
|
||||||
@ -976,10 +976,10 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
sdsfree(server.bgrewritebuf);
|
sdsfree(server.aof_rewrite_buf);
|
||||||
server.bgrewritebuf = sdsempty();
|
server.aof_rewrite_buf = sdsempty();
|
||||||
aofRemoveTempFile(server.bgrewritechildpid);
|
aofRemoveTempFile(server.aof_child_pid);
|
||||||
server.bgrewritechildpid = -1;
|
server.aof_child_pid = -1;
|
||||||
/* Schedule a new rewrite if we are waiting for it to switch the AOF ON. */
|
/* Schedule a new rewrite if we are waiting for it to switch the AOF ON. */
|
||||||
if (server.aof_state == REDIS_AOF_WAIT_REWRITE)
|
if (server.aof_state == REDIS_AOF_WAIT_REWRITE)
|
||||||
server.aof_rewrite_scheduled = 1;
|
server.aof_rewrite_scheduled = 1;
|
||||||
|
2
src/db.c
2
src/db.c
@ -40,7 +40,7 @@ robj *lookupKey(redisDb *db, robj *key) {
|
|||||||
/* Update the access time for the aging algorithm.
|
/* Update the access time for the aging algorithm.
|
||||||
* Don't do it if we have a saving child, as this will trigger
|
* Don't do it if we have a saving child, as this will trigger
|
||||||
* a copy on write madness. */
|
* a copy on write madness. */
|
||||||
if (server.bgsavechildpid == -1 && server.bgrewritechildpid == -1)
|
if (server.bgsavechildpid == -1 && server.aof_child_pid == -1)
|
||||||
val->lru = server.lruclock;
|
val->lru = server.lruclock;
|
||||||
server.stat_keyspace_hits++;
|
server.stat_keyspace_hits++;
|
||||||
return val;
|
return val;
|
||||||
|
@ -1085,7 +1085,7 @@ void saveCommand(redisClient *c) {
|
|||||||
void bgsaveCommand(redisClient *c) {
|
void bgsaveCommand(redisClient *c) {
|
||||||
if (server.bgsavechildpid != -1) {
|
if (server.bgsavechildpid != -1) {
|
||||||
addReplyError(c,"Background save already in progress");
|
addReplyError(c,"Background save already in progress");
|
||||||
} else if (server.bgrewritechildpid != -1) {
|
} else if (server.aof_child_pid != -1) {
|
||||||
addReplyError(c,"Can't BGSAVE while AOF log rewriting is in progress");
|
addReplyError(c,"Can't BGSAVE while AOF log rewriting is in progress");
|
||||||
} else if (rdbSaveBackground(server.dbfilename) == REDIS_OK) {
|
} else if (rdbSaveBackground(server.dbfilename) == REDIS_OK) {
|
||||||
addReplyStatus(c,"Background saving started");
|
addReplyStatus(c,"Background saving started");
|
||||||
|
36
src/redis.c
36
src/redis.c
@ -563,7 +563,7 @@ void incrementallyRehash(void) {
|
|||||||
* for dict.c to resize the hash tables accordingly to the fact we have o not
|
* for dict.c to resize the hash tables accordingly to the fact we have o not
|
||||||
* running childs. */
|
* running childs. */
|
||||||
void updateDictResizePolicy(void) {
|
void updateDictResizePolicy(void) {
|
||||||
if (server.bgsavechildpid == -1 && server.bgrewritechildpid == -1)
|
if (server.bgsavechildpid == -1 && server.aof_child_pid == -1)
|
||||||
dictEnableResize();
|
dictEnableResize();
|
||||||
else
|
else
|
||||||
dictDisableResize();
|
dictDisableResize();
|
||||||
@ -673,7 +673,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
|
|||||||
* if we resize the HT while there is the saving child at work actually
|
* if we resize the HT while there is the saving child at work actually
|
||||||
* a lot of memory movements in the parent will cause a lot of pages
|
* a lot of memory movements in the parent will cause a lot of pages
|
||||||
* copied. */
|
* copied. */
|
||||||
if (server.bgsavechildpid == -1 && server.bgrewritechildpid == -1) {
|
if (server.bgsavechildpid == -1 && server.aof_child_pid == -1) {
|
||||||
if (!(loops % 10)) tryResizeHashTables();
|
if (!(loops % 10)) tryResizeHashTables();
|
||||||
if (server.activerehashing) incrementallyRehash();
|
if (server.activerehashing) incrementallyRehash();
|
||||||
}
|
}
|
||||||
@ -692,14 +692,14 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
|
|||||||
|
|
||||||
/* Start a scheduled AOF rewrite if this was requested by the user while
|
/* Start a scheduled AOF rewrite if this was requested by the user while
|
||||||
* a BGSAVE was in progress. */
|
* a BGSAVE was in progress. */
|
||||||
if (server.bgsavechildpid == -1 && server.bgrewritechildpid == -1 &&
|
if (server.bgsavechildpid == -1 && server.aof_child_pid == -1 &&
|
||||||
server.aof_rewrite_scheduled)
|
server.aof_rewrite_scheduled)
|
||||||
{
|
{
|
||||||
rewriteAppendOnlyFileBackground();
|
rewriteAppendOnlyFileBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if a background saving or AOF rewrite in progress terminated. */
|
/* Check if a background saving or AOF rewrite in progress terminated. */
|
||||||
if (server.bgsavechildpid != -1 || server.bgrewritechildpid != -1) {
|
if (server.bgsavechildpid != -1 || server.aof_child_pid != -1) {
|
||||||
int statloc;
|
int statloc;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
@ -735,7 +735,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
|
|||||||
|
|
||||||
/* Trigger an AOF rewrite if needed */
|
/* Trigger an AOF rewrite if needed */
|
||||||
if (server.bgsavechildpid == -1 &&
|
if (server.bgsavechildpid == -1 &&
|
||||||
server.bgrewritechildpid == -1 &&
|
server.aof_child_pid == -1 &&
|
||||||
server.aof_rewrite_perc &&
|
server.aof_rewrite_perc &&
|
||||||
server.aof_current_size > server.aof_rewrite_min_size)
|
server.aof_current_size > server.aof_rewrite_min_size)
|
||||||
{
|
{
|
||||||
@ -880,9 +880,9 @@ void initServerConfig() {
|
|||||||
server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE;
|
server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE;
|
||||||
server.aof_rewrite_base_size = 0;
|
server.aof_rewrite_base_size = 0;
|
||||||
server.aof_rewrite_scheduled = 0;
|
server.aof_rewrite_scheduled = 0;
|
||||||
server.lastfsync = time(NULL);
|
server.aof_last_fsync = time(NULL);
|
||||||
server.appendfd = -1;
|
server.aof_fd = -1;
|
||||||
server.appendseldb = -1; /* Make sure the first time will not match */
|
server.aof_selected_db = -1; /* Make sure the first time will not match */
|
||||||
server.aof_flush_postponed_start = 0;
|
server.aof_flush_postponed_start = 0;
|
||||||
server.pidfile = zstrdup("/var/run/redis.pid");
|
server.pidfile = zstrdup("/var/run/redis.pid");
|
||||||
server.dbfilename = zstrdup("dump.rdb");
|
server.dbfilename = zstrdup("dump.rdb");
|
||||||
@ -1045,9 +1045,9 @@ void initServer() {
|
|||||||
listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);
|
listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);
|
||||||
server.cronloops = 0;
|
server.cronloops = 0;
|
||||||
server.bgsavechildpid = -1;
|
server.bgsavechildpid = -1;
|
||||||
server.bgrewritechildpid = -1;
|
server.aof_child_pid = -1;
|
||||||
server.bgrewritebuf = sdsempty();
|
server.aof_rewrite_buf = sdsempty();
|
||||||
server.aofbuf = sdsempty();
|
server.aof_buf = sdsempty();
|
||||||
server.lastsave = time(NULL);
|
server.lastsave = time(NULL);
|
||||||
server.dirty = 0;
|
server.dirty = 0;
|
||||||
server.stat_numcommands = 0;
|
server.stat_numcommands = 0;
|
||||||
@ -1068,9 +1068,9 @@ void initServer() {
|
|||||||
acceptUnixHandler,NULL) == AE_ERR) oom("creating file event");
|
acceptUnixHandler,NULL) == AE_ERR) oom("creating file event");
|
||||||
|
|
||||||
if (server.aof_state == REDIS_AOF_ON) {
|
if (server.aof_state == REDIS_AOF_ON) {
|
||||||
server.appendfd = open(server.aof_filename,
|
server.aof_fd = open(server.aof_filename,
|
||||||
O_WRONLY|O_APPEND|O_CREAT,0644);
|
O_WRONLY|O_APPEND|O_CREAT,0644);
|
||||||
if (server.appendfd == -1) {
|
if (server.aof_fd == -1) {
|
||||||
redisLog(REDIS_WARNING, "Can't open the append-only file: %s",
|
redisLog(REDIS_WARNING, "Can't open the append-only file: %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
@ -1313,14 +1313,14 @@ int prepareForShutdown(int flags) {
|
|||||||
if (server.aof_state != REDIS_AOF_OFF) {
|
if (server.aof_state != REDIS_AOF_OFF) {
|
||||||
/* Kill the AOF saving child as the AOF we already have may be longer
|
/* Kill the AOF saving child as the AOF we already have may be longer
|
||||||
* but contains the full dataset anyway. */
|
* but contains the full dataset anyway. */
|
||||||
if (server.bgrewritechildpid != -1) {
|
if (server.aof_child_pid != -1) {
|
||||||
redisLog(REDIS_WARNING,
|
redisLog(REDIS_WARNING,
|
||||||
"There is a child rewriting the AOF. Killing it!");
|
"There is a child rewriting the AOF. Killing it!");
|
||||||
kill(server.bgrewritechildpid,SIGKILL);
|
kill(server.aof_child_pid,SIGKILL);
|
||||||
}
|
}
|
||||||
/* Append only file: fsync() the AOF and exit */
|
/* Append only file: fsync() the AOF and exit */
|
||||||
redisLog(REDIS_NOTICE,"Calling fsync() on the AOF file.");
|
redisLog(REDIS_NOTICE,"Calling fsync() on the AOF file.");
|
||||||
aof_fsync(server.appendfd);
|
aof_fsync(server.aof_fd);
|
||||||
}
|
}
|
||||||
if ((server.saveparamslen > 0 && !nosave) || save) {
|
if ((server.saveparamslen > 0 && !nosave) || save) {
|
||||||
redisLog(REDIS_NOTICE,"Saving the final RDB snapshot before exiting.");
|
redisLog(REDIS_NOTICE,"Saving the final RDB snapshot before exiting.");
|
||||||
@ -1501,7 +1501,7 @@ sds genRedisInfoString(char *section) {
|
|||||||
server.dirty,
|
server.dirty,
|
||||||
server.bgsavechildpid != -1,
|
server.bgsavechildpid != -1,
|
||||||
server.lastsave,
|
server.lastsave,
|
||||||
server.bgrewritechildpid != -1);
|
server.aof_child_pid != -1);
|
||||||
|
|
||||||
if (server.aof_state != REDIS_AOF_OFF) {
|
if (server.aof_state != REDIS_AOF_OFF) {
|
||||||
info = sdscatprintf(info,
|
info = sdscatprintf(info,
|
||||||
@ -1513,7 +1513,7 @@ sds genRedisInfoString(char *section) {
|
|||||||
(long long) server.aof_current_size,
|
(long long) server.aof_current_size,
|
||||||
(long long) server.aof_rewrite_base_size,
|
(long long) server.aof_rewrite_base_size,
|
||||||
server.aof_rewrite_scheduled,
|
server.aof_rewrite_scheduled,
|
||||||
sdslen(server.aofbuf),
|
sdslen(server.aof_buf),
|
||||||
bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC));
|
bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
src/redis.h
12
src/redis.h
@ -560,13 +560,13 @@ struct redisServer {
|
|||||||
off_t aof_rewrite_base_size; /* AOF size on latest startup or rewrite. */
|
off_t aof_rewrite_base_size; /* AOF size on latest startup or rewrite. */
|
||||||
off_t aof_current_size; /* AOF current size. */
|
off_t aof_current_size; /* AOF current size. */
|
||||||
int aof_rewrite_scheduled; /* Rewrite once BGSAVE terminates. */
|
int aof_rewrite_scheduled; /* Rewrite once BGSAVE terminates. */
|
||||||
pid_t bgrewritechildpid; /* PID if rewriting process */
|
pid_t aof_child_pid; /* PID if rewriting process */
|
||||||
sds bgrewritebuf; /* buffer taken by parent during oppend only rewrite */
|
sds aof_rewrite_buf; /* buffer taken by parent during oppend only rewrite */
|
||||||
sds aofbuf; /* AOF buffer, written before entering the event loop */
|
sds aof_buf; /* AOF buffer, written before entering the event loop */
|
||||||
int appendfd; /* File descriptor of currently selected AOF file */
|
int aof_fd; /* File descriptor of currently selected AOF file */
|
||||||
int appendseldb; /* Currently selected DB in AOF */
|
int aof_selected_db; /* Currently selected DB in AOF */
|
||||||
time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */
|
time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */
|
||||||
time_t lastfsync; /* UNIX time of last fsync() */
|
time_t aof_last_fsync; /* UNIX time of last fsync() */
|
||||||
/* RDB persistence */
|
/* RDB persistence */
|
||||||
long long dirty; /* Changes to DB from the last save */
|
long long dirty; /* Changes to DB from the last save */
|
||||||
long long dirty_before_bgsave; /* Used to restore dirty on failed BGSAVE */
|
long long dirty_before_bgsave; /* Used to restore dirty on failed BGSAVE */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user