From 74a0617d8eb3e785dd512f8755a43b185f1ed558 Mon Sep 17 00:00:00 2001 From: ekexium Date: Fri, 24 Jan 2025 12:50:35 +0800 Subject: [PATCH] optimize batched iter Signed-off-by: ekexium --- internal/unionstore/memdb_art.go | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/internal/unionstore/memdb_art.go b/internal/unionstore/memdb_art.go index ebd63edce8..081f95c51f 100644 --- a/internal/unionstore/memdb_art.go +++ b/internal/unionstore/memdb_art.go @@ -219,7 +219,6 @@ func (db *artDBWithContext) BatchedSnapshotIter(lower, upper []byte, reverse boo batchSize: 4, } - // Position at first key immediately iter.fillBatch() return iter } @@ -269,11 +268,24 @@ func (it *snapshotBatchedIter) fillBatch() error { // update state it.pos = 0 if len(it.kvs) > 0 { - lastKV := it.kvs[len(it.kvs)-1] + lastKV := &it.kvs[len(it.kvs)-1] + keyLen := len(lastKV.Key) + if it.reverse { - it.nextKey = append([]byte(nil), lastKV.Key...) + if cap(it.nextKey) >= keyLen { + it.nextKey = it.nextKey[:keyLen] + } else { + it.nextKey = make([]byte, keyLen) + } + copy(it.nextKey, lastKV.Key) } else { - it.nextKey = append(append([]byte(nil), lastKV.Key...), 0) + if cap(it.nextKey) >= keyLen+1 { + it.nextKey = it.nextKey[:keyLen+1] + } else { + it.nextKey = make([]byte, keyLen+1) + } + copy(it.nextKey, lastKV.Key) + it.nextKey[keyLen] = 0 } } else { it.nextKey = nil