From e2d45555803f98bb363f213f60f4c73315ffacc4 Mon Sep 17 00:00:00 2001 From: Bashmunta Date: Tue, 2 Dec 2025 12:19:10 +0200 Subject: [PATCH 1/2] 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 8cb4cc20063c..88bde70e72ac 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 } From 9c550417509d9be6c0b0ca3ec325a7b15b038fbb Mon Sep 17 00:00:00 2001 From: Bashmunta Date: Thu, 4 Dec 2025 12:51:58 +0200 Subject: [PATCH 2/2] refactor --- core/rawdb/freezer_memory.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/core/rawdb/freezer_memory.go b/core/rawdb/freezer_memory.go index 88bde70e72ac..32bb680f363f 100644 --- a/core/rawdb/freezer_memory.go +++ b/core/rawdb/freezer_memory.go @@ -92,17 +92,15 @@ func (t *memoryTable) truncateHead(items uint64) error { return errors.New("truncation below tail") } removeFrom := items - t.offset - var removed uint64 - for i := removeFrom; i < uint64(len(t.data)); i++ { - removed += uint64(len(t.data[i])) + for i := int(removeFrom); i < len(t.data); i++ { + if t.size > uint64(len(t.data[i])) { + t.size -= uint64(len(t.data[i])) + } else { + t.size = 0 + } } t.data = t.data[:removeFrom] t.items = items - if removed >= t.size { - t.size = 0 - } else { - t.size -= removed - } return nil }