mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
aof: enhance AOF_FSYNC_EVERYSEC, more details in #5985
This commit is contained in:
parent
843de8b786
commit
bcac165fab
34
src/aof.c
34
src/aof.c
@ -197,6 +197,12 @@ ssize_t aofRewriteBufferWrite(int fd) {
|
|||||||
* AOF file implementation
|
* AOF file implementation
|
||||||
* ------------------------------------------------------------------------- */
|
* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* Return true if an AOf fsync is currently already in progress in a
|
||||||
|
* BIO thread. */
|
||||||
|
int aofFsyncInProgress(void) {
|
||||||
|
return bioPendingJobsOfType(BIO_AOF_FSYNC) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Starts a background task that performs fsync() against the specified
|
/* Starts a background task that performs fsync() against the specified
|
||||||
* file descriptor (the one of the AOF file) in another thread. */
|
* file descriptor (the one of the AOF file) in another thread. */
|
||||||
void aof_background_fsync(int fd) {
|
void aof_background_fsync(int fd) {
|
||||||
@ -335,10 +341,24 @@ void flushAppendOnlyFile(int force) {
|
|||||||
int sync_in_progress = 0;
|
int sync_in_progress = 0;
|
||||||
mstime_t latency;
|
mstime_t latency;
|
||||||
|
|
||||||
if (sdslen(server.aof_buf) == 0) return;
|
if (sdslen(server.aof_buf) == 0) {
|
||||||
|
/* Check if we need to do fsync even the aof buffer is empty,
|
||||||
|
* because previously in AOF_FSYNC_EVERYSEC mode, fsync is
|
||||||
|
* called only when aof buffer is not empty, so if users
|
||||||
|
* stop write commands before fsync called in one second,
|
||||||
|
* the data in page cache cannot be flushed in time. */
|
||||||
|
if (server.aof_fsync == AOF_FSYNC_EVERYSEC &&
|
||||||
|
server.aof_fsync_offset != server.aof_current_size &&
|
||||||
|
server.unixtime > server.aof_last_fsync &&
|
||||||
|
!(sync_in_progress = aofFsyncInProgress())) {
|
||||||
|
goto try_fsync;
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
|
if (server.aof_fsync == AOF_FSYNC_EVERYSEC)
|
||||||
sync_in_progress = bioPendingJobsOfType(BIO_AOF_FSYNC) != 0;
|
sync_in_progress = aofFsyncInProgress();
|
||||||
|
|
||||||
if (server.aof_fsync == AOF_FSYNC_EVERYSEC && !force) {
|
if (server.aof_fsync == AOF_FSYNC_EVERYSEC && !force) {
|
||||||
/* With this append fsync policy we do background fsyncing.
|
/* With this append fsync policy we do background fsyncing.
|
||||||
@ -470,6 +490,7 @@ void flushAppendOnlyFile(int force) {
|
|||||||
server.aof_buf = sdsempty();
|
server.aof_buf = sdsempty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try_fsync:
|
||||||
/* 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 &&
|
||||||
@ -484,10 +505,14 @@ void flushAppendOnlyFile(int force) {
|
|||||||
redis_fsync(server.aof_fd); /* Let's try to get this data on the disk */
|
redis_fsync(server.aof_fd); /* Let's try to get this data on the disk */
|
||||||
latencyEndMonitor(latency);
|
latencyEndMonitor(latency);
|
||||||
latencyAddSampleIfNeeded("aof-fsync-always",latency);
|
latencyAddSampleIfNeeded("aof-fsync-always",latency);
|
||||||
|
server.aof_fsync_offset = server.aof_current_size;
|
||||||
server.aof_last_fsync = 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.aof_last_fsync)) {
|
server.unixtime > server.aof_last_fsync)) {
|
||||||
if (!sync_in_progress) aof_background_fsync(server.aof_fd);
|
if (!sync_in_progress) {
|
||||||
|
aof_background_fsync(server.aof_fd);
|
||||||
|
server.aof_fsync_offset = server.aof_current_size;
|
||||||
|
}
|
||||||
server.aof_last_fsync = server.unixtime;
|
server.aof_last_fsync = server.unixtime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -694,6 +719,7 @@ int loadAppendOnlyFile(char *filename) {
|
|||||||
* operation is received. */
|
* operation is received. */
|
||||||
if (fp && redis_fstat(fileno(fp),&sb) != -1 && sb.st_size == 0) {
|
if (fp && redis_fstat(fileno(fp),&sb) != -1 && sb.st_size == 0) {
|
||||||
server.aof_current_size = 0;
|
server.aof_current_size = 0;
|
||||||
|
server.aof_fsync_offset = server.aof_current_size;
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return C_ERR;
|
return C_ERR;
|
||||||
}
|
}
|
||||||
@ -832,6 +858,7 @@ loaded_ok: /* DB loaded, cleanup and return C_OK to the caller. */
|
|||||||
stopLoading();
|
stopLoading();
|
||||||
aofUpdateCurrentSize();
|
aofUpdateCurrentSize();
|
||||||
server.aof_rewrite_base_size = server.aof_current_size;
|
server.aof_rewrite_base_size = server.aof_current_size;
|
||||||
|
server.aof_fsync_offset = server.aof_current_size;
|
||||||
return C_OK;
|
return C_OK;
|
||||||
|
|
||||||
readerr: /* Read error. If feof(fp) is true, fall through to unexpected EOF. */
|
readerr: /* Read error. If feof(fp) is true, fall through to unexpected EOF. */
|
||||||
@ -1741,6 +1768,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
|
|||||||
server.aof_selected_db = -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;
|
||||||
|
server.aof_current_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. */
|
||||||
|
@ -1140,6 +1140,7 @@ struct redisServer {
|
|||||||
off_t aof_rewrite_min_size; /* the AOF file is at least N bytes. */
|
off_t aof_rewrite_min_size; /* the AOF file is at least N bytes. */
|
||||||
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. */
|
||||||
|
off_t aof_fsync_offset; /* AOF offset which is already synced to disk. */
|
||||||
int aof_rewrite_scheduled; /* Rewrite once BGSAVE terminates. */
|
int aof_rewrite_scheduled; /* Rewrite once BGSAVE terminates. */
|
||||||
pid_t aof_child_pid; /* PID if rewriting process */
|
pid_t aof_child_pid; /* PID if rewriting process */
|
||||||
list *aof_rewrite_buf_blocks; /* Hold changes during an AOF rewrite. */
|
list *aof_rewrite_buf_blocks; /* Hold changes during an AOF rewrite. */
|
||||||
|
Loading…
Reference in New Issue
Block a user