From 104566ae5372a222b6eff491274a4de1ab290e18 Mon Sep 17 00:00:00 2001 From: YaoZengzeng Date: Fri, 12 Jul 2019 12:15:16 +0800 Subject: [PATCH] enhancement: 1. don't flush the page if it's last fragment of the record 2. if it's last record of the bacth, flush the page after it written into the page Signed-off-by: YaoZengzeng --- wal/wal.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/wal/wal.go b/wal/wal.go index 39daba975..1255652d2 100644 --- a/wal/wal.go +++ b/wal/wal.go @@ -615,17 +615,21 @@ func (w *WAL) log(rec []byte, final bool) error { copy(buf[recordHeaderSize:], part) p.alloc += len(part) + recordHeaderSize - // By definition when a record is split it means its size is bigger than - // the page boundary so the current page would be full and needs to be flushed. - // On contrary if we wrote a full record, we can fit more records of the batch - // into the page before flushing it. - if final || typ != recFull || w.page.full() { - if err := w.flushPage(false); err != nil { + if w.page.full() { + if err := w.flushPage(true); err != nil { return err } } rec = rec[l:] } + + // If it's the final record of the batch and the page is not empty, flush it. + if final && w.page.alloc > 0 { + if err := w.flushPage(false); err != nil { + return err + } + } + return nil }