Guest User

Untitled

a guest
Feb 18th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "errors"
  5. "fmt"
  6. "github.com/prometheus/tsdb/fileutil"
  7. "os"
  8. "sort"
  9. "strconv"
  10.  
  11. kitlog "github.com/go-kit/kit/log"
  12. "github.com/prometheus/tsdb/wal"
  13. )
  14.  
  15. type segmentRef struct {
  16. name string
  17. index int
  18. }
  19.  
  20. // copied from wal.go
  21. func segments(dir string) (first, last int, err error) {
  22. refs, err := listSegments(dir)
  23. if err != nil {
  24. return 0, 0, err
  25. }
  26. if len(refs) == 0 {
  27. return -1, -1, nil
  28. }
  29. return refs[0].index, refs[len(refs)-1].index, nil
  30. }
  31.  
  32. // copied from wal.go
  33. func listSegments(dir string) (refs []segmentRef, err error) {
  34. files, err := fileutil.ReadDir(dir)
  35. if err != nil {
  36. return nil, err
  37. }
  38. var last int
  39. for _, fn := range files {
  40. k, err := strconv.Atoi(fn)
  41. if err != nil {
  42. continue
  43. }
  44. if len(refs) > 0 && k > last+1 {
  45. return nil, errors.New("segments are not sequential")
  46. }
  47. refs = append(refs, segmentRef{name: fn, index: k})
  48. last = k
  49. }
  50. sort.Slice(refs, func(i, j int) bool {
  51. return refs[i].index < refs[j].index
  52. })
  53. return refs, nil
  54. }
  55.  
  56. func main() {
  57. var err error
  58. var readErr *wal.CorruptionErr
  59. var seg *wal.Segment
  60.  
  61. first, last, err := segments("bad-data")
  62. checkErr(err)
  63.  
  64. segmentLoop:
  65. for i := first; i <= last; i++ {
  66. fmt.Println("looking for corruption in segment: ", i)
  67. seg, err = wal.OpenReadSegment(wal.SegmentName("bad-data", i))
  68. checkErr(err)
  69. reader := wal.NewReader(seg)
  70.  
  71. checkErr(err)
  72. for reader.Next() {
  73. // Nothing.
  74. }
  75. if reader.Err() != nil {
  76. fmt.Println("r.total: ", reader.Offset())
  77. fmt.Println("error: ", reader.Err())
  78. readErr = &wal.CorruptionErr{
  79. Dir: "bad-data",
  80. Segment: i,
  81. Offset: reader.Offset(),
  82. Err: reader.Err(),
  83. }
  84. // Encountered error, start repair.
  85. break segmentLoop
  86. }
  87. }
  88.  
  89. if readErr == nil {
  90. fmt.Println("no corruption in any segments")
  91. return
  92. }
  93. fmt.Printf("corruption error: %+v\n", readErr)
  94.  
  95. logger := kitlog.NewLogfmtLogger(kitlog.NewSyncWriter(os.Stdout))
  96. logger = kitlog.With(logger, "caller", kitlog.DefaultCaller)
  97. wally, err := wal.NewSize(logger, nil, "bad-data", wal.DefaultSegmentSize)
  98. checkErr(err)
  99. checkErr(wally.Repair(readErr))
  100. }
  101.  
  102. func checkErr(err error) {
  103. if err != nil {
  104. panic(err)
  105. }
  106. }
Add Comment
Please, Sign In to add comment