@@ -67,7 +67,7 @@ import (
67
67
// - ingestion fails, calls Unprotect(B1). B1 is now Unused() and the next
68
68
// version (applied by whatever next operation is) will remove B1.
69
69
type VirtualBackings struct {
70
- m map [base.DiskFileNum ]backingWithMetadata
70
+ m map [base.DiskFileNum ]* backingWithMetadata
71
71
72
72
// unused are all the backings in m that are not inUse(). Used for
73
73
// implementing Unused() efficiently.
@@ -79,7 +79,7 @@ type VirtualBackings struct {
79
79
// MakeVirtualBackings returns empty initialized VirtualBackings.
80
80
func MakeVirtualBackings () VirtualBackings {
81
81
return VirtualBackings {
82
- m : make (map [base.DiskFileNum ]backingWithMetadata ),
82
+ m : make (map [base.DiskFileNum ]* backingWithMetadata ),
83
83
unused : make (map [* TableBacking ]struct {}),
84
84
}
85
85
}
@@ -108,7 +108,7 @@ func (bv *VirtualBackings) AddAndRef(backing *TableBacking) {
108
108
// We take a reference on the backing because in case of protected backings
109
109
// (see Protect), we might be the only ones holding on to a backing.
110
110
backing .Ref ()
111
- bv .mustAdd (backingWithMetadata {
111
+ bv .mustAdd (& backingWithMetadata {
112
112
backing : backing ,
113
113
virtualTables : make (map [base.TableNum ]* TableMetadata ),
114
114
})
@@ -147,8 +147,10 @@ func (bv *VirtualBackings) AddTable(m *TableMetadata) {
147
147
delete (bv .unused , v .backing )
148
148
}
149
149
v .virtualizedSize += m .Size
150
+ if _ , ok := v .virtualTables [m .TableNum ]; ok {
151
+ panic (errors .AssertionFailedf ("table %s already uses backing %s" , m .TableNum , v .backing .DiskFileNum ))
152
+ }
150
153
v .virtualTables [m .TableNum ] = m
151
- bv .m [m .TableBacking .DiskFileNum ] = v
152
154
}
153
155
154
156
// RemoveTable is used when a table using a backing is removed. The backing is
@@ -161,7 +163,6 @@ func (bv *VirtualBackings) RemoveTable(backing base.DiskFileNum, table base.Tabl
161
163
}
162
164
delete (v .virtualTables , table )
163
165
v .virtualizedSize -= t .Size
164
- bv .m [backing ] = v
165
166
if ! v .inUse () {
166
167
bv .unused [v .backing ] = struct {}{}
167
168
}
@@ -178,7 +179,6 @@ func (bv *VirtualBackings) Protect(n base.DiskFileNum) {
178
179
delete (bv .unused , v .backing )
179
180
}
180
181
v .protectionCount ++
181
- bv .m [n ] = v
182
182
}
183
183
184
184
// Unprotect reverses a Protect call.
@@ -189,7 +189,6 @@ func (bv *VirtualBackings) Unprotect(n base.DiskFileNum) {
189
189
panic (errors .AssertionFailedf ("invalid protectionCount" ))
190
190
}
191
191
v .protectionCount --
192
- bv .m [n ] = v
193
192
if ! v .inUse () {
194
193
bv .unused [v .backing ] = struct {}{}
195
194
}
@@ -292,15 +291,15 @@ func (bv *VirtualBackings) String() string {
292
291
return buf .String ()
293
292
}
294
293
295
- func (bv * VirtualBackings ) mustAdd (v backingWithMetadata ) {
294
+ func (bv * VirtualBackings ) mustAdd (v * backingWithMetadata ) {
296
295
_ , ok := bv .m [v .backing .DiskFileNum ]
297
296
if ok {
298
297
panic ("pebble: trying to add an existing file backing" )
299
298
}
300
299
bv .m [v .backing .DiskFileNum ] = v
301
300
}
302
301
303
- func (bv * VirtualBackings ) mustGet (n base.DiskFileNum ) backingWithMetadata {
302
+ func (bv * VirtualBackings ) mustGet (n base.DiskFileNum ) * backingWithMetadata {
304
303
v , ok := bv .m [n ]
305
304
if ! ok {
306
305
panic (fmt .Sprintf ("unknown backing %s" , n ))
0 commit comments