util.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * SPDX-FileCopyrightText: © Hypermode Inc. <hello@hypermode.com>
  3. * SPDX-License-Identifier: Apache-2.0
  4. */
  5. package badger
  6. import (
  7. "encoding/hex"
  8. "fmt"
  9. "math/rand"
  10. "os"
  11. "time"
  12. "github.com/dgraph-io/badger/v4/table"
  13. "github.com/dgraph-io/badger/v4/y"
  14. )
  15. func (s *levelsController) validate() error {
  16. for _, l := range s.levels {
  17. if err := l.validate(); err != nil {
  18. return y.Wrap(err, "Levels Controller")
  19. }
  20. }
  21. return nil
  22. }
  23. // Check does some sanity check on one level of data or in-memory index.
  24. func (s *levelHandler) validate() error {
  25. if s.level == 0 {
  26. return nil
  27. }
  28. s.RLock()
  29. defer s.RUnlock()
  30. numTables := len(s.tables)
  31. for j := 1; j < numTables; j++ {
  32. if j >= len(s.tables) {
  33. return fmt.Errorf("Level %d, j=%d numTables=%d", s.level, j, numTables)
  34. }
  35. if y.CompareKeys(s.tables[j-1].Biggest(), s.tables[j].Smallest()) >= 0 {
  36. return fmt.Errorf(
  37. "Inter: Biggest(j-1)[%d] \n%s\n vs Smallest(j)[%d]: \n%s\n: "+
  38. "level=%d j=%d numTables=%d",
  39. s.tables[j-1].ID(), hex.Dump(s.tables[j-1].Biggest()), s.tables[j].ID(),
  40. hex.Dump(s.tables[j].Smallest()), s.level, j, numTables)
  41. }
  42. if y.CompareKeys(s.tables[j].Smallest(), s.tables[j].Biggest()) > 0 {
  43. return fmt.Errorf(
  44. "Intra: \n%s\n vs \n%s\n: level=%d j=%d numTables=%d",
  45. hex.Dump(s.tables[j].Smallest()), hex.Dump(s.tables[j].Biggest()), s.level, j, numTables)
  46. }
  47. }
  48. return nil
  49. }
  50. // func (s *KV) debugPrintMore() { s.lc.debugPrintMore() }
  51. // // debugPrintMore shows key ranges of each level.
  52. // func (s *levelsController) debugPrintMore() {
  53. // s.Lock()
  54. // defer s.Unlock()
  55. // for i := 0; i < s.kv.opt.MaxLevels; i++ {
  56. // s.levels[i].debugPrintMore()
  57. // }
  58. // }
  59. // func (s *levelHandler) debugPrintMore() {
  60. // s.RLock()
  61. // defer s.RUnlock()
  62. // s.elog.Printf("Level %d:", s.level)
  63. // for _, t := range s.tables {
  64. // y.Printf(" [%s, %s]", t.Smallest(), t.Biggest())
  65. // }
  66. // y.Printf("\n")
  67. // }
  68. // reserveFileID reserves a unique file id.
  69. func (s *levelsController) reserveFileID() uint64 {
  70. id := s.nextFileID.Add(1)
  71. return id - 1
  72. }
  73. func getIDMap(dir string) map[uint64]struct{} {
  74. fileInfos, err := os.ReadDir(dir)
  75. y.Check(err)
  76. idMap := make(map[uint64]struct{})
  77. for _, info := range fileInfos {
  78. if info.IsDir() {
  79. continue
  80. }
  81. fileID, ok := table.ParseFileID(info.Name())
  82. if !ok {
  83. continue
  84. }
  85. idMap[fileID] = struct{}{}
  86. }
  87. return idMap
  88. }
  89. func init() {
  90. rand.Seed(time.Now().UnixNano())
  91. }