Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
d3514edd
Commit
d3514edd
authored
Jul 04, 2014
by
antirez
Browse files
Fine tuning of aofReadDiffFromParent() calls trigger.
parent
180c9143
Changes
1
Show whitespace changes
Inline
Side-by-side
src/aof.c
View file @
d3514edd
...
@@ -940,14 +940,16 @@ int rewriteHashObject(rio *r, robj *key, robj *o) {
...
@@ -940,14 +940,16 @@ int rewriteHashObject(rio *r, robj *key, robj *o) {
/* This function is called by the child rewriting the AOF file to read
/* This function is called by the child rewriting the AOF file to read
* the difference accumulated from the parent into a buffer, that is
* the difference accumulated from the parent into a buffer, that is
* concatenated at the end of the rewrite. */
* concatenated at the end of the rewrite. */
void
aofReadDiffFromParent
(
void
)
{
ssize_t
aofReadDiffFromParent(void) {
char
buf
[
1024
*
16
];
char buf[
65536]; /* Default pipe buffer size on most Linux sytems. */
ssize_t
nread
;
ssize_t nread
, total = 0
;
while ((nread =
while ((nread =
read(server.aof_pipe_read_data_from_parent,buf,sizeof(buf))) > 0) {
read(server.aof_pipe_read_data_from_parent,buf,sizeof(buf))) > 0) {
server.aof_child_diff = sdscatlen(server.aof_child_diff,buf,nread);
server.aof_child_diff = sdscatlen(server.aof_child_diff,buf,nread);
total += nread;
}
}
return total;
}
}
/* Write a sequence of commands able to fully rebuild the dataset into
/* Write a sequence of commands able to fully rebuild the dataset into
...
@@ -1038,7 +1040,7 @@ int rewriteAppendOnlyFile(char *filename) {
...
@@ -1038,7 +1040,7 @@ int rewriteAppendOnlyFile(char *filename) {
if (rioWriteBulkLongLong(&aof,expiretime) == 0) goto werr;
if (rioWriteBulkLongLong(&aof,expiretime) == 0) goto werr;
}
}
/* Read some diff from the parent process from time to time. */
/* Read some diff from the parent process from time to time. */
if
(
aof
.
processed_bytes
>
processed
+
REDIS_AOF_AUTOSYNC_BYTES
)
{
if (aof.processed_bytes > processed+
1024*10
) {
processed = aof.processed_bytes;
processed = aof.processed_bytes;
aofReadDiffFromParent();
aofReadDiffFromParent();
}
}
...
@@ -1046,6 +1048,27 @@ int rewriteAppendOnlyFile(char *filename) {
...
@@ -1046,6 +1048,27 @@ int rewriteAppendOnlyFile(char *filename) {
dictReleaseIterator(di);
dictReleaseIterator(di);
}
}
/* Do an initial slow fsync here while the parent is still sending
* data, in order to make the next final fsync faster. */
if (fflush(fp) == EOF) goto werr;
if (fsync(fileno(fp)) == -1) goto werr;
/* Read again a few times to get more data from the parent.
* We can't read forever (the server may receive data from clients
* fater than it is able to send data to the child), so we try to read
* some more data in a loop and wait a bit if data is not available, but
* don't wait more than 100 ms total. */
int nodata = 0;
for (j = 0; j < 100; j++) {
ssize_t nread_from_parent = aofReadDiffFromParent();
printf("%lld\n", (long long) nread_from_parent);
if (nread_from_parent == 0) {
nodata++;
if (nodata == 10) break;
usleep(10000);
}
}
/* Ask the master to stop sending diffs. */
/* Ask the master to stop sending diffs. */
if (write(server.aof_pipe_write_ack_to_parent,"!",1) != 1) goto werr;
if (write(server.aof_pipe_write_ack_to_parent,"!",1) != 1) goto werr;
if (anetNonBlock(NULL,server.aof_pipe_read_ack_from_parent) != ANET_OK)
if (anetNonBlock(NULL,server.aof_pipe_read_ack_from_parent) != ANET_OK)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment