From e2d45555803f98bb363f213f60f4c73315ffacc4 Mon Sep 17 00:00:00 2001 From: Bashmunta Date: Tue, 2 Dec 2025 12:19:10 +0200 Subject: [PATCH] fix(rawdb): correct MemoryFreezer AncientSize by decrementing size on truncation --- core/rawdb/freezer_memory.go | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/core/rawdb/freezer_memory.go b/core/rawdb/freezer_memory.go index 8cb4cc2006..88bde70e72 100644 --- a/core/rawdb/freezer_memory.go +++ b/core/rawdb/freezer_memory.go @@ -91,8 +91,18 @@ func (t *memoryTable) truncateHead(items uint64) error { if items < t.offset { return errors.New("truncation below tail") } - t.data = t.data[:items-t.offset] + removeFrom := items - t.offset + var removed uint64 + for i := removeFrom; i < uint64(len(t.data)); i++ { + removed += uint64(len(t.data[i])) + } + t.data = t.data[:removeFrom] t.items = items + if removed >= t.size { + t.size = 0 + } else { + t.size -= removed + } return nil } @@ -108,8 +118,25 @@ func (t *memoryTable) truncateTail(items uint64) error { if t.items < items { return errors.New("truncation above head") } - t.data = t.data[items-t.offset:] + drop := items - t.offset + var removed uint64 + for i := uint64(0); i < drop; i++ { + removed += uint64(len(t.data[i])) + } + newLen := uint64(len(t.data)) - drop + if newLen == 0 { + t.data = nil + } else { + newData := make([][]byte, newLen) + copy(newData, t.data[drop:]) + t.data = newData + } t.offset = items + if removed >= t.size { + t.size = 0 + } else { + t.size -= removed + } return nil }