Skip to content

Commit 526e102

Browse files
committed
manifest: add BackingValueSize field for blob refs
Track BackingValueSize for blob references, which is the uncompressed value size in blob files referenced by the backing sstable. For non-virtual sstables, this equals the existing ValueSize field. The BackingValueSize should only be popualted for FMV >= FormatBackingValueSize, falling back to reading ValueSize when the BackingValueSize is 0. Use BackingValueSize in the estimation of referencedValueSize for the CurrentBlobFileSet. This prevents wasteful blob file rewrite compactions when virtual sstables are involved, as blob compactions currentlyr rewrite based on value references tracked by the original table. Part of: #4915
1 parent 4ee17c2 commit 526e102

13 files changed

+219
-53
lines changed

blob_rewrite_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,11 @@ func TestBlobRewrite(t *testing.T) {
142142
} else {
143143
fmt.Fprintln(&buf, "blobrefs:[")
144144
for i, ref := range meta.BlobReferences {
145-
fmt.Fprintf(&buf, " %d: %s %d\n", i, ref.FileID, ref.ValueSize)
145+
fmt.Fprintf(&buf, " %d: %s %d", i, ref.FileID, ref.ValueSize)
146+
if ref.ValueSize != ref.BackingValueSize && ref.BackingValueSize > 0 {
147+
fmt.Fprintf(&buf, "/%d", ref.BackingValueSize)
148+
}
149+
fmt.Fprintf(&buf, "\n")
146150
}
147151
fmt.Fprintln(&buf, "]")
148152
}
@@ -309,13 +313,14 @@ func TestBlobRewriteRandomized(t *testing.T) {
309313
))
310314
require.NoError(t, tw.Close())
311315
originalValueIndices[i] = i
316+
valueSize := uint64(len(values[i]))
312317
originalTables[i] = &manifest.TableMetadata{
313318
TableNum: base.TableNum(i),
314319
TableBacking: &manifest.TableBacking{
315320
DiskFileNum: base.DiskFileNum(i),
316321
},
317322
BlobReferences: []manifest.BlobReference{
318-
{FileID: base.BlobFileID(blobFileID), ValueSize: uint64(len(values[i]))},
323+
{FileID: base.BlobFileID(blobFileID), ValueSize: valueSize, BackingValueSize: valueSize},
319324
},
320325
}
321326
}

compaction_picker.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1690,7 +1690,8 @@ func (p *compactionPickerByScore) pickBlobFileRewriteCompaction(
16901690
// Blob file rewrite compactions are disabled.
16911691
return nil
16921692
}
1693-
garbagePct := float64(aggregateStats.ValueSize-aggregateStats.ReferencedValueSize) /
1693+
1694+
garbagePct := float64(aggregateStats.ValueSize-aggregateStats.ReferencedBackingValueSize) /
16941695
float64(aggregateStats.ValueSize)
16951696
if garbagePct <= policy.TargetGarbageRatio {
16961697
// Not enough garbage to warrant a rewrite compaction.

compaction_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,11 @@ func TestCompaction(t *testing.T) {
15081508
minVersion: formatDeprecatedExperimentalValueSeparation,
15091509
maxVersion: formatDeprecatedExperimentalValueSeparation,
15101510
},
1511+
"backing_value_size": {
1512+
minVersion: FormatBackingValueSize,
1513+
maxVersion: FormatBackingValueSize,
1514+
verbose: true,
1515+
},
15111516
}
15121517
datadriven.Walk(t, "testdata/compaction", func(t *testing.T, path string) {
15131518
filename := filepath.Base(path)

excise.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ func (d *DB) exciseTable(
163163
} else if err := determineExcisedTableSize(d.fileCache, m, leftTable); err != nil {
164164
return nil, nil, err
165165
}
166-
determineExcisedTableBlobReferences(m.BlobReferences, m.Size, leftTable)
166+
determineExcisedTableBlobReferences(m.BlobReferences, m.Size, leftTable, d.FormatMajorVersion())
167167
if err := leftTable.Validate(d.cmp, d.opts.Comparer.FormatKey); err != nil {
168168
return nil, nil, err
169169
}
@@ -203,7 +203,7 @@ func (d *DB) exciseTable(
203203
} else if err := determineExcisedTableSize(d.fileCache, m, rightTable); err != nil {
204204
return nil, nil, err
205205
}
206-
determineExcisedTableBlobReferences(m.BlobReferences, m.Size, rightTable)
206+
determineExcisedTableBlobReferences(m.BlobReferences, m.Size, rightTable, d.FormatMajorVersion())
207207
if err := rightTable.Validate(d.cmp, d.opts.Comparer.FormatKey); err != nil {
208208
return nil, nil, err
209209
}
@@ -455,13 +455,17 @@ func determineExcisedTableBlobReferences(
455455
originalBlobReferences manifest.BlobReferences,
456456
originalSize uint64,
457457
excisedTable *manifest.TableMetadata,
458+
fmv FormatMajorVersion,
458459
) {
459460
if len(originalBlobReferences) == 0 {
460461
return
461462
}
462463
newBlobReferences := make(manifest.BlobReferences, len(originalBlobReferences))
463464
for i, bf := range originalBlobReferences {
464465
bf.ValueSize = max(bf.ValueSize*excisedTable.Size/originalSize, 1)
466+
if fmv < FormatBackingValueSize {
467+
bf.BackingValueSize = 0
468+
}
465469
newBlobReferences[i] = bf
466470
}
467471
excisedTable.BlobReferences = newBlobReferences

internal/manifest/blob_metadata.go

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ type BlobReference struct {
3737
// any of the referencing tables are virtualized tables, the ValueSize may
3838
// be approximate.
3939
ValueSize uint64
40+
// BackingValueSize is the sum of the lengths of the uncompressed values within the
41+
// blob file for which there exists a reference in the backing sstable. For non-virtual
42+
// sstables, this is the same as ValueSize.
43+
BackingValueSize uint64
4044
// EstimatedPhysicalSize is an estimate of the physical size of the blob
4145
// reference, in bytes. It's calculated by scaling the blob file's physical
4246
// size according to the ValueSize of the blob reference relative to the
@@ -47,7 +51,7 @@ type BlobReference struct {
4751
// MakeBlobReference creates a BlobReference from the given file ID, value size,
4852
// and physical blob file.
4953
func MakeBlobReference(
50-
fileID base.BlobFileID, valueSize uint64, phys *PhysicalBlobFile,
54+
fileID base.BlobFileID, valueSize uint64, backingValueSize uint64, phys *PhysicalBlobFile,
5155
) BlobReference {
5256
if invariants.Enabled {
5357
switch {
@@ -61,8 +65,9 @@ func MakeBlobReference(
6165
}
6266
}
6367
return BlobReference{
64-
FileID: fileID,
65-
ValueSize: valueSize,
68+
FileID: fileID,
69+
ValueSize: valueSize,
70+
BackingValueSize: backingValueSize,
6671
// valueSize
6772
// Reference size = ----------------- × phys.Size
6873
// phys.ValueSize
@@ -467,6 +472,12 @@ type AggregateBlobFileStats struct {
467472
// in all blob files in the set that are still referenced by live tables
468473
// (i.e., in the latest version).
469474
ReferencedValueSize uint64
475+
// ReferencedBackingValueSize is the sum of the length of the uncompressed
476+
// values in all blob files in the set that are still referenced by live
477+
// backing tables (i.e., in the latest version). Note that this may
478+
// overcount values when virtual sstables with the same backing are present,
479+
// as each virtual sstable contributes the full backing table's value size.
480+
ReferencedBackingValueSize uint64
470481
// ReferencesCount is the total number of tracked references in live tables
471482
// (i.e., in the latest version). When virtual sstables are present, this
472483
// count is per-virtual sstable (not per backing physical sstable).
@@ -475,8 +486,8 @@ type AggregateBlobFileStats struct {
475486

476487
// String implements fmt.Stringer.
477488
func (s AggregateBlobFileStats) String() string {
478-
return fmt.Sprintf("Files:{Count: %d, Size: %d, ValueSize: %d}, References:{ValueSize: %d, Count: %d}",
479-
s.Count, s.PhysicalSize, s.ValueSize, s.ReferencedValueSize, s.ReferencesCount)
489+
return fmt.Sprintf("Files:{Count: %d, Size: %d, ValueSize: %d}, References:{ValueSize: %d, BackingValueSize: %d, Count: %d}",
490+
s.Count, s.PhysicalSize, s.ValueSize, s.ReferencedValueSize, s.ReferencedBackingValueSize, s.ReferencesCount)
480491
}
481492

482493
// CurrentBlobFileSet describes the set of blob files that are currently live in
@@ -528,7 +539,10 @@ type currentBlobFile struct {
528539
// (and we can pool the B-Tree nodes to further reduce allocs)
529540
references map[*TableMetadata]struct{}
530541
// referencedValueSize is the sum of the length of uncompressed values in
531-
// this blob file that are still live.
542+
// this blob file that are still live (referenced by backing tables).
543+
// This value can be greater than the physical ValueSize of the blob file,
544+
// since virtual sstables contribute the referenced value size of the original
545+
// backing table.
532546
referencedValueSize uint64
533547
// heapState holds a pointer to the heap that the blob file is in (if any)
534548
// and its index in the heap's items slice. If referencedValueSize is less
@@ -628,7 +642,11 @@ func (s *CurrentBlobFileSet) Init(bve *BulkVersionEdit, h BlobRewriteHeuristic)
628642
panic(errors.AssertionFailedf("pebble: referenced blob file %d not found", ref.FileID))
629643
}
630644
cbf.references[table] = struct{}{}
631-
cbf.referencedValueSize += ref.ValueSize
645+
refSize := ref.BackingValueSize
646+
if refSize == 0 {
647+
refSize = ref.ValueSize
648+
}
649+
cbf.referencedValueSize += refSize
632650
s.stats.ReferencedValueSize += ref.ValueSize
633651
s.stats.ReferencesCount++
634652
}
@@ -779,8 +797,14 @@ func (s *CurrentBlobFileSet) ApplyAndUpdateVersionEdit(ve *VersionEdit) error {
779797
return errors.AssertionFailedf("pebble: referenced blob file %d not found", ref.FileID)
780798
}
781799
cbf.references[e.Meta] = struct{}{}
782-
cbf.referencedValueSize += ref.ValueSize
800+
refSize := ref.BackingValueSize
801+
if refSize == 0 {
802+
// Fall back to using ValueSize to estimate reference size.
803+
refSize = ref.ValueSize
804+
}
805+
cbf.referencedValueSize += refSize
783806
s.stats.ReferencedValueSize += ref.ValueSize
807+
s.stats.ReferencedBackingValueSize += refSize
784808
s.stats.ReferencesCount++
785809
}
786810
}
@@ -797,10 +821,6 @@ func (s *CurrentBlobFileSet) ApplyAndUpdateVersionEdit(ve *VersionEdit) error {
797821
return errors.AssertionFailedf("pebble: referenced blob file %d not found", ref.FileID)
798822
}
799823
if invariants.Enabled {
800-
if ref.ValueSize > cbf.referencedValueSize {
801-
return errors.AssertionFailedf("pebble: referenced value size %d for blob file %s is greater than the referenced value size %d",
802-
ref.ValueSize, cbf.metadata.FileID, cbf.referencedValueSize)
803-
}
804824
if _, ok := cbf.references[meta]; !ok {
805825
return errors.AssertionFailedf("pebble: deleted table %s's reference to blob file %s not known",
806826
meta.TableNum, ref.FileID)
@@ -810,7 +830,13 @@ func (s *CurrentBlobFileSet) ApplyAndUpdateVersionEdit(ve *VersionEdit) error {
810830
// Decrement the stats for this reference. We decrement even if the
811831
// table is being moved, because we incremented the stats when we
812832
// iterated over the version edit's new tables.
813-
cbf.referencedValueSize -= ref.ValueSize
833+
refSize := ref.BackingValueSize
834+
if refSize == 0 {
835+
// Fall back to using ValueSize to estimate reference size.
836+
refSize = ref.ValueSize
837+
}
838+
cbf.referencedValueSize -= refSize
839+
s.stats.ReferencedBackingValueSize -= refSize
814840
s.stats.ReferencedValueSize -= ref.ValueSize
815841
s.stats.ReferencesCount--
816842
if _, ok := newTables[meta.TableNum]; ok {

internal/manifest/table_metadata.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,12 @@ func (m *TableMetadata) DebugString(format base.FormatKey, verbose bool) string
850850
if i > 0 {
851851
fmt.Fprint(&b, ", ")
852852
}
853-
fmt.Fprintf(&b, "(%s: %d)", r.FileID, r.ValueSize)
853+
fmt.Fprintf(&b, "(%s: %d", r.FileID, r.ValueSize)
854+
// BackingValueSize is only set for on virtual ssts with FMV >= FormatBackingValueSize.
855+
if r.BackingValueSize > 0 && r.BackingValueSize != r.ValueSize {
856+
fmt.Fprintf(&b, "/%d", r.BackingValueSize)
857+
}
858+
fmt.Fprintf(&b, ")")
854859
}
855860
fmt.Fprintf(&b, "; depth:%d]", m.BlobReferenceDepth)
856861
}
@@ -937,6 +942,10 @@ func ParseTableMetadataDebug(s string) (_ *TableMetadata, err error) {
937942
ref.FileID = p.BlobFileID()
938943
p.Expect(":")
939944
ref.ValueSize = p.Uint64()
945+
if p.Peek() == "/" {
946+
p.Expect("/")
947+
ref.BackingValueSize = p.Uint64()
948+
}
940949
m.BlobReferences = append(m.BlobReferences, ref)
941950
p.Expect(")")
942951
}

internal/manifest/testdata/current_blob_file_set

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
init
22
----
33
CurrentBlobFileSet:
4-
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, Count: 0}
4+
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, BackingValueSize: 0, Count: 0}
55
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 0}
66

77
# A version edit that does not contain blob files leaves the set unchanged.
@@ -14,7 +14,7 @@ modified version edit:
1414
add-table: L3 000010:[d#1,SET-e#1,SET] seqnums:[0-0] points:[d#1,SET-e#1,SET]
1515
current blob file set:
1616
CurrentBlobFileSet:
17-
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, Count: 0}
17+
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, BackingValueSize: 0, Count: 0}
1818
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 0}
1919

2020
# A version edit that adds a new blob file records the new file and reference.
@@ -29,7 +29,7 @@ modified version edit:
2929
add-blob-file: B000012 physical:{000012 size:[20535 (20KB)] vals:[25935 (25KB)]}
3030
current blob file set:
3131
CurrentBlobFileSet:
32-
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 25935, Count: 1}
32+
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 25935, BackingValueSize: 25935, Count: 1}
3333
Counts:{FullyReferenced: 1, Eligible: 0, TooRecent: 0}
3434

3535
# A version edit that moves a referencing table from one level to another should
@@ -45,7 +45,7 @@ modified version edit:
4545
add-table: L4 000013:[d#1,SET-e#1,SET] seqnums:[0-0] points:[d#1,SET-e#1,SET] blobrefs:[(B000012: 25935); depth:1]
4646
current blob file set:
4747
CurrentBlobFileSet:
48-
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 25935, Count: 1}
48+
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 25935, BackingValueSize: 25935, Count: 1}
4949
Counts:{FullyReferenced: 1, Eligible: 0, TooRecent: 0}
5050

5151
# A version edit that moves references from deleted tables to created tables
@@ -63,7 +63,7 @@ modified version edit:
6363
add-table: L5 000015:[f#1,SET-g#1,SET] seqnums:[0-0] points:[f#1,SET-g#1,SET] blobrefs:[(B000012: 15935); depth:2]
6464
current blob file set:
6565
CurrentBlobFileSet:
66-
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 15945, Count: 2}
66+
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 15945, BackingValueSize: 15945, Count: 2}
6767
Counts:{FullyReferenced: 0, Eligible: 1, TooRecent: 0}
6868
NextRewrite: B000012 physical:{000012 size:[20535 (20KB)] vals:[25935 (25KB)]} (61.5% live, created at 0)
6969

@@ -77,7 +77,7 @@ modified version edit:
7777
del-table: L5 000014
7878
current blob file set:
7979
CurrentBlobFileSet:
80-
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 15935, Count: 1}
80+
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 15935, BackingValueSize: 15935, Count: 1}
8181
Counts:{FullyReferenced: 0, Eligible: 1, TooRecent: 0}
8282
NextRewrite: B000012 physical:{000012 size:[20535 (20KB)] vals:[25935 (25KB)]} (61.4% live, created at 0)
8383

@@ -93,7 +93,7 @@ modified version edit:
9393
del-blob-file: B000012 000012
9494
current blob file set:
9595
CurrentBlobFileSet:
96-
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, Count: 0}
96+
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, BackingValueSize: 0, Count: 0}
9797
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 0}
9898

9999
applyAndUpdateVersionEdit
@@ -106,7 +106,7 @@ modified version edit:
106106
add-blob-file: B000017 physical:{000017 size:[20535 (20KB)] vals:[25935 (25KB)]}
107107
current blob file set:
108108
CurrentBlobFileSet:
109-
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 25935, Count: 1}
109+
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 25935, BackingValueSize: 25935, Count: 1}
110110
Counts:{FullyReferenced: 1, Eligible: 0, TooRecent: 0}
111111

112112
applyAndUpdateVersionEdit
@@ -119,7 +119,7 @@ modified version edit:
119119
add-table: L4 000018:[d#1,SET-e#1,SET] seqnums:[0-0] points:[d#1,SET-e#1,SET] blobrefs:[(B000017: 15935); depth:1]
120120
current blob file set:
121121
CurrentBlobFileSet:
122-
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 15935, Count: 1}
122+
Files:{Count: 1, Size: 20535, ValueSize: 25935}, References:{ValueSize: 15935, BackingValueSize: 15935, Count: 1}
123123
Counts:{FullyReferenced: 0, Eligible: 1, TooRecent: 0}
124124
NextRewrite: B000017 physical:{000017 size:[20535 (20KB)] vals:[25935 (25KB)]} (61.4% live, created at 0)
125125

@@ -139,15 +139,15 @@ modified version edit:
139139
del-blob-file: B000017 000017
140140
current blob file set:
141141
CurrentBlobFileSet:
142-
Files:{Count: 1, Size: 10535, ValueSize: 15935}, References:{ValueSize: 15935, Count: 1}
142+
Files:{Count: 1, Size: 10535, ValueSize: 15935}, References:{ValueSize: 15935, BackingValueSize: 15935, Count: 1}
143143
Counts:{FullyReferenced: 1, Eligible: 0, TooRecent: 0}
144144

145145
# Initialize a blob file set with a minimum rewrite age of 5 seconds.
146146

147147
init rw-minimum-age=5s
148148
----
149149
CurrentBlobFileSet:
150-
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, Count: 0}
150+
Files:{Count: 0, Size: 0, ValueSize: 0}, References:{ValueSize: 0, BackingValueSize: 0, Count: 0}
151151
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 0}
152152

153153
applyAndUpdateVersionEdit
@@ -160,7 +160,7 @@ modified version edit:
160160
add-blob-file: B000002 physical:{000002 size:[1000 (1000B)] vals:[2000 (2.0KB)]}
161161
current blob file set:
162162
CurrentBlobFileSet:
163-
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 1000, Count: 1}
163+
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 1000, BackingValueSize: 1000, Count: 1}
164164
Counts:{FullyReferenced: 1, Eligible: 0, TooRecent: 0}
165165

166166
# Rewrite the referencing sstable to reduce the blob file's referenced value
@@ -176,7 +176,7 @@ modified version edit:
176176
add-table: L6 000004:[d#1,SET-e#1,SET] seqnums:[0-0] points:[d#1,SET-e#1,SET] blobrefs:[(B000002: 500); depth:1]
177177
current blob file set:
178178
CurrentBlobFileSet:
179-
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, Count: 1}
179+
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, BackingValueSize: 500, Count: 1}
180180
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 1}
181181
NextEligible: B000002 physical:{000002 size:[1000 (1000B)] vals:[2000 (2.0KB)]} (25.0% live, created at 1)
182182

@@ -190,7 +190,7 @@ modified version edit:
190190
add-table: L6 000005:[f#1,SET-g#1,SET] seqnums:[0-0] points:[f#1,SET-g#1,SET]
191191
current blob file set:
192192
CurrentBlobFileSet:
193-
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, Count: 1}
193+
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, BackingValueSize: 500, Count: 1}
194194
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 1}
195195
NextEligible: B000002 physical:{000002 size:[1000 (1000B)] vals:[2000 (2.0KB)]} (25.0% live, created at 1)
196196

@@ -202,7 +202,7 @@ modified version edit:
202202
add-table: L0 000006:[a#2,SET-b#3,SET] seqnums:[0-0] points:[a#2,SET-b#3,SET]
203203
current blob file set:
204204
CurrentBlobFileSet:
205-
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, Count: 1}
205+
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, BackingValueSize: 500, Count: 1}
206206
Counts:{FullyReferenced: 0, Eligible: 0, TooRecent: 1}
207207
NextEligible: B000002 physical:{000002 size:[1000 (1000B)] vals:[2000 (2.0KB)]} (25.0% live, created at 1)
208208

@@ -217,6 +217,6 @@ modified version edit:
217217
add-table: L6 000007:[x#9,SET-y#10,SET] seqnums:[0-0] points:[x#9,SET-y#10,SET]
218218
current blob file set:
219219
CurrentBlobFileSet:
220-
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, Count: 1}
220+
Files:{Count: 1, Size: 1000, ValueSize: 2000}, References:{ValueSize: 500, BackingValueSize: 500, Count: 1}
221221
Counts:{FullyReferenced: 0, Eligible: 1, TooRecent: 0}
222222
NextRewrite: B000002 physical:{000002 size:[1000 (1000B)] vals:[2000 (2.0KB)]} (25.0% live, created at 1)

0 commit comments

Comments
 (0)