From f990782f4ded01658f3091b5ebf956ca778f957e Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Thu, 18 Aug 2011 12:44:30 +0200 Subject: [PATCH] Re-use AOF buffer when it is small enough --- src/aof.c | 11 +++++++++-- src/sds.c | 7 +++++++ src/sds.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/aof.c b/src/aof.c index 0ebe4457..60694dbf 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 2ec7c3cb..77052966 100644 --- a/src/sds.c +++ b/src/sds.c @@ -94,6 +94,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 af5c4910..6e5684ee 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); -- GitLab