From ad59ca833a78cda89159e2a20ee5fbb065f1fb8d Mon Sep 17 00:00:00 2001 From: ekexium Date: Mon, 5 Dec 2022 16:43:17 +0800 Subject: [PATCH] fix: do not call onMemChange in alloc, since it will make the latest block empty, which breaks a precondition for some operations (e.g. revertToCheckpoint) (#632) Signed-off-by: ekexium --- internal/unionstore/memdb_arena.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/internal/unionstore/memdb_arena.go b/internal/unionstore/memdb_arena.go index c4ea9009..ed97aa43 100644 --- a/internal/unionstore/memdb_arena.go +++ b/internal/unionstore/memdb_arena.go @@ -129,7 +129,8 @@ func (a *memdbArena) enlarge(allocSize, blockSize int) { buf: make([]byte, a.blockSize), }) a.capacity += uint64(a.blockSize) - a.onMemChange() + // We shall not call a.onMemChange() here, since it will make the latest block empty, which breaks a precondition + // for some operations (e.g. revertToCheckpoint) } func (a *memdbArena) onMemChange() { @@ -250,11 +251,15 @@ func (a *nodeAllocator) getNode(addr memdbArenaAddr) *memdbNode { func (a *nodeAllocator) allocNode(key []byte) (memdbArenaAddr, *memdbNode) { nodeSize := 8*4 + 2 + kv.FlagBytes + len(key) + prevBlocks := len(a.blocks) addr, mem := a.alloc(nodeSize, true) n := (*memdbNode)(unsafe.Pointer(&mem[0])) n.vptr = nullAddr n.klen = uint16(len(key)) copy(n.getKey(), key) + if prevBlocks != len(a.blocks) { + a.onMemChange() + } return addr, n } @@ -313,6 +318,7 @@ func (hdr *memdbVlogHdr) load(src []byte) { func (l *memdbVlog) appendValue(nodeAddr memdbArenaAddr, oldValue memdbArenaAddr, value []byte) memdbArenaAddr { size := memdbVlogHdrSize + len(value) + prevBlocks := len(l.blocks) addr, mem := l.alloc(size, false) copy(mem, value) @@ -320,6 +326,9 @@ func (l *memdbVlog) appendValue(nodeAddr memdbArenaAddr, oldValue memdbArenaAddr hdr.store(mem[len(value):]) addr.off += uint32(size) + if prevBlocks != len(l.blocks) { + l.onMemChange() + } return addr }