kv_test.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. package storage
  2. import (
  3. "os"
  4. "reflect"
  5. "testing"
  6. "time"
  7. "github.com/coreos/etcd/pkg/testutil"
  8. "github.com/coreos/etcd/storage/storagepb"
  9. )
  10. // Functional tests for features implemented in v3 store. It treats v3 store
  11. // as a black box, and tests it by feeding the input and validating the output.
  12. // TODO: add similar tests on operations in one txn/rev
  13. type (
  14. rangeFunc func(kv KV, key, end []byte, limit, rangeRev int64) ([]storagepb.KeyValue, int64, error)
  15. putFunc func(kv KV, key, value []byte) int64
  16. deleteRangeFunc func(kv KV, key, end []byte) (n, rev int64)
  17. )
  18. var (
  19. normalRangeFunc = func(kv KV, key, end []byte, limit, rangeRev int64) ([]storagepb.KeyValue, int64, error) {
  20. return kv.Range(key, end, limit, rangeRev)
  21. }
  22. txnRangeFunc = func(kv KV, key, end []byte, limit, rangeRev int64) ([]storagepb.KeyValue, int64, error) {
  23. id := kv.TxnBegin()
  24. defer kv.TxnEnd(id)
  25. return kv.TxnRange(id, key, end, limit, rangeRev)
  26. }
  27. normalPutFunc = func(kv KV, key, value []byte) int64 {
  28. return kv.Put(key, value)
  29. }
  30. txnPutFunc = func(kv KV, key, value []byte) int64 {
  31. id := kv.TxnBegin()
  32. defer kv.TxnEnd(id)
  33. rev, err := kv.TxnPut(id, key, value)
  34. if err != nil {
  35. panic("txn put error")
  36. }
  37. return rev
  38. }
  39. normalDeleteRangeFunc = func(kv KV, key, end []byte) (n, rev int64) {
  40. return kv.DeleteRange(key, end)
  41. }
  42. txnDeleteRangeFunc = func(kv KV, key, end []byte) (n, rev int64) {
  43. id := kv.TxnBegin()
  44. defer kv.TxnEnd(id)
  45. n, rev, err := kv.TxnDeleteRange(id, key, end)
  46. if err != nil {
  47. panic("txn delete error")
  48. }
  49. return n, rev
  50. }
  51. )
  52. func TestKVRange(t *testing.T) { testKVRange(t, normalRangeFunc) }
  53. func TestKVTxnRange(t *testing.T) { testKVRange(t, txnRangeFunc) }
  54. func testKVRange(t *testing.T, f rangeFunc) {
  55. s := New("test")
  56. defer cleanup(s, "test")
  57. s.Put([]byte("foo"), []byte("bar"))
  58. s.Put([]byte("foo1"), []byte("bar1"))
  59. s.Put([]byte("foo2"), []byte("bar2"))
  60. kvs := []storagepb.KeyValue{
  61. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: 1, ModIndex: 1, Version: 1},
  62. {Key: []byte("foo1"), Value: []byte("bar1"), CreateIndex: 2, ModIndex: 2, Version: 1},
  63. {Key: []byte("foo2"), Value: []byte("bar2"), CreateIndex: 3, ModIndex: 3, Version: 1},
  64. }
  65. wrev := int64(3)
  66. tests := []struct {
  67. key, end []byte
  68. wkvs []storagepb.KeyValue
  69. }{
  70. // get no keys
  71. {
  72. []byte("doo"), []byte("foo"),
  73. nil,
  74. },
  75. // get no keys when key == end
  76. {
  77. []byte("foo"), []byte("foo"),
  78. nil,
  79. },
  80. // get no keys when ranging single key
  81. {
  82. []byte("doo"), nil,
  83. nil,
  84. },
  85. // get all keys
  86. {
  87. []byte("foo"), []byte("foo3"),
  88. kvs,
  89. },
  90. // get partial keys
  91. {
  92. []byte("foo"), []byte("foo1"),
  93. kvs[:1],
  94. },
  95. // get single key
  96. {
  97. []byte("foo"), nil,
  98. kvs[:1],
  99. },
  100. }
  101. for i, tt := range tests {
  102. kvs, rev, err := f(s, tt.key, tt.end, 0, 0)
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. if rev != wrev {
  107. t.Errorf("#%d: rev = %d, want %d", i, rev, wrev)
  108. }
  109. if !reflect.DeepEqual(kvs, tt.wkvs) {
  110. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  111. }
  112. }
  113. }
  114. func TestKVRangeRev(t *testing.T) { testKVRangeRev(t, normalRangeFunc) }
  115. func TestKVTxnRangeRev(t *testing.T) { testKVRangeRev(t, normalRangeFunc) }
  116. func testKVRangeRev(t *testing.T, f rangeFunc) {
  117. s := New("test")
  118. defer cleanup(s, "test")
  119. s.Put([]byte("foo"), []byte("bar"))
  120. s.Put([]byte("foo1"), []byte("bar1"))
  121. s.Put([]byte("foo2"), []byte("bar2"))
  122. kvs := []storagepb.KeyValue{
  123. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: 1, ModIndex: 1, Version: 1},
  124. {Key: []byte("foo1"), Value: []byte("bar1"), CreateIndex: 2, ModIndex: 2, Version: 1},
  125. {Key: []byte("foo2"), Value: []byte("bar2"), CreateIndex: 3, ModIndex: 3, Version: 1},
  126. }
  127. tests := []struct {
  128. rev int64
  129. wrev int64
  130. wkvs []storagepb.KeyValue
  131. }{
  132. {-1, 3, kvs},
  133. {0, 3, kvs},
  134. {1, 1, kvs[:1]},
  135. {2, 2, kvs[:2]},
  136. {3, 3, kvs},
  137. }
  138. for i, tt := range tests {
  139. kvs, rev, err := f(s, []byte("foo"), []byte("foo3"), 0, tt.rev)
  140. if err != nil {
  141. t.Fatal(err)
  142. }
  143. if rev != tt.wrev {
  144. t.Errorf("#%d: rev = %d, want %d", i, rev, tt.wrev)
  145. }
  146. if !reflect.DeepEqual(kvs, tt.wkvs) {
  147. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  148. }
  149. }
  150. }
  151. func TestKVRangeBadRev(t *testing.T) { testKVRangeBadRev(t, normalRangeFunc) }
  152. func TestKVTxnRangeBadRev(t *testing.T) { testKVRangeBadRev(t, normalRangeFunc) }
  153. func testKVRangeBadRev(t *testing.T, f rangeFunc) {
  154. s := New("test")
  155. defer cleanup(s, "test")
  156. s.Put([]byte("foo"), []byte("bar"))
  157. s.Put([]byte("foo1"), []byte("bar1"))
  158. s.Put([]byte("foo2"), []byte("bar2"))
  159. if err := s.Compact(3); err != nil {
  160. t.Fatalf("compact error (%v)", err)
  161. }
  162. tests := []struct {
  163. rev int64
  164. werr error
  165. }{
  166. {-1, ErrCompacted},
  167. {2, ErrCompacted},
  168. {3, ErrCompacted},
  169. {4, ErrFutureRev},
  170. {100, ErrFutureRev},
  171. }
  172. for i, tt := range tests {
  173. _, _, err := f(s, []byte("foo"), []byte("foo3"), 0, tt.rev)
  174. if err != tt.werr {
  175. t.Errorf("#%d: error = %v, want %v", i, err, tt.werr)
  176. }
  177. }
  178. }
  179. func TestKVRangeLimit(t *testing.T) { testKVRangeLimit(t, normalRangeFunc) }
  180. func TestKVTxnRangeLimit(t *testing.T) { testKVRangeLimit(t, txnRangeFunc) }
  181. func testKVRangeLimit(t *testing.T, f rangeFunc) {
  182. s := New("test")
  183. defer cleanup(s, "test")
  184. s.Put([]byte("foo"), []byte("bar"))
  185. s.Put([]byte("foo1"), []byte("bar1"))
  186. s.Put([]byte("foo2"), []byte("bar2"))
  187. kvs := []storagepb.KeyValue{
  188. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: 1, ModIndex: 1, Version: 1},
  189. {Key: []byte("foo1"), Value: []byte("bar1"), CreateIndex: 2, ModIndex: 2, Version: 1},
  190. {Key: []byte("foo2"), Value: []byte("bar2"), CreateIndex: 3, ModIndex: 3, Version: 1},
  191. }
  192. wrev := int64(3)
  193. tests := []struct {
  194. limit int64
  195. wkvs []storagepb.KeyValue
  196. }{
  197. // no limit
  198. {-1, kvs},
  199. // no limit
  200. {0, kvs},
  201. {1, kvs[:1]},
  202. {2, kvs[:2]},
  203. {3, kvs},
  204. {100, kvs},
  205. }
  206. for i, tt := range tests {
  207. kvs, rev, err := f(s, []byte("foo"), []byte("foo3"), tt.limit, 0)
  208. if err != nil {
  209. t.Fatalf("#%d: range error (%v)", i, err)
  210. }
  211. if !reflect.DeepEqual(kvs, tt.wkvs) {
  212. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  213. }
  214. if rev != wrev {
  215. t.Errorf("#%d: rev = %d, want %d", i, rev, wrev)
  216. }
  217. }
  218. }
  219. func TestKVPutMultipleTimes(t *testing.T) { testKVPutMultipleTimes(t, normalPutFunc) }
  220. func TestKVTxnPutMultipleTimes(t *testing.T) { testKVPutMultipleTimes(t, txnPutFunc) }
  221. func testKVPutMultipleTimes(t *testing.T, f putFunc) {
  222. s := New("test")
  223. defer cleanup(s, "test")
  224. for i := 0; i < 10; i++ {
  225. base := int64(i + 1)
  226. rev := f(s, []byte("foo"), []byte("bar"))
  227. if wrev := base; rev != wrev {
  228. t.Errorf("#%d: rev = %d, want %d", i, rev, base)
  229. }
  230. kvs, _, err := s.Range([]byte("foo"), nil, 0, 0)
  231. if err != nil {
  232. t.Fatal(err)
  233. }
  234. wkvs := []storagepb.KeyValue{
  235. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: 1, ModIndex: base, Version: base},
  236. }
  237. if !reflect.DeepEqual(kvs, wkvs) {
  238. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, wkvs)
  239. }
  240. }
  241. }
  242. func TestKVDeleteRange(t *testing.T) { testKVDeleteRange(t, normalDeleteRangeFunc) }
  243. func TestKVTxnDeleteRange(t *testing.T) { testKVDeleteRange(t, txnDeleteRangeFunc) }
  244. func testKVDeleteRange(t *testing.T, f deleteRangeFunc) {
  245. tests := []struct {
  246. key, end []byte
  247. wrev int64
  248. wN int64
  249. }{
  250. {
  251. []byte("foo"), nil,
  252. 4, 1,
  253. },
  254. {
  255. []byte("foo"), []byte("foo1"),
  256. 4, 1,
  257. },
  258. {
  259. []byte("foo"), []byte("foo2"),
  260. 4, 2,
  261. },
  262. {
  263. []byte("foo"), []byte("foo3"),
  264. 4, 3,
  265. },
  266. {
  267. []byte("foo3"), []byte("foo8"),
  268. 3, 0,
  269. },
  270. {
  271. []byte("foo3"), nil,
  272. 3, 0,
  273. },
  274. }
  275. for i, tt := range tests {
  276. s := New("test")
  277. s.Put([]byte("foo"), []byte("bar"))
  278. s.Put([]byte("foo1"), []byte("bar1"))
  279. s.Put([]byte("foo2"), []byte("bar2"))
  280. n, rev := f(s, tt.key, tt.end)
  281. if n != tt.wN || rev != tt.wrev {
  282. t.Errorf("#%d: n = %d, rev = %d, want (%d, %d)", i, n, rev, tt.wN, tt.wrev)
  283. }
  284. cleanup(s, "test")
  285. }
  286. }
  287. func TestKVDeleteMultipleTimes(t *testing.T) { testKVDeleteMultipleTimes(t, normalDeleteRangeFunc) }
  288. func TestKVTxnDeleteMultipleTimes(t *testing.T) { testKVDeleteMultipleTimes(t, txnDeleteRangeFunc) }
  289. func testKVDeleteMultipleTimes(t *testing.T, f deleteRangeFunc) {
  290. s := New("test")
  291. defer cleanup(s, "test")
  292. s.Put([]byte("foo"), []byte("bar"))
  293. n, rev := f(s, []byte("foo"), nil)
  294. if n != 1 || rev != 2 {
  295. t.Fatalf("n = %d, rev = %d, want (%d, %d)", n, rev, 1, 2)
  296. }
  297. for i := 0; i < 10; i++ {
  298. n, rev := f(s, []byte("foo"), nil)
  299. if n != 0 || rev != 2 {
  300. t.Fatalf("#%d: n = %d, rev = %d, want (%d, %d)", i, n, rev, 0, 2)
  301. }
  302. }
  303. }
  304. // test that range, put, delete on single key in sequence repeatedly works correctly.
  305. func TestKVOperationInSequence(t *testing.T) {
  306. s := New("test")
  307. defer cleanup(s, "test")
  308. for i := 0; i < 10; i++ {
  309. base := int64(i * 2)
  310. // put foo
  311. rev := s.Put([]byte("foo"), []byte("bar"))
  312. if rev != base+1 {
  313. t.Errorf("#%d: put rev = %d, want %d", i, rev, base+1)
  314. }
  315. kvs, rev, err := s.Range([]byte("foo"), nil, 0, base+1)
  316. if err != nil {
  317. t.Fatal(err)
  318. }
  319. wkvs := []storagepb.KeyValue{
  320. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: base + 1, ModIndex: base + 1, Version: 1},
  321. }
  322. if !reflect.DeepEqual(kvs, wkvs) {
  323. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, wkvs)
  324. }
  325. if rev != base+1 {
  326. t.Errorf("#%d: range rev = %d, want %d", i, rev, base+1)
  327. }
  328. // delete foo
  329. n, rev := s.DeleteRange([]byte("foo"), nil)
  330. if n != 1 || rev != base+2 {
  331. t.Errorf("#%d: n = %d, rev = %d, want (%d, %d)", i, n, rev, 1, base+2)
  332. }
  333. kvs, rev, err = s.Range([]byte("foo"), nil, 0, base+2)
  334. if err != nil {
  335. t.Fatal(err)
  336. }
  337. if kvs != nil {
  338. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, nil)
  339. }
  340. if rev != base+2 {
  341. t.Errorf("#%d: range rev = %d, want %d", i, rev, base+2)
  342. }
  343. }
  344. }
  345. func TestKVTxnBlockNonTnxOperations(t *testing.T) {
  346. s := New("test")
  347. defer cleanup(s, "test")
  348. tests := []func(){
  349. func() { s.Range([]byte("foo"), nil, 0, 0) },
  350. func() { s.Put([]byte("foo"), nil) },
  351. func() { s.DeleteRange([]byte("foo"), nil) },
  352. }
  353. for i, tt := range tests {
  354. id := s.TxnBegin()
  355. done := make(chan struct{})
  356. go func() {
  357. tt()
  358. done <- struct{}{}
  359. }()
  360. select {
  361. case <-done:
  362. t.Fatalf("#%d: operation failed to be blocked", i)
  363. case <-time.After(10 * time.Millisecond):
  364. }
  365. s.TxnEnd(id)
  366. select {
  367. case <-done:
  368. case <-time.After(10 * time.Millisecond):
  369. t.Fatalf("#%d: operation failed to be unblocked", i)
  370. }
  371. }
  372. }
  373. func TestKVTxnWrongID(t *testing.T) {
  374. s := New("test")
  375. defer cleanup(s, "test")
  376. id := s.TxnBegin()
  377. wrongid := id + 1
  378. tests := []func() error{
  379. func() error {
  380. _, _, err := s.TxnRange(wrongid, []byte("foo"), nil, 0, 0)
  381. return err
  382. },
  383. func() error {
  384. _, err := s.TxnPut(wrongid, []byte("foo"), nil)
  385. return err
  386. },
  387. func() error {
  388. _, _, err := s.TxnDeleteRange(wrongid, []byte("foo"), nil)
  389. return err
  390. },
  391. func() error { return s.TxnEnd(wrongid) },
  392. }
  393. for i, tt := range tests {
  394. err := tt()
  395. if err != ErrTxnIDMismatch {
  396. t.Fatalf("#%d: err = %+v, want %+v", i, err, ErrTxnIDMismatch)
  397. }
  398. }
  399. err := s.TxnEnd(id)
  400. if err != nil {
  401. t.Fatalf("end err = %+v, want %+v", err, nil)
  402. }
  403. }
  404. // test that txn range, put, delete on single key in sequence repeatedly works correctly.
  405. func TestKVTnxOperationInSequence(t *testing.T) {
  406. s := New("test")
  407. defer cleanup(s, "test")
  408. for i := 0; i < 10; i++ {
  409. id := s.TxnBegin()
  410. base := int64(i)
  411. // put foo
  412. rev, err := s.TxnPut(id, []byte("foo"), []byte("bar"))
  413. if err != nil {
  414. t.Fatal(err)
  415. }
  416. if rev != base+1 {
  417. t.Errorf("#%d: put rev = %d, want %d", i, rev, base+1)
  418. }
  419. kvs, rev, err := s.TxnRange(id, []byte("foo"), nil, 0, base+1)
  420. if err != nil {
  421. t.Fatal(err)
  422. }
  423. wkvs := []storagepb.KeyValue{
  424. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: base + 1, ModIndex: base + 1, Version: 1},
  425. }
  426. if !reflect.DeepEqual(kvs, wkvs) {
  427. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, wkvs)
  428. }
  429. if rev != base+1 {
  430. t.Errorf("#%d: range rev = %d, want %d", i, rev, base+1)
  431. }
  432. // delete foo
  433. n, rev, err := s.TxnDeleteRange(id, []byte("foo"), nil)
  434. if err != nil {
  435. t.Fatal(err)
  436. }
  437. if n != 1 || rev != base+1 {
  438. t.Errorf("#%d: n = %d, rev = %d, want (%d, %d)", i, n, rev, 1, base+1)
  439. }
  440. kvs, rev, err = s.TxnRange(id, []byte("foo"), nil, 0, base+1)
  441. if err != nil {
  442. t.Errorf("#%d: range error (%v)", i, err)
  443. }
  444. if kvs != nil {
  445. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, nil)
  446. }
  447. if rev != base+1 {
  448. t.Errorf("#%d: range rev = %d, want %d", i, rev, base+1)
  449. }
  450. s.TxnEnd(id)
  451. }
  452. }
  453. func TestKVCompactReserveLastValue(t *testing.T) {
  454. s := New("test")
  455. defer cleanup(s, "test")
  456. s.Put([]byte("foo"), []byte("bar0"))
  457. s.Put([]byte("foo"), []byte("bar1"))
  458. s.DeleteRange([]byte("foo"), nil)
  459. s.Put([]byte("foo"), []byte("bar2"))
  460. // rev in tests will be called in Compact() one by one on the same store
  461. tests := []struct {
  462. rev int64
  463. // wanted kvs right after the compacted rev
  464. wkvs []storagepb.KeyValue
  465. }{
  466. {
  467. 0,
  468. []storagepb.KeyValue{
  469. {Key: []byte("foo"), Value: []byte("bar0"), CreateIndex: 1, ModIndex: 1, Version: 1},
  470. },
  471. },
  472. {
  473. 1,
  474. []storagepb.KeyValue{
  475. {Key: []byte("foo"), Value: []byte("bar1"), CreateIndex: 1, ModIndex: 2, Version: 2},
  476. },
  477. },
  478. {
  479. 2,
  480. nil,
  481. },
  482. {
  483. 3,
  484. []storagepb.KeyValue{
  485. {Key: []byte("foo"), Value: []byte("bar2"), CreateIndex: 4, ModIndex: 4, Version: 1},
  486. },
  487. },
  488. }
  489. for i, tt := range tests {
  490. err := s.Compact(tt.rev)
  491. if err != nil {
  492. t.Errorf("#%d: unexpect compact error %v", i, err)
  493. }
  494. kvs, _, err := s.Range([]byte("foo"), nil, 0, tt.rev+1)
  495. if err != nil {
  496. t.Errorf("#%d: unexpect range error %v", i, err)
  497. }
  498. if !reflect.DeepEqual(kvs, tt.wkvs) {
  499. t.Errorf("#%d: kvs = %+v, want %+v", i, kvs, tt.wkvs)
  500. }
  501. }
  502. }
  503. func TestKVCompactBad(t *testing.T) {
  504. s := New("test")
  505. defer cleanup(s, "test")
  506. s.Put([]byte("foo"), []byte("bar0"))
  507. s.Put([]byte("foo"), []byte("bar1"))
  508. s.Put([]byte("foo"), []byte("bar2"))
  509. // rev in tests will be called in Compact() one by one on the same store
  510. tests := []struct {
  511. rev int64
  512. werr error
  513. }{
  514. {0, nil},
  515. {1, nil},
  516. {1, ErrCompacted},
  517. {3, nil},
  518. {4, ErrFutureRev},
  519. {100, ErrFutureRev},
  520. }
  521. for i, tt := range tests {
  522. err := s.Compact(tt.rev)
  523. if err != tt.werr {
  524. t.Errorf("#%d: compact error = %v, want %v", i, err, tt.werr)
  525. }
  526. }
  527. }
  528. func TestKVRestore(t *testing.T) {
  529. tests := []func(kv KV){
  530. func(kv KV) {
  531. kv.Put([]byte("foo"), []byte("bar0"))
  532. kv.Put([]byte("foo"), []byte("bar1"))
  533. kv.Put([]byte("foo"), []byte("bar2"))
  534. },
  535. func(kv KV) {
  536. kv.Put([]byte("foo"), []byte("bar0"))
  537. kv.DeleteRange([]byte("foo"), nil)
  538. kv.Put([]byte("foo"), []byte("bar1"))
  539. },
  540. func(kv KV) {
  541. kv.Put([]byte("foo"), []byte("bar0"))
  542. kv.Put([]byte("foo"), []byte("bar1"))
  543. kv.Compact(1)
  544. },
  545. }
  546. for i, tt := range tests {
  547. s := New("test")
  548. tt(s)
  549. var kvss [][]storagepb.KeyValue
  550. for k := int64(0); k < 10; k++ {
  551. kvs, _, _ := s.Range([]byte("a"), []byte("z"), 0, k)
  552. kvss = append(kvss, kvs)
  553. }
  554. s.Close()
  555. ns := New("test")
  556. ns.Restore()
  557. // wait for possible compaction to finish
  558. testutil.WaitSchedule()
  559. var nkvss [][]storagepb.KeyValue
  560. for k := int64(0); k < 10; k++ {
  561. nkvs, _, _ := ns.Range([]byte("a"), []byte("z"), 0, k)
  562. nkvss = append(nkvss, nkvs)
  563. }
  564. cleanup(ns, "test")
  565. if !reflect.DeepEqual(nkvss, kvss) {
  566. t.Errorf("#%d: kvs history = %+v, want %+v", i, nkvss, kvss)
  567. }
  568. }
  569. }
  570. func TestKVSnapshot(t *testing.T) {
  571. s := New("test")
  572. defer cleanup(s, "test")
  573. s.Put([]byte("foo"), []byte("bar"))
  574. s.Put([]byte("foo1"), []byte("bar1"))
  575. s.Put([]byte("foo2"), []byte("bar2"))
  576. wkvs := []storagepb.KeyValue{
  577. {Key: []byte("foo"), Value: []byte("bar"), CreateIndex: 1, ModIndex: 1, Version: 1},
  578. {Key: []byte("foo1"), Value: []byte("bar1"), CreateIndex: 2, ModIndex: 2, Version: 1},
  579. {Key: []byte("foo2"), Value: []byte("bar2"), CreateIndex: 3, ModIndex: 3, Version: 1},
  580. }
  581. f, err := os.Create("new_test")
  582. if err != nil {
  583. t.Fatal(err)
  584. }
  585. _, err = s.Snapshot(f)
  586. if err != nil {
  587. t.Fatal(err)
  588. }
  589. f.Close()
  590. ns := New("new_test")
  591. defer cleanup(ns, "new_test")
  592. ns.Restore()
  593. kvs, rev, err := ns.Range([]byte("a"), []byte("z"), 0, 0)
  594. if err != nil {
  595. t.Errorf("unexpect range error (%v)", err)
  596. }
  597. if !reflect.DeepEqual(kvs, wkvs) {
  598. t.Errorf("kvs = %+v, want %+v", kvs, wkvs)
  599. }
  600. if rev != 3 {
  601. t.Errorf("rev = %d, want %d", rev, 3)
  602. }
  603. }
  604. func cleanup(s KV, path string) {
  605. s.Close()
  606. os.Remove(path)
  607. }