mvcc/backend: add TestBackendWritebackForEach to backend_test.go
This commit is contained in:
@ -250,6 +250,56 @@ func TestBackendWriteback(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestBackendWritebackForEach checks that partially written / buffered
|
||||||
|
// data is visited in the same order as fully committed data.
|
||||||
|
func TestBackendWritebackForEach(t *testing.T) {
|
||||||
|
b, tmpPath := NewTmpBackend(time.Hour, 10000)
|
||||||
|
defer cleanup(b, tmpPath)
|
||||||
|
|
||||||
|
tx := b.BatchTx()
|
||||||
|
tx.Lock()
|
||||||
|
tx.UnsafeCreateBucket([]byte("key"))
|
||||||
|
for i := 0; i < 5; i++ {
|
||||||
|
k := []byte(fmt.Sprintf("%04d", i))
|
||||||
|
tx.UnsafePut([]byte("key"), k, []byte("bar"))
|
||||||
|
}
|
||||||
|
tx.Unlock()
|
||||||
|
|
||||||
|
// writeback
|
||||||
|
b.ForceCommit()
|
||||||
|
|
||||||
|
tx.Lock()
|
||||||
|
tx.UnsafeCreateBucket([]byte("key"))
|
||||||
|
for i := 5; i < 20; i++ {
|
||||||
|
k := []byte(fmt.Sprintf("%04d", i))
|
||||||
|
tx.UnsafePut([]byte("key"), k, []byte("bar"))
|
||||||
|
}
|
||||||
|
tx.Unlock()
|
||||||
|
|
||||||
|
seq := ""
|
||||||
|
getSeq := func(k, v []byte) error {
|
||||||
|
seq += string(k)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
rtx := b.ReadTx()
|
||||||
|
rtx.Lock()
|
||||||
|
rtx.UnsafeForEach([]byte("key"), getSeq)
|
||||||
|
rtx.Unlock()
|
||||||
|
|
||||||
|
partialSeq := seq
|
||||||
|
|
||||||
|
seq = ""
|
||||||
|
b.ForceCommit()
|
||||||
|
|
||||||
|
tx.Lock()
|
||||||
|
tx.UnsafeForEach([]byte("key"), getSeq)
|
||||||
|
tx.Unlock()
|
||||||
|
|
||||||
|
if seq != partialSeq {
|
||||||
|
t.Fatalf("expected %q, got %q", seq, partialSeq)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func cleanup(b Backend, path string) {
|
func cleanup(b Backend, path string) {
|
||||||
b.Close()
|
b.Close()
|
||||||
os.Remove(path)
|
os.Remove(path)
|
||||||
|
Reference in New Issue
Block a user