diff --git a/lib/mergeset/table.go b/lib/mergeset/table.go index 28e632dd05..25d535d9c4 100644 --- a/lib/mergeset/table.go +++ b/lib/mergeset/table.go @@ -644,17 +644,20 @@ func (ris *rawItemsShard) appendBlocksToFlush(dst []*inmemoryBlock, tb *Table, i flushSeconds = 1 } lastFlushTime := atomic.LoadUint64(&ris.lastFlushTime) - if isFinal || currentTime-lastFlushTime > uint64(flushSeconds) { - ris.mu.Lock() - ibs := ris.ibs - dst = append(dst, ibs...) - for i := range ibs { - ibs[i] = nil - } - ris.ibs = ibs[:0] - atomic.StoreUint64(&ris.lastFlushTime, currentTime) - ris.mu.Unlock() + if !isFinal && currentTime <= lastFlushTime+uint64(flushSeconds) { + // Fast path - nothing to flush + return dst } + // Slow path - move ris.ibs to dst + ris.mu.Lock() + ibs := ris.ibs + dst = append(dst, ibs...) + for i := range ibs { + ibs[i] = nil + } + ris.ibs = ibs[:0] + atomic.StoreUint64(&ris.lastFlushTime, currentTime) + ris.mu.Unlock() return dst } diff --git a/lib/storage/partition.go b/lib/storage/partition.go index 9e1ec3ed4c..6bda9ddc40 100644 --- a/lib/storage/partition.go +++ b/lib/storage/partition.go @@ -747,13 +747,16 @@ func (rrs *rawRowsShard) appendRawRowsToFlush(dst []rawRow, pt *partition, isFin flushSeconds = 1 } lastFlushTime := atomic.LoadUint64(&rrs.lastFlushTime) - if isFinal || currentTime-lastFlushTime > uint64(flushSeconds) { - rrs.mu.Lock() - dst = append(dst, rrs.rows...) - rrs.rows = rrs.rows[:0] - atomic.StoreUint64(&rrs.lastFlushTime, currentTime) - rrs.mu.Unlock() + if !isFinal && currentTime <= lastFlushTime+uint64(flushSeconds) { + // Fast path - nothing to flush + return dst } + // Slow path - move rrs.rows to dst. + rrs.mu.Lock() + dst = append(dst, rrs.rows...) + rrs.rows = rrs.rows[:0] + atomic.StoreUint64(&rrs.lastFlushTime, currentTime) + rrs.mu.Unlock() return dst }