(t *testing.T)
| 584 | } |
| 585 | |
| 586 | func TestPartialAppendToValueLog(t *testing.T) { |
| 587 | dir, err := ioutil.TempDir("", "badger-test") |
| 588 | require.NoError(t, err) |
| 589 | defer removeDir(dir) |
| 590 | |
| 591 | // Create skeleton files. |
| 592 | opts := getTestOptions(dir) |
| 593 | opts.Truncate = true |
| 594 | opts.ValueLogFileSize = 100 * 1024 * 1024 // 100Mb |
| 595 | opts.ValueThreshold = 32 |
| 596 | kv, err := Open(opts) |
| 597 | require.NoError(t, err) |
| 598 | require.NoError(t, kv.Close()) |
| 599 | |
| 600 | var ( |
| 601 | k0 = []byte("k0") |
| 602 | k1 = []byte("k1") |
| 603 | k2 = []byte("k2") |
| 604 | k3 = []byte("k3") |
| 605 | v0 = []byte("value0-01234567890123456789012012345678901234567890123") |
| 606 | v1 = []byte("value1-01234567890123456789012012345678901234567890123") |
| 607 | v2 = []byte("value2-01234567890123456789012012345678901234567890123") |
| 608 | v3 = []byte("value3-01234567890123456789012012345678901234567890123") |
| 609 | ) |
| 610 | // Values need to be long enough to actually get written to value log. |
| 611 | require.True(t, len(v3) >= kv.opt.ValueThreshold) |
| 612 | |
| 613 | // Create truncated vlog to simulate a partial append. |
| 614 | // k0 - single transaction, k1 and k2 in another transaction |
| 615 | buf := createVlog(t, []*Entry{ |
| 616 | {Key: k0, Value: v0}, |
| 617 | {Key: k1, Value: v1}, |
| 618 | {Key: k2, Value: v2}, |
| 619 | }) |
| 620 | buf = buf[:len(buf)-6] |
| 621 | require.NoError(t, ioutil.WriteFile(vlogFilePath(dir, 0), buf, 0777)) |
| 622 | |
| 623 | // Badger should now start up |
| 624 | kv, err = Open(opts) |
| 625 | require.NoError(t, err) |
| 626 | |
| 627 | require.NoError(t, kv.View(func(txn *Txn) error { |
| 628 | item, err := txn.Get(k0) |
| 629 | require.NoError(t, err) |
| 630 | require.Equal(t, v0, getItemValue(t, item)) |
| 631 | |
| 632 | _, err = txn.Get(k1) |
| 633 | require.Equal(t, ErrKeyNotFound, err) |
| 634 | _, err = txn.Get(k2) |
| 635 | require.Equal(t, ErrKeyNotFound, err) |
| 636 | return nil |
| 637 | })) |
| 638 | |
| 639 | // When K3 is set, it should be persisted after a restart. |
| 640 | txnSet(t, kv, k3, v3, 0) |
| 641 | require.NoError(t, kv.Close()) |
| 642 | kv, err = Open(opts) |
| 643 | require.NoError(t, err) |
nothing calls this directly
no test coverage detected
searching dependent graphs…