kvstore_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package storage
  2. import (
  3. "crypto/rand"
  4. "os"
  5. "reflect"
  6. "testing"
  7. "time"
  8. "github.com/coreos/etcd/storage/storagepb"
  9. )
  10. // TODO: improve to a unit test
  11. func TestRangeLimitWhenKeyDeleted(t *testing.T) {
  12. s := newStore(tmpPath)
  13. defer os.Remove(tmpPath)
  14. s.Put([]byte("foo"), []byte("bar"))
  15. s.Put([]byte("foo1"), []byte("bar1"))
  16. s.Put([]byte("foo2"), []byte("bar2"))
  17. s.DeleteRange([]byte("foo1"), nil)
  18. kvs := []storagepb.KeyValue{
  19. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: 1, ModIndex: 1, Version: 1},
  20. {Key: []byte("foo2"), Value: []byte("bar2"), CreateIndex: 3, ModIndex: 3, Version: 1},
  21. }
  22. tests := []struct {
  23. limit int64
  24. wkvs []storagepb.KeyValue
  25. }{
  26. // no limit
  27. {0, kvs},
  28. {1, kvs[:1]},
  29. {2, kvs},
  30. {3, kvs},
  31. }
  32. for i, tt := range tests {
  33. kvs, _, err := s.Range([]byte("foo"), []byte("foo3"), tt.limit, 0)
  34. if err != nil {
  35. t.Fatalf("#%d: range error (%v)", i, err)
  36. }
  37. if !reflect.DeepEqual(kvs, tt.wkvs) {
  38. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  39. }
  40. }
  41. }
  42. func TestRestoreContinueUnfinishedCompaction(t *testing.T) {
  43. s0 := newStore(tmpPath)
  44. defer os.Remove(tmpPath)
  45. s0.Put([]byte("foo"), []byte("bar"))
  46. s0.Put([]byte("foo"), []byte("bar1"))
  47. s0.Put([]byte("foo"), []byte("bar2"))
  48. // write scheduled compaction, but not do compaction
  49. rbytes := newRevBytes()
  50. revToBytes(revision{main: 2}, rbytes)
  51. tx := s0.b.BatchTx()
  52. tx.Lock()
  53. tx.UnsafePut(metaBucketName, scheduledCompactKeyName, rbytes)
  54. tx.Unlock()
  55. s0.Close()
  56. s1 := newStore(tmpPath)
  57. s1.Restore()
  58. // wait for scheduled compaction to be finished
  59. time.Sleep(100 * time.Millisecond)
  60. if _, _, err := s1.Range([]byte("foo"), nil, 0, 2); err != ErrCompacted {
  61. t.Errorf("range on compacted rev error = %v, want %v", err, ErrCompacted)
  62. }
  63. // check the key in backend is deleted
  64. revbytes := newRevBytes()
  65. // TODO: compact should delete main=2 key too
  66. revToBytes(revision{main: 1}, revbytes)
  67. tx = s1.b.BatchTx()
  68. tx.Lock()
  69. ks, _ := tx.UnsafeRange(keyBucketName, revbytes, nil, 0)
  70. if len(ks) != 0 {
  71. t.Errorf("key for rev %+v still exists, want deleted", bytesToRev(revbytes))
  72. }
  73. tx.Unlock()
  74. }
  75. func BenchmarkStorePut(b *testing.B) {
  76. s := newStore(tmpPath)
  77. defer os.Remove(tmpPath)
  78. // prepare keys
  79. keys := make([][]byte, b.N)
  80. for i := 0; i < b.N; i++ {
  81. keys[i] = make([]byte, 64)
  82. rand.Read(keys[i])
  83. }
  84. b.ResetTimer()
  85. for i := 0; i < b.N; i++ {
  86. s.Put(keys[i], []byte("foo"))
  87. }
  88. }