|
8 | 8 | "bytes"
|
9 | 9 | "fmt"
|
10 | 10 | "iter"
|
| 11 | + "maps" |
11 | 12 | "slices"
|
12 | 13 | "sort"
|
13 | 14 | "strings"
|
@@ -600,6 +601,46 @@ func (v *Version) CheckOrdering() error {
|
600 | 601 | return nil
|
601 | 602 | }
|
602 | 603 |
|
| 604 | +// validateBlobFileInvariants validates invariants around blob files. Currently |
| 605 | +// it validates that the set of BlobFileIDs referenced by the Version's tables' |
| 606 | +// blob references is exactly the same as the set of BlobFileIDs present in the |
| 607 | +// Version's blob files B-Tree. |
| 608 | +func (v *Version) validateBlobFileInvariants() error { |
| 609 | + // Collect all the blob file IDs that are referenced by the Version's |
| 610 | + // tables' blob references. |
| 611 | + var referencedFileIDs []base.BlobFileID |
| 612 | + { |
| 613 | + referencedFileIDsMap := make(map[base.BlobFileID]struct{}, v.BlobFiles.tree.Count()) |
| 614 | + for i := 0; i < len(v.Levels); i++ { |
| 615 | + for table := range v.Levels[i].All() { |
| 616 | + for _, br := range table.BlobReferences { |
| 617 | + referencedFileIDsMap[br.FileID] = struct{}{} |
| 618 | + } |
| 619 | + } |
| 620 | + } |
| 621 | + referencedFileIDs = slices.Collect(maps.Keys(referencedFileIDsMap)) |
| 622 | + slices.Sort(referencedFileIDs) |
| 623 | + } |
| 624 | + |
| 625 | + // Collect all the blob file IDs that are present in the Version's blob |
| 626 | + // files B-Tree. |
| 627 | + var versionBlobFileIDs []base.BlobFileID |
| 628 | + { |
| 629 | + versionBlobFileIDsMap := make(map[base.BlobFileID]struct{}, v.BlobFiles.tree.Count()) |
| 630 | + for bf := range v.BlobFiles.All() { |
| 631 | + versionBlobFileIDsMap[bf.FileID] = struct{}{} |
| 632 | + } |
| 633 | + versionBlobFileIDs = slices.Collect(maps.Keys(versionBlobFileIDsMap)) |
| 634 | + slices.Sort(versionBlobFileIDs) |
| 635 | + } |
| 636 | + |
| 637 | + if !slices.Equal(referencedFileIDs, versionBlobFileIDs) { |
| 638 | + return base.AssertionFailedf("divergence between referenced BlobFileIDs and Version's BlobFiles B-Tree: %v vs %v", |
| 639 | + referencedFileIDs, versionBlobFileIDs) |
| 640 | + } |
| 641 | + return nil |
| 642 | +} |
| 643 | + |
603 | 644 | // VersionList holds a list of versions. The versions are ordered from oldest
|
604 | 645 | // to newest.
|
605 | 646 | type VersionList struct {
|
|
0 commit comments