]> git.saurik.com Git - redis.git/commit - src/redis.c
Allow an AOF rewrite buffer > 2GB (Fix for issue #504).
authorantirez <antirez@gmail.com>
Tue, 22 May 2012 11:03:41 +0000 (13:03 +0200)
committerantirez <antirez@gmail.com>
Thu, 24 May 2012 13:19:15 +0000 (15:19 +0200)
commit47ca4b6e28af49d1904f40fceacf58bb2907fbf2
tree544e8a55ee56f761575a09ee6c2930866de6d30d
parentef37997608dfa5ad457961e0f3e427315ba4be83
Allow an AOF rewrite buffer > 2GB (Fix for issue #504).

During the AOF rewrite process, the parent process needs to accumulate
the new writes in an in-memory buffer: when the child will terminate the
AOF rewriting process this buffer (that ist the difference between the
dataset when the rewrite was started, and the current dataset) is
flushed to the new AOF file.

We used to implement this buffer using an sds.c string, but sds.c has a
2GB limit. Sometimes the dataset can be big enough, the amount of writes
so high, and the rewrite process slow enough that we overflow the 2GB
limit, causing a crash, documented on github by issue #504.

In order to prevent this from happening, this commit introduces a new
system to accumulate writes, implemented by a linked list of blocks of
10 MB each, so that we also avoid paying the reallocation cost.

Note that theoretically modern operating systems may implement realloc()
simply as a remaping of the old pages, thus with very good performances,
see for instance the mremap() syscall on Linux. However this is not
always true, and jemalloc by default avoids doing this because there are
issues with the current implementation of mremap().

For this reason we are using a linked list of blocks instead of a single
block that gets reallocated again and again.

The changes in this commit lacks testing, that will be performed before
merging into the unstable branch. This fix will not enter 2.4 because it
is too invasive. However 2.4 will log a warning when the AOF rewrite
buffer is near to the 2GB limit.
src/aof.c
src/redis.c
src/redis.h