kvstore_compaction_test.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package storage
  2. import (
  3. "reflect"
  4. "testing"
  5. )
  6. func TestScheduleCompaction(t *testing.T) {
  7. revs := []revision{{1, 0}, {2, 0}, {3, 0}}
  8. tests := []struct {
  9. rev int64
  10. keep map[revision]struct{}
  11. wrevs []revision
  12. }{
  13. // compact at 1 and discard all history
  14. {
  15. 1,
  16. nil,
  17. revs[1:],
  18. },
  19. // compact at 3 and discard all history
  20. {
  21. 3,
  22. nil,
  23. nil,
  24. },
  25. // compact at 1 and keeps history one step earlier
  26. {
  27. 1,
  28. map[revision]struct{}{
  29. revision{main: 1}: {},
  30. },
  31. revs,
  32. },
  33. // compact at 1 and keeps history two steps earlier
  34. {
  35. 3,
  36. map[revision]struct{}{
  37. revision{main: 2}: {},
  38. revision{main: 3}: {},
  39. },
  40. revs[1:],
  41. },
  42. }
  43. for i, tt := range tests {
  44. s := newStore(tmpPath)
  45. tx := s.b.BatchTx()
  46. tx.Lock()
  47. ibytes := newRevBytes()
  48. for _, rev := range revs {
  49. revToBytes(rev, ibytes)
  50. tx.UnsafePut(keyBucketName, ibytes, []byte("bar"))
  51. }
  52. tx.Unlock()
  53. // call `s.wg.Add(1)` to match the `s.wg.Done()` call in scheduleCompaction
  54. // to avoid panic from wait group
  55. s.wg.Add(1)
  56. s.scheduleCompaction(tt.rev, tt.keep)
  57. tx.Lock()
  58. for _, rev := range tt.wrevs {
  59. revToBytes(rev, ibytes)
  60. keys, _ := tx.UnsafeRange(keyBucketName, ibytes, nil, 0)
  61. if len(keys) != 1 {
  62. t.Errorf("#%d: range on %v = %d, want 1", i, rev, len(keys))
  63. }
  64. }
  65. _, vals := tx.UnsafeRange(metaBucketName, finishedCompactKeyName, nil, 0)
  66. revToBytes(revision{main: tt.rev}, ibytes)
  67. if w := [][]byte{ibytes}; !reflect.DeepEqual(vals, w) {
  68. t.Errorf("#%d: vals on %v = %+v, want %+v", i, finishedCompactKeyName, vals, w)
  69. }
  70. tx.Unlock()
  71. cleanup(s, tmpPath)
  72. }
  73. }