From 93ada2eaaf4993e176a4791408b5b1ff7ffebac6 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Thu, 8 Feb 2024 13:50:14 +0200 Subject: [PATCH] lib/mergeset: verify that the index block for in-memory part doesnt exceed the 3*maxIndexBlockSize --- lib/mergeset/inmemory_part.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/mergeset/inmemory_part.go b/lib/mergeset/inmemory_part.go index d798f4537..a43b5b6f2 100644 --- a/lib/mergeset/inmemory_part.go +++ b/lib/mergeset/inmemory_part.go @@ -6,6 +6,7 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/lib/bytesutil" "github.com/VictoriaMetrics/VictoriaMetrics/lib/encoding" "github.com/VictoriaMetrics/VictoriaMetrics/lib/fs" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" ) type inmemoryPart struct { @@ -84,6 +85,10 @@ func (mp *inmemoryPart) Init(ib *inmemoryBlock) { bb := inmemoryPartBytePool.Get() bb.B = mp.bh.Marshal(bb.B[:0]) + if len(bb.B) > 3*maxIndexBlockSize { + // marshaled blockHeader can exceed indexBlockSize when firstItem and commonPrefix sizes are close to indexBlockSize + logger.Panicf("BUG: too big index block: %d bytes; mustn't exceed %d bytes", len(bb.B), 3*maxIndexBlockSize) + } mp.indexData.B = encoding.CompressZSTDLevel(mp.indexData.B[:0], bb.B, compressLevel) mp.mr.firstItem = append(mp.mr.firstItem[:0], mp.bh.firstItem...)