Skip to content

Commit 1dd9cda

Browse files
committed
db: maintain per-block kind internal iterator stats
Expand the internal iterator's per-block stats to include counts of blocks loaded cached and uncached, and convert the block stats to be accumulated per-block kind. Informs #5015.
1 parent 4168789 commit 1dd9cda

File tree

11 files changed

+143
-76
lines changed

11 files changed

+143
-76
lines changed

data_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/cockroachdb/pebble/objstorage/objstorageprovider"
3838
"github.com/cockroachdb/pebble/objstorage/remote"
3939
"github.com/cockroachdb/pebble/sstable"
40+
"github.com/cockroachdb/pebble/sstable/block/blockkind"
4041
"github.com/cockroachdb/pebble/vfs"
4142
"github.com/cockroachdb/pebble/vfs/errorfs"
4243
"github.com/cockroachdb/pebble/wal"
@@ -212,7 +213,9 @@ func runIterCmd(d *datadriven.TestData, iter *Iterator, closeIter bool) string {
212213
case "stats":
213214
stats := iter.Stats()
214215
// The timing is non-deterministic, so set to 0.
215-
stats.InternalStats.BlockReadDuration = 0
216+
for i := range blockkind.NumKinds {
217+
stats.InternalStats.BlockReads[i].BlockReadDuration = 0
218+
}
216219
fmt.Fprintf(&b, "stats: %s\n", stats.String())
217220
continue
218221
case "clone":

internal/base/iterator.go

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/cockroachdb/pebble/internal/humanize"
1313
"github.com/cockroachdb/pebble/internal/treeprinter"
14+
"github.com/cockroachdb/pebble/sstable/block/blockkind"
1415
"github.com/cockroachdb/redact"
1516
)
1617

@@ -365,11 +366,12 @@ func (s SeekLTFlags) DisableRelativeSeek() SeekLTFlags {
365366
return s &^ (1 << seekLTFlagRelativeSeek)
366367
}
367368

368-
// InternalIteratorStats contains miscellaneous stats produced by
369-
// InternalIterators that are part of the InternalIterator tree. Not every
370-
// field is relevant for an InternalIterator implementation. The field values
371-
// are aggregated as one goes up the InternalIterator tree.
372-
type InternalIteratorStats struct {
369+
// BlockReadStats contains stats about block reads performed by an iterator.
370+
type BlockReadStats struct {
371+
// Count is the count of blocks loaded.
372+
Count uint64
373+
// CountInCache is the subset of Count that were found in the block cache.
374+
CountInCache uint64
373375
// Bytes in the loaded blocks. If the block was compressed, this is the
374376
// compressed bytes. Currently, only the index blocks, data blocks
375377
// containing points, and filter blocks are included.
@@ -381,6 +383,26 @@ type InternalIteratorStats struct {
381383
// TODO(sumeer): this currently excludes the time spent in Reader creation,
382384
// and in reading the rangedel and rangekey blocks. Fix that.
383385
BlockReadDuration time.Duration
386+
}
387+
388+
// Add adds the stats in other to the stats in s.
389+
func (s *BlockReadStats) Add(other BlockReadStats) {
390+
s.Count += other.Count
391+
s.CountInCache += other.CountInCache
392+
s.BlockBytes += other.BlockBytes
393+
s.BlockBytesInCache += other.BlockBytesInCache
394+
s.BlockReadDuration += other.BlockReadDuration
395+
}
396+
397+
// InternalIteratorStats contains miscellaneous stats produced by
398+
// InternalIterators that are part of the InternalIterator tree. Not every
399+
// field is relevant for an InternalIterator implementation. The field values
400+
// are aggregated as one goes up the InternalIterator tree.
401+
type InternalIteratorStats struct {
402+
// BlockReads is the count of block reads performed by the iterator by
403+
// type.
404+
BlockReads [blockkind.NumKinds]BlockReadStats
405+
384406
// The following can repeatedly count the same points if they are iterated
385407
// over multiple times. Additionally, they may count a point twice when
386408
// switching directions. The latter could be improved if needed.
@@ -424,9 +446,9 @@ type InternalIteratorStats struct {
424446

425447
// Merge merges the stats in from into the given stats.
426448
func (s *InternalIteratorStats) Merge(from InternalIteratorStats) {
427-
s.BlockBytes += from.BlockBytes
428-
s.BlockBytesInCache += from.BlockBytesInCache
429-
s.BlockReadDuration += from.BlockReadDuration
449+
for i := range blockkind.NumKinds {
450+
s.BlockReads[i].Add(from.BlockReads[i])
451+
}
430452
s.KeyBytes += from.KeyBytes
431453
s.ValueBytes += from.ValueBytes
432454
s.PointCount += from.PointCount
@@ -440,15 +462,24 @@ func (s *InternalIteratorStats) String() string {
440462
return redact.StringWithoutMarkers(s)
441463
}
442464

465+
func (s *InternalIteratorStats) TotalBlockReads() BlockReadStats {
466+
var total BlockReadStats
467+
for i := range blockkind.NumKinds {
468+
total.Add(s.BlockReads[i])
469+
}
470+
return total
471+
}
472+
443473
// SafeFormat implements the redact.SafeFormatter interface.
444474
func (s *InternalIteratorStats) SafeFormat(p redact.SafePrinter, verb rune) {
475+
total := s.TotalBlockReads()
445476
p.Printf("blocks: %s cached",
446-
humanize.Bytes.Uint64(s.BlockBytesInCache),
477+
humanize.Bytes.Uint64(total.BlockBytesInCache),
447478
)
448-
if s.BlockBytes != s.BlockBytesInCache || s.BlockReadDuration != 0 {
479+
if total.BlockBytes != total.BlockBytesInCache || total.BlockReadDuration != 0 {
449480
p.Printf(", %s not cached (read time: %s)",
450-
humanize.Bytes.Uint64(s.BlockBytes-s.BlockBytesInCache),
451-
humanize.FormattedString(s.BlockReadDuration.String()),
481+
humanize.Bytes.Uint64(total.BlockBytes-total.BlockBytesInCache),
482+
humanize.FormattedString(total.BlockReadDuration.String()),
452483
)
453484
}
454485
p.Printf("; points: %s", humanize.Count.Uint64(s.PointCount))

internal/itertest/datadriven.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/cockroachdb/pebble/internal/base"
1919
"github.com/cockroachdb/pebble/internal/keyspan"
2020
"github.com/cockroachdb/pebble/internal/testkeys"
21+
"github.com/cockroachdb/pebble/sstable/block/blockkind"
2122
"github.com/stretchr/testify/require"
2223
)
2324

@@ -222,8 +223,10 @@ func RunInternalIterCmdWriter(
222223
case "stats":
223224
if o.stats != nil {
224225
// The timing is non-deterministic, so set to 0.
225-
o.stats.BlockReadDuration = 0
226-
fmt.Fprintf(w, "%+v\n", *o.stats)
226+
for i := range blockkind.NumKinds {
227+
o.stats.BlockReads[i].BlockReadDuration = 0
228+
}
229+
fmt.Fprintln(w, o.stats.String())
227230
}
228231
continue
229232
case "reset-stats":

iterator.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ var _ redact.SafeFormatter = &IteratorStats{}
130130
// iterators.
131131
type InternalIteratorStats = base.InternalIteratorStats
132132

133+
// BlockReadStats contains iterators stats about block reads.
134+
type BlockReadStats = base.BlockReadStats
135+
133136
// RangeKeyIteratorStats contains miscellaneous stats about range keys
134137
// encountered by the iterator.
135138
type RangeKeyIteratorStats struct {

iterator_test.go

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"github.com/cockroachdb/pebble/internal/testkeys"
3131
"github.com/cockroachdb/pebble/objstorage/objstorageprovider"
3232
"github.com/cockroachdb/pebble/sstable"
33+
"github.com/cockroachdb/pebble/sstable/block/blockkind"
3334
"github.com/cockroachdb/pebble/vfs"
3435
"github.com/stretchr/testify/require"
3536
"golang.org/x/sync/errgroup"
@@ -1330,9 +1331,15 @@ func TestIteratorStatsMerge(t *testing.T) {
13301331
ForwardStepCount: [NumStatsKind]int{5, 6},
13311332
ReverseStepCount: [NumStatsKind]int{7, 8},
13321333
InternalStats: InternalIteratorStats{
1333-
BlockBytes: 9,
1334-
BlockBytesInCache: 10,
1335-
BlockReadDuration: 3 * time.Millisecond,
1334+
BlockReads: [blockkind.NumKinds]base.BlockReadStats{
1335+
blockkind.SSTableData: {
1336+
Count: 2,
1337+
CountInCache: 1,
1338+
BlockBytes: 9,
1339+
BlockBytesInCache: 10,
1340+
BlockReadDuration: 3 * time.Millisecond,
1341+
},
1342+
},
13361343
KeyBytes: 11,
13371344
ValueBytes: 12,
13381345
PointCount: 13,
@@ -1353,9 +1360,15 @@ func TestIteratorStatsMerge(t *testing.T) {
13531360
ForwardStepCount: [NumStatsKind]int{5, 6},
13541361
ReverseStepCount: [NumStatsKind]int{7, 8},
13551362
InternalStats: InternalIteratorStats{
1356-
BlockBytes: 9,
1357-
BlockBytesInCache: 10,
1358-
BlockReadDuration: 4 * time.Millisecond,
1363+
BlockReads: [blockkind.NumKinds]base.BlockReadStats{
1364+
blockkind.SSTableData: {
1365+
Count: 1,
1366+
CountInCache: 1,
1367+
BlockBytes: 9,
1368+
BlockBytesInCache: 10,
1369+
BlockReadDuration: 3 * time.Millisecond,
1370+
},
1371+
},
13591372
KeyBytes: 11,
13601373
ValueBytes: 12,
13611374
PointCount: 13,
@@ -1377,9 +1390,15 @@ func TestIteratorStatsMerge(t *testing.T) {
13771390
ForwardStepCount: [NumStatsKind]int{10, 12},
13781391
ReverseStepCount: [NumStatsKind]int{14, 16},
13791392
InternalStats: InternalIteratorStats{
1380-
BlockBytes: 18,
1381-
BlockBytesInCache: 20,
1382-
BlockReadDuration: 7 * time.Millisecond,
1393+
BlockReads: [blockkind.NumKinds]base.BlockReadStats{
1394+
blockkind.SSTableData: {
1395+
Count: 3,
1396+
CountInCache: 2,
1397+
BlockBytes: 18,
1398+
BlockBytesInCache: 20,
1399+
BlockReadDuration: 6 * time.Millisecond,
1400+
},
1401+
},
13831402
KeyBytes: 22,
13841403
ValueBytes: 24,
13851404
PointCount: 26,

sstable/block/block.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -377,21 +377,24 @@ type ReadEnv struct {
377377
}
378378

379379
// BlockServedFromCache updates the stats when a block was found in the cache.
380-
func (env *ReadEnv) BlockServedFromCache(blockLength uint64) {
380+
func (env *ReadEnv) BlockServedFromCache(kind Kind, blockLength uint64) {
381381
if env.Stats != nil {
382-
env.Stats.BlockBytes += blockLength
383-
env.Stats.BlockBytesInCache += blockLength
382+
env.Stats.BlockReads[kind].Count++
383+
env.Stats.BlockReads[kind].CountInCache++
384+
env.Stats.BlockReads[kind].BlockBytes += blockLength
385+
env.Stats.BlockReads[kind].BlockBytesInCache += blockLength
384386
}
385387
if env.IterStats != nil {
386388
env.IterStats.Accumulate(blockLength, blockLength, 0)
387389
}
388390
}
389391

390392
// BlockRead updates the stats when a block had to be read.
391-
func (env *ReadEnv) BlockRead(blockLength uint64, readDuration time.Duration) {
393+
func (env *ReadEnv) BlockRead(kind Kind, blockLength uint64, readDuration time.Duration) {
392394
if env.Stats != nil {
393-
env.Stats.BlockBytes += blockLength
394-
env.Stats.BlockReadDuration += readDuration
395+
env.Stats.BlockReads[kind].Count++
396+
env.Stats.BlockReads[kind].BlockBytes += blockLength
397+
env.Stats.BlockReads[kind].BlockReadDuration += readDuration
395398
}
396399
if env.IterStats != nil {
397400
env.IterStats.Accumulate(blockLength, 0, readDuration)
@@ -461,7 +464,7 @@ func (r *Reader) Read(
461464
if r.opts.CacheOpts.CacheHandle == nil || env.BufferPool != nil {
462465
if r.opts.CacheOpts.CacheHandle != nil {
463466
if cv := r.opts.CacheOpts.CacheHandle.Get(r.opts.CacheOpts.FileNum, bh.Offset); cv != nil {
464-
recordCacheHit(ctx, env, readHandle, bh)
467+
recordCacheHit(ctx, env, readHandle, bh, kind)
465468
return CacheBufferHandle(cv), nil
466469
}
467470
}
@@ -493,7 +496,7 @@ func (r *Reader) Read(
493496
panic("cache.ReadHandle must not be valid")
494497
}
495498
if hit {
496-
recordCacheHit(ctx, env, readHandle, bh)
499+
recordCacheHit(ctx, env, readHandle, bh, kind)
497500
}
498501
return CacheBufferHandle(cv), nil
499502
}
@@ -507,12 +510,14 @@ func (r *Reader) Read(
507510
return value.MakeHandle(), nil
508511
}
509512

510-
func recordCacheHit(ctx context.Context, env ReadEnv, readHandle objstorage.ReadHandle, bh Handle) {
513+
func recordCacheHit(
514+
ctx context.Context, env ReadEnv, readHandle objstorage.ReadHandle, bh Handle, kind Kind,
515+
) {
511516
// Cache hit.
512517
if readHandle != nil {
513518
readHandle.RecordCacheHit(ctx, int64(bh.Offset), int64(bh.Length+TrailerLen))
514519
}
515-
env.BlockServedFromCache(bh.Length)
520+
env.BlockServedFromCache(kind, bh.Length)
516521
}
517522

518523
// TODO(sumeer): should the threshold be configurable.
@@ -562,7 +567,7 @@ func (r *Reader) doRead(
562567
compressed.Release()
563568
return Value{}, err
564569
}
565-
env.BlockRead(bh.Length, readDuration)
570+
env.BlockRead(kind, bh.Length, readDuration)
566571
if err = ValidateChecksum(r.checksumType, compressed.BlockData(), bh); err != nil {
567572
compressed.Release()
568573
err = errors.Wrapf(err, "pebble: file %s", r.opts.CacheOpts.FileNum)

sstable/data_test.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"github.com/cockroachdb/pebble/internal/testkeys"
2424
"github.com/cockroachdb/pebble/objstorage"
2525
"github.com/cockroachdb/pebble/objstorage/objstorageprovider"
26+
"github.com/cockroachdb/pebble/sstable/block/blockkind"
2627
"github.com/cockroachdb/pebble/sstable/colblk"
2728
"github.com/cockroachdb/pebble/vfs"
2829
)
@@ -326,8 +327,10 @@ func runIterCmd(
326327
kv = nil
327328
case "stats":
328329
// The timing is non-deterministic, so set to 0.
329-
opts.stats.BlockReadDuration = 0
330-
fmt.Fprintf(&b, "%+v\n", *opts.stats)
330+
for i := range blockkind.NumKinds {
331+
opts.stats.BlockReads[i].BlockReadDuration = 0
332+
}
333+
fmt.Fprintf(&b, "%s\n", opts.stats.String())
331334
continue
332335
case "reset-stats":
333336
*opts.stats = base.InternalIteratorStats{}

sstable/testdata/readerstats_LevelDB/iter

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,25 @@ first
3535
stats
3636
----
3737
first: <a:1>
38-
{BlockBytes:74 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
38+
blocks: 0B cached, 74B not cached (read time: 0s); points: 0 (0B keys, 0B values)
3939
next: <b:2>
40-
{BlockBytes:74 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
40+
blocks: 0B cached, 74B not cached (read time: 0s); points: 0 (0B keys, 0B values)
4141
next: <c:3>
42-
{BlockBytes:108 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
42+
blocks: 0B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
4343
next: <d:4>
44-
{BlockBytes:108 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
44+
blocks: 0B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
4545
next: .
46-
{BlockBytes:108 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
46+
blocks: 0B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
4747
first: <a:1>
48-
{BlockBytes:142 BlockBytesInCache:34 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
48+
blocks: 34B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
4949
next: <b:2>
50-
{BlockBytes:142 BlockBytesInCache:34 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
50+
blocks: 34B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
5151
next: <c:3>
52-
{BlockBytes:176 BlockBytesInCache:68 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
52+
blocks: 68B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
5353
next: <d:4>
54-
{BlockBytes:176 BlockBytesInCache:68 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
54+
blocks: 68B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
5555
next: .
56-
{BlockBytes:176 BlockBytesInCache:68 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
57-
{BlockBytes:0 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
56+
blocks: 68B cached, 108B not cached (read time: 0s); points: 0 (0B keys, 0B values)
57+
blocks: 0B cached; points: 0 (0B keys, 0B values)
5858
first: <a:1>
59-
{BlockBytes:34 BlockBytesInCache:34 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
59+
blocks: 34B cached; points: 0 (0B keys, 0B values)

sstable/testdata/readerstats_Pebblev3/iter

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ next
3333
stats
3434
----
3535
first: <c@10:10>
36-
{BlockBytes:251 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:0 ValueBytes:0 ValueBytesFetched:0}}
36+
blocks: 0B cached, 251B not cached (read time: 0s); points: 0 (0B keys, 0B values)
3737
next: <c@9:9>
38-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:1 ValueBytes:4 ValueBytesFetched:4}}
38+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 1 (4B, 4B fetched)
3939
next: <c@8:8>
40-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:2 ValueBytes:8 ValueBytesFetched:8}}
40+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 2 (8B, 8B fetched)
4141
next: <d@7:9>
42-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:2 ValueBytes:8 ValueBytesFetched:8}}
42+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 2 (8B, 8B fetched)
4343

4444
# seek-ge e@37 starts at the restart point at the beginning of the block and
4545
# iterates over 3 irrelevant separated versions before getting to e@37
@@ -55,12 +55,12 @@ next
5555
stats
5656
----
5757
seek-ge e@37: <e@37:47>
58-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:4 ValueBytes:18 ValueBytesFetched:5}}
58+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 4 (18B, 5B fetched)
5959
next: <e@36:46>
6060
next: <e@35:45>
6161
next: <e@34:44>
6262
next: <e@33:43>
63-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:8 ValueBytes:38 ValueBytesFetched:25}}
63+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 8 (38B, 25B fetched)
6464

6565
# seek-ge e@26 lands at the restart point e@26.
6666
iter
@@ -72,8 +72,8 @@ prev
7272
stats
7373
----
7474
seek-ge e@26: <e@26:36>
75-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:1 ValueBytes:5 ValueBytesFetched:5}}
75+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 1 (5B, 5B fetched)
7676
prev: <e@27:37>
77-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:2 ValueBytes:10 ValueBytesFetched:10}}
77+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 2 (10B, 10B fetched)
7878
prev: <e@28:38>
79-
{BlockBytes:328 BlockBytesInCache:0 BlockReadDuration:0s KeyBytes:0 ValueBytes:0 PointCount:0 PointsCoveredByRangeTombstones:0 SeparatedPointValue:{Count:3 ValueBytes:15 ValueBytesFetched:15}}
79+
blocks: 0B cached, 328B not cached (read time: 0s); points: 0 (0B keys, 0B values); separated: 3 (15B, 15B fetched)

0 commit comments

Comments
 (0)