@@ -100,7 +100,7 @@ type backingWithMetadata struct {
100
100
101
101
// virtualTables is the list of virtual tables that use this backing.
102
102
// AddTable/RemoveTable maintain this map.
103
- virtualTables map [base.TableNum ]* TableMetadata
103
+ virtualTables map [base.TableNum ]tableAndLevel
104
104
heapIndex int
105
105
}
106
106
@@ -120,7 +120,7 @@ func (bv *VirtualBackings) AddAndRef(backing *TableBacking) {
120
120
backing .Ref ()
121
121
bm := & backingWithMetadata {
122
122
backing : backing ,
123
- virtualTables : make (map [base.TableNum ]* TableMetadata ),
123
+ virtualTables : make (map [base.TableNum ]tableAndLevel ),
124
124
heapIndex : - 1 ,
125
125
}
126
126
bv .mustAdd (bm )
@@ -150,7 +150,7 @@ func (bv *VirtualBackings) Remove(n base.DiskFileNum) {
150
150
151
151
// AddTable is used when a new table is using an existing backing. The backing
152
152
// must be in the set already.
153
- func (bv * VirtualBackings ) AddTable (m * TableMetadata ) {
153
+ func (bv * VirtualBackings ) AddTable (m * TableMetadata , level int ) {
154
154
if ! m .Virtual {
155
155
panic (errors .AssertionFailedf ("table %s not virtual" , m .TableNum ))
156
156
}
@@ -162,7 +162,10 @@ func (bv *VirtualBackings) AddTable(m *TableMetadata) {
162
162
delete (bv .unused , v .backing )
163
163
}
164
164
v .virtualizedSize += m .Size
165
- v .virtualTables [m .TableNum ] = m
165
+ v .virtualTables [m .TableNum ] = tableAndLevel {
166
+ meta : m ,
167
+ level : level ,
168
+ }
166
169
// Update candidates heap.
167
170
if v .heapIndex == - 1 {
168
171
heap .Push (& bv .rewriteCandidates , v )
@@ -180,7 +183,7 @@ func (bv *VirtualBackings) RemoveTable(backing base.DiskFileNum, table base.Tabl
180
183
panic (errors .AssertionFailedf ("table %s does not use backing %s" , table , v .backing .DiskFileNum ))
181
184
}
182
185
delete (v .virtualTables , table )
183
- v .virtualizedSize -= t .Size
186
+ v .virtualizedSize -= t .meta . Size
184
187
if ! v .inUse () {
185
188
bv .unused [v .backing ] = struct {}{}
186
189
}
@@ -295,12 +298,16 @@ func (bv *VirtualBackings) Backings() []*TableBacking {
295
298
// referenced by virtual tables to total size, along with the list of virtual
296
299
// tables that use the backing. If there are no backings in the set, nil is
297
300
// returned.
298
- func (bv * VirtualBackings ) ReplacementCandidate () (* TableBacking , []* TableMetadata ) {
301
+ func (bv * VirtualBackings ) ReplacementCandidate () (* TableBacking , [NumLevels ][ ]* TableMetadata ) {
299
302
if bv .rewriteCandidates .Len () == 0 {
300
- return nil , nil
303
+ return nil , [NumLevels ][]* TableMetadata {}
304
+ }
305
+ v := bv .rewriteCandidates .items [0 ]
306
+ var tables [NumLevels ][]* TableMetadata
307
+ for _ , tl := range v .virtualTables {
308
+ tables [tl .level ] = append (tables [tl .level ], tl .meta )
301
309
}
302
- return bv .rewriteCandidates .items [0 ].backing ,
303
- slices .Collect (maps .Values (bv .rewriteCandidates .items [0 ].virtualTables ))
310
+ return v .backing , tables
304
311
}
305
312
306
313
func (bv * VirtualBackings ) String () string {
0 commit comments