diff --git a/app/vmselect/netstorage/netstorage.go b/app/vmselect/netstorage/netstorage.go index f8b4a91271..6cfa861f2b 100644 --- a/app/vmselect/netstorage/netstorage.go +++ b/app/vmselect/netstorage/netstorage.go @@ -386,7 +386,7 @@ func (sb *sortBlock) reset() { func (sb *sortBlock) unpackFrom(tmpBlock *storage.Block, br storage.BlockRef, tr storage.TimeRange) error { tmpBlock.Reset() - br.MustReadBlock(tmpBlock) + br.MustReadBlock(tmpBlock, true) if err := tmpBlock.UnmarshalData(); err != nil { return fmt.Errorf("cannot unmarshal block: %w", err) } diff --git a/lib/storage/part_search_test.go b/lib/storage/part_search_test.go index f07024c9e0..6a34bded21 100644 --- a/lib/storage/part_search_test.go +++ b/lib/storage/part_search_test.go @@ -1251,7 +1251,7 @@ func testPartSearchSerial(p *part, tsids []TSID, tr TimeRange, expectedRawBlocks var bs []Block for ps.NextBlock() { var b Block - ps.BlockRef.MustReadBlock(&b) + ps.BlockRef.MustReadBlock(&b, true) bs = append(bs, b) } if err := ps.Error(); err != nil { diff --git a/lib/storage/partition_search_test.go b/lib/storage/partition_search_test.go index 2f1a97e8d8..9342a9cbce 100644 --- a/lib/storage/partition_search_test.go +++ b/lib/storage/partition_search_test.go @@ -243,7 +243,7 @@ func testPartitionSearchSerial(pt *partition, tsids []TSID, tr TimeRange, rbsExp pts.Init(pt, tsids, tr) for pts.NextBlock() { var b Block - pts.BlockRef.MustReadBlock(&b) + pts.BlockRef.MustReadBlock(&b, true) bs = append(bs, b) } if err := pts.Error(); err != nil { diff --git a/lib/storage/search.go b/lib/storage/search.go index b8dc84dcb3..60c209906c 100644 --- a/lib/storage/search.go +++ b/lib/storage/search.go @@ -31,9 +31,14 @@ func (br *BlockRef) init(p *part, bh *blockHeader) { } // MustReadBlock reads block from br to dst. -func (br *BlockRef) MustReadBlock(dst *Block) { +// +// if fetchData is false, then only block header is read, otherwise all the data is read. +func (br *BlockRef) MustReadBlock(dst *Block, fetchData bool) { dst.Reset() dst.bh = br.bh + if !fetchData { + return + } dst.timestampsData = bytesutil.Resize(dst.timestampsData[:0], int(br.bh.TimestampsBlockSize)) br.p.timestampsFile.MustReadAt(dst.timestampsData, int64(br.bh.TimestampsBlockOffset)) diff --git a/lib/storage/search_test.go b/lib/storage/search_test.go index c1972d494c..6396acad61 100644 --- a/lib/storage/search_test.go +++ b/lib/storage/search_test.go @@ -222,7 +222,7 @@ func testSearchInternal(st *Storage, tr TimeRange, mrs []MetricRow, accountsCoun var mbs []metricBlock for s.NextMetricBlock() { var b Block - s.MetricBlockRef.BlockRef.MustReadBlock(&b) + s.MetricBlockRef.BlockRef.MustReadBlock(&b, true) var mb metricBlock mb.MetricName = append(mb.MetricName, s.MetricBlockRef.MetricName...) diff --git a/lib/storage/table_search_test.go b/lib/storage/table_search_test.go index 57bab8bdb1..d2f81e813e 100644 --- a/lib/storage/table_search_test.go +++ b/lib/storage/table_search_test.go @@ -254,7 +254,7 @@ func testTableSearchSerial(tb *table, tsids []TSID, tr TimeRange, rbsExpected [] ts.Init(tb, tsids, tr) for ts.NextBlock() { var b Block - ts.BlockRef.MustReadBlock(&b) + ts.BlockRef.MustReadBlock(&b, true) bs = append(bs, b) } if err := ts.Error(); err != nil { diff --git a/lib/storage/table_search_timing_test.go b/lib/storage/table_search_timing_test.go index 107f3a8332..42b450681b 100644 --- a/lib/storage/table_search_timing_test.go +++ b/lib/storage/table_search_timing_test.go @@ -26,7 +26,11 @@ func BenchmarkTableSearch(b *testing.B) { b.Run(fmt.Sprintf("tsidsCount_%d", tsidsCount), func(b *testing.B) { for _, tsidsSearch := range []int{1, 1e1, 1e2, 1e3, 1e4} { b.Run(fmt.Sprintf("tsidsSearch_%d", tsidsSearch), func(b *testing.B) { - benchmarkTableSearch(b, rowsCount, tsidsCount, tsidsSearch) + for _, fetchData := range []bool{true, false} { + b.Run(fmt.Sprintf("fetchData_%v", fetchData), func(b *testing.B) { + benchmarkTableSearch(b, rowsCount, tsidsCount, tsidsSearch, fetchData) + }) + } }) } }) @@ -103,7 +107,7 @@ func createBenchTable(b *testing.B, path string, startTimestamp int64, rowsPerIn tb.MustClose() } -func benchmarkTableSearch(b *testing.B, rowsCount, tsidsCount, tsidsSearch int) { +func benchmarkTableSearch(b *testing.B, rowsCount, tsidsCount, tsidsSearch int, fetchData bool) { startTimestamp := timestampFromTime(time.Now()) - 365*24*3600*1000 rowsPerInsert := getMaxRawRowsPerPartition() @@ -130,7 +134,7 @@ func benchmarkTableSearch(b *testing.B, rowsCount, tsidsCount, tsidsSearch int) } ts.Init(tb, tsids, tr) for ts.NextBlock() { - ts.BlockRef.MustReadBlock(&tmpBlock) + ts.BlockRef.MustReadBlock(&tmpBlock, fetchData) } ts.MustClose() }