kvstore_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. package storage
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "os"
  6. "reflect"
  7. "testing"
  8. "github.com/coreos/etcd/storage/storagepb"
  9. )
  10. func TestRange(t *testing.T) {
  11. s := newStore("test")
  12. defer os.Remove("test")
  13. s.Put([]byte("foo"), []byte("bar"))
  14. s.Put([]byte("foo1"), []byte("bar1"))
  15. s.Put([]byte("foo2"), []byte("bar2"))
  16. kvs := []storagepb.KeyValue{
  17. {Key: []byte("foo"), Value: []byte("bar")},
  18. {Key: []byte("foo1"), Value: []byte("bar1")},
  19. {Key: []byte("foo2"), Value: []byte("bar2")},
  20. }
  21. tests := []struct {
  22. key, end []byte
  23. rev int64
  24. wrev int64
  25. wkvs []storagepb.KeyValue
  26. }{
  27. {
  28. []byte("foo"), []byte("foo3"), 0,
  29. 3, kvs,
  30. },
  31. {
  32. []byte("foo"), []byte("foo1"), 0,
  33. 3, kvs[:1],
  34. },
  35. {
  36. []byte("foo"), []byte("foo3"), 1,
  37. 1, kvs[:1],
  38. },
  39. {
  40. []byte("foo"), []byte("foo3"), 2,
  41. 2, kvs[:2],
  42. },
  43. }
  44. for i, tt := range tests {
  45. kvs, rev, err := s.Range(tt.key, tt.end, 0, tt.rev)
  46. if err != nil {
  47. t.Fatal(err)
  48. }
  49. if rev != tt.wrev {
  50. t.Errorf("#%d: rev = %d, want %d", i, tt.rev, tt.wrev)
  51. }
  52. if !reflect.DeepEqual(kvs, tt.wkvs) {
  53. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  54. }
  55. }
  56. }
  57. func TestRangeBadRev(t *testing.T) {
  58. s := newStore("test")
  59. defer os.Remove("test")
  60. s.Put([]byte("foo"), []byte("bar"))
  61. s.Put([]byte("foo1"), []byte("bar1"))
  62. s.Put([]byte("foo2"), []byte("bar2"))
  63. if err := s.Compact(3); err != nil {
  64. t.Fatalf("compact error (%v)", err)
  65. }
  66. tests := []struct {
  67. rev int64
  68. werr error
  69. }{
  70. {2, ErrCompacted},
  71. {3, ErrCompacted},
  72. {4, ErrFutureRev},
  73. }
  74. for i, tt := range tests {
  75. _, _, err := s.Range([]byte("foo"), []byte("foo3"), 0, tt.rev)
  76. if err != tt.werr {
  77. t.Errorf("#%d: error = %v, want %v", i, err, tt.werr)
  78. }
  79. }
  80. }
  81. func TestRangeLimit(t *testing.T) {
  82. s := newStore("test")
  83. defer os.Remove("test")
  84. s.Put([]byte("foo"), []byte("bar"))
  85. s.Put([]byte("foo1"), []byte("bar1"))
  86. s.Put([]byte("foo2"), []byte("bar2"))
  87. s.DeleteRange([]byte("foo1"), nil)
  88. kvs := []storagepb.KeyValue{
  89. {Key: []byte("foo"), Value: []byte("bar")},
  90. {Key: []byte("foo2"), Value: []byte("bar2")},
  91. }
  92. tests := []struct {
  93. limit int64
  94. wkvs []storagepb.KeyValue
  95. }{
  96. // no limit
  97. {0, kvs},
  98. {1, kvs[:1]},
  99. {2, kvs},
  100. {3, kvs},
  101. }
  102. for i, tt := range tests {
  103. kvs, _, err := s.Range([]byte("foo"), []byte("foo3"), tt.limit, 0)
  104. if err != nil {
  105. t.Fatalf("#%d: range error (%v)", i, err)
  106. }
  107. if !reflect.DeepEqual(kvs, tt.wkvs) {
  108. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  109. }
  110. }
  111. }
  112. func TestSimpleDeleteRange(t *testing.T) {
  113. tests := []struct {
  114. key, end []byte
  115. wrev int64
  116. wN int64
  117. }{
  118. {
  119. []byte("foo"), []byte("foo1"),
  120. 4, 1,
  121. },
  122. {
  123. []byte("foo"), []byte("foo2"),
  124. 4, 2,
  125. },
  126. {
  127. []byte("foo"), []byte("foo3"),
  128. 4, 3,
  129. },
  130. {
  131. []byte("foo3"), []byte("foo8"),
  132. 3, 0,
  133. },
  134. }
  135. for i, tt := range tests {
  136. s := newStore("test")
  137. s.Put([]byte("foo"), []byte("bar"))
  138. s.Put([]byte("foo1"), []byte("bar1"))
  139. s.Put([]byte("foo2"), []byte("bar2"))
  140. n, rev := s.DeleteRange(tt.key, tt.end)
  141. if n != tt.wN {
  142. t.Errorf("#%d: n = %d, want %d", i, n, tt.wN)
  143. }
  144. if rev != tt.wrev {
  145. t.Errorf("#%d: rev = %d, wang %d", i, rev, tt.wrev)
  146. }
  147. os.Remove("test")
  148. }
  149. }
  150. func TestRangeInSequence(t *testing.T) {
  151. s := newStore("test")
  152. defer os.Remove("test")
  153. s.Put([]byte("foo"), []byte("bar"))
  154. s.Put([]byte("foo1"), []byte("bar1"))
  155. s.Put([]byte("foo2"), []byte("bar2"))
  156. // remove foo
  157. n, rev := s.DeleteRange([]byte("foo"), nil)
  158. if n != 1 || rev != 4 {
  159. t.Fatalf("n = %d, index = %d, want (%d, %d)", n, rev, 1, 4)
  160. }
  161. // before removal foo
  162. kvs, rev, err := s.Range([]byte("foo"), []byte("foo3"), 0, 3)
  163. if err != nil {
  164. t.Fatal(err)
  165. }
  166. if len(kvs) != 3 {
  167. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 3)
  168. }
  169. // after removal foo
  170. kvs, rev, err = s.Range([]byte("foo"), []byte("foo3"), 0, 4)
  171. if err != nil {
  172. t.Fatal(err)
  173. }
  174. if len(kvs) != 2 {
  175. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 2)
  176. }
  177. // remove again -> expect nothing
  178. n, rev = s.DeleteRange([]byte("foo"), nil)
  179. if n != 0 || rev != 4 {
  180. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 0, 4)
  181. }
  182. // remove foo1
  183. n, rev = s.DeleteRange([]byte("foo"), []byte("foo2"))
  184. if n != 1 || rev != 5 {
  185. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 5)
  186. }
  187. // after removal foo1
  188. kvs, rev, err = s.Range([]byte("foo"), []byte("foo3"), 0, 5)
  189. if err != nil {
  190. t.Fatal(err)
  191. }
  192. if len(kvs) != 1 {
  193. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 1)
  194. }
  195. // remove foo2
  196. n, rev = s.DeleteRange([]byte("foo2"), []byte("foo3"))
  197. if n != 1 || rev != 6 {
  198. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 6)
  199. }
  200. // after removal foo2
  201. kvs, rev, err = s.Range([]byte("foo"), []byte("foo3"), 0, 6)
  202. if err != nil {
  203. t.Fatal(err)
  204. }
  205. if len(kvs) != 0 {
  206. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 0)
  207. }
  208. }
  209. func TestOneTnx(t *testing.T) {
  210. s := newStore("test")
  211. defer os.Remove("test")
  212. id := s.TnxBegin()
  213. for i := 0; i < 3; i++ {
  214. s.TnxPut(id, []byte("foo"), []byte("bar"))
  215. s.TnxPut(id, []byte("foo1"), []byte("bar1"))
  216. s.TnxPut(id, []byte("foo2"), []byte("bar2"))
  217. // remove foo
  218. n, rev, err := s.TnxDeleteRange(id, []byte("foo"), nil)
  219. if err != nil {
  220. t.Fatal(err)
  221. }
  222. if n != 1 || rev != 1 {
  223. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 1)
  224. }
  225. kvs, rev, err := s.TnxRange(id, []byte("foo"), []byte("foo3"), 0, 0)
  226. if err != nil {
  227. t.Fatal(err)
  228. }
  229. if len(kvs) != 2 {
  230. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 2)
  231. }
  232. // remove again -> expect nothing
  233. n, rev, err = s.TnxDeleteRange(id, []byte("foo"), nil)
  234. if err != nil {
  235. t.Fatal(err)
  236. }
  237. if n != 0 || rev != 1 {
  238. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 0, 1)
  239. }
  240. // remove foo1
  241. n, rev, err = s.TnxDeleteRange(id, []byte("foo"), []byte("foo2"))
  242. if err != nil {
  243. t.Fatal(err)
  244. }
  245. if n != 1 || rev != 1 {
  246. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 1)
  247. }
  248. // after removal foo1
  249. kvs, rev, err = s.TnxRange(id, []byte("foo"), []byte("foo3"), 0, 0)
  250. if err != nil {
  251. t.Fatal(err)
  252. }
  253. if len(kvs) != 1 {
  254. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 1)
  255. }
  256. // remove foo2
  257. n, rev, err = s.TnxDeleteRange(id, []byte("foo2"), []byte("foo3"))
  258. if err != nil {
  259. t.Fatal(err)
  260. }
  261. if n != 1 || rev != 1 {
  262. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 1)
  263. }
  264. // after removal foo2
  265. kvs, rev, err = s.TnxRange(id, []byte("foo"), []byte("foo3"), 0, 0)
  266. if err != nil {
  267. t.Fatal(err)
  268. }
  269. if len(kvs) != 0 {
  270. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 0)
  271. }
  272. }
  273. err := s.TnxEnd(id)
  274. if err != nil {
  275. t.Fatal(err)
  276. }
  277. // After tnx
  278. kvs, rev, err := s.Range([]byte("foo"), []byte("foo3"), 0, 1)
  279. if err != nil {
  280. t.Fatal(err)
  281. }
  282. if len(kvs) != 0 {
  283. t.Fatalf("len(kvs) = %d, want %d", len(kvs), 0)
  284. }
  285. if rev != 1 {
  286. t.Fatalf("rev = %d, want %d", rev, 1)
  287. }
  288. }
  289. func TestCompaction(t *testing.T) {
  290. s := newStore("test")
  291. defer os.Remove("test")
  292. s.Put([]byte("foo"), []byte("bar"))
  293. s.Put([]byte("foo1"), []byte("bar1"))
  294. s.Put([]byte("foo2"), []byte("bar2"))
  295. s.Put([]byte("foo"), []byte("bar11"))
  296. s.Put([]byte("foo1"), []byte("bar12"))
  297. s.Put([]byte("foo2"), []byte("bar13"))
  298. s.Put([]byte("foo1"), []byte("bar14"))
  299. s.DeleteRange([]byte("foo"), []byte("foo200"))
  300. s.Put([]byte("foo4"), []byte("bar4"))
  301. err := s.Compact(4)
  302. if err != nil {
  303. t.Errorf("unexpect compact error %v", err)
  304. }
  305. err = s.Compact(4)
  306. if err != ErrCompacted {
  307. t.Errorf("err = %v, want %v", err, ErrCompacted)
  308. }
  309. _, _, err = s.Range([]byte("foo"), nil, 0, 4)
  310. if err != ErrCompacted {
  311. t.Errorf("err = %v, want %v", err, ErrCompacted)
  312. }
  313. // compact should not compact the last value of foo
  314. kvs, rev, err := s.Range([]byte("foo"), nil, 0, 5)
  315. if err != nil {
  316. t.Errorf("unexpected range error %v", err)
  317. }
  318. if !bytes.Equal(kvs[0].Value, []byte("bar11")) {
  319. t.Errorf("value = %s, want %s", string(kvs[0].Value), "bar11")
  320. }
  321. if rev != 5 {
  322. t.Errorf("rev = %d, want %d", rev, 5)
  323. }
  324. // compact everything
  325. err = s.Compact(8)
  326. if err != nil {
  327. t.Errorf("unexpect compact error %v", err)
  328. }
  329. kvs, rev, err = s.Range([]byte("foo"), []byte("fop"), 0, 0)
  330. if err != nil {
  331. t.Errorf("unexpected range error %v", err)
  332. }
  333. if len(kvs) != 1 {
  334. t.Errorf("len(kvs) = %d, want %d", len(kvs), 1)
  335. }
  336. if !bytes.Equal(kvs[0].Value, []byte("bar4")) {
  337. t.Errorf("value = %s, want %s", string(kvs[0].Value), "bar4")
  338. }
  339. if rev != 9 {
  340. t.Errorf("rev = %d, want %d", rev, 9)
  341. }
  342. }
  343. // TODO: test more complicated cases:
  344. // with unfinished compaction
  345. // with removed keys
  346. func TestRestore(t *testing.T) {
  347. s0 := newStore("test")
  348. defer os.Remove("test")
  349. s0.Put([]byte("foo"), []byte("bar"))
  350. s0.Put([]byte("foo1"), []byte("bar1"))
  351. s0.Put([]byte("foo2"), []byte("bar2"))
  352. s0.Put([]byte("foo"), []byte("bar11"))
  353. s0.Put([]byte("foo1"), []byte("bar12"))
  354. s0.Put([]byte("foo2"), []byte("bar13"))
  355. s0.Put([]byte("foo1"), []byte("bar14"))
  356. s0.Close()
  357. s1 := newStore("test")
  358. s1.Restore()
  359. if !s0.Equal(s1) {
  360. t.Errorf("not equal!")
  361. }
  362. }
  363. func BenchmarkStorePut(b *testing.B) {
  364. s := newStore("test")
  365. defer os.Remove("test")
  366. // prepare keys
  367. keys := make([][]byte, b.N)
  368. for i := 0; i < b.N; i++ {
  369. keys[i] = make([]byte, 64)
  370. rand.Read(keys[i])
  371. }
  372. b.ResetTimer()
  373. for i := 0; i < b.N; i++ {
  374. s.Put(keys[i], []byte("foo"))
  375. }
  376. }