summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-08-18 12:44:30 +0200
committerantirez <antirez@gmail.com>2011-09-13 12:26:49 +0200
commit0fb6212cf4fd689c890e4cbbe1e3f724e341972e (patch)
treeabfa394818b52f270df4614689b3c2f41ed8e393
parentf602318349765f0b684bc7b60eca30355413e51e (diff)
downloadredis-0fb6212cf4fd689c890e4cbbe1e3f724e341972e.tar.gz
Re-use AOF buffer when it is small enough
-rw-r--r--src/aof.c11
-rw-r--r--src/sds.c7
-rw-r--r--src/sds.h1
3 files changed, 17 insertions, 2 deletions
diff --git a/src/aof.c b/src/aof.c
index efb245646..7093a91bc 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -81,10 +81,17 @@ void flushAppendOnlyFile(void) {
}
exit(1);
}
- sdsfree(server.aofbuf);
- server.aofbuf = sdsempty();
server.appendonly_current_size += nwritten;
+ /* 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). */
+ if ((sdslen(server.aofbuf)+sdsavail(server.aofbuf)) < 4000) {
+ sdsclear(server.aofbuf);
+ } else {
+ sdsfree(server.aofbuf);
+ server.aofbuf = sdsempty();
+ }
+
/* Don't fsync if no-appendfsync-on-rewrite is set to yes and there are
* children doing I/O in the background. */
if (server.no_appendfsync_on_rewrite &&
diff --git a/src/sds.c b/src/sds.c
index c2a3f587a..7c9d2e6f4 100644
--- a/src/sds.c
+++ b/src/sds.c
@@ -92,6 +92,13 @@ void sdsupdatelen(sds s) {
sh->len = reallen;
}
+void sdsclear(sds s) {
+ struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
+ sh->free += sh->len;
+ sh->len = 0;
+ sh->buf[0] = '\0';
+}
+
static sds sdsMakeRoomFor(sds s, size_t addlen) {
struct sdshdr *sh, *newsh;
size_t free = sdsavail(s);
diff --git a/src/sds.h b/src/sds.h
index a55c5b429..eeb39a1ad 100644
--- a/src/sds.h
+++ b/src/sds.h
@@ -76,6 +76,7 @@ sds sdscatprintf(sds s, const char *fmt, ...);
sds sdstrim(sds s, const char *cset);
sds sdsrange(sds s, int start, int end);
void sdsupdatelen(sds s);
+void sdsclear(sds s);
int sdscmp(sds s1, sds s2);
sds *sdssplitlen(char *s, int len, char *sep, int seplen, int *count);
void sdsfreesplitres(sds *tokens, int count);