mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
mvcc: test restore and deletes with small chunk sizes
This commit is contained in:
parent
ed7ef5be8b
commit
0b0b1992b8
@ -52,10 +52,10 @@ const (
|
|||||||
markedRevBytesLen = revBytesLen + 1
|
markedRevBytesLen = revBytesLen + 1
|
||||||
markBytePosition = markedRevBytesLen - 1
|
markBytePosition = markedRevBytesLen - 1
|
||||||
markTombstone byte = 't'
|
markTombstone byte = 't'
|
||||||
|
|
||||||
restoreChunkKeys = 10000
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var restoreChunkKeys = 10000 // non-const for testing
|
||||||
|
|
||||||
// ConsistentIndexGetter is an interface that wraps the Get method.
|
// ConsistentIndexGetter is an interface that wraps the Get method.
|
||||||
// Consistent index is the offset of an entry in a consistent replicated log.
|
// Consistent index is the offset of an entry in a consistent replicated log.
|
||||||
type ConsistentIndexGetter interface {
|
type ConsistentIndexGetter interface {
|
||||||
@ -280,7 +280,7 @@ func (s *store) restore() error {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
for {
|
for {
|
||||||
keys, vals := tx.UnsafeRange(keyBucketName, min, max, restoreChunkKeys)
|
keys, vals := tx.UnsafeRange(keyBucketName, min, max, int64(restoreChunkKeys))
|
||||||
if len(keys) == 0 {
|
if len(keys) == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,9 @@ package mvcc
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
|
mrand "math/rand"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
@ -408,6 +410,56 @@ func TestStoreRestore(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRestoreDelete(t *testing.T) {
|
||||||
|
oldChunk := restoreChunkKeys
|
||||||
|
restoreChunkKeys = mrand.Intn(3) + 2
|
||||||
|
defer func() { restoreChunkKeys = oldChunk }()
|
||||||
|
|
||||||
|
b, tmpPath := backend.NewDefaultTmpBackend()
|
||||||
|
s := NewStore(b, &lease.FakeLessor{}, nil)
|
||||||
|
defer os.Remove(tmpPath)
|
||||||
|
|
||||||
|
keys := make(map[string]struct{})
|
||||||
|
for i := 0; i < 20; i++ {
|
||||||
|
ks := fmt.Sprintf("foo-%d", i)
|
||||||
|
k := []byte(ks)
|
||||||
|
s.Put(k, []byte("bar"), lease.NoLease)
|
||||||
|
keys[ks] = struct{}{}
|
||||||
|
switch mrand.Intn(3) {
|
||||||
|
case 0:
|
||||||
|
// put random key from past via random range on map
|
||||||
|
ks = fmt.Sprintf("foo-%d", mrand.Intn(i+1))
|
||||||
|
s.Put([]byte(ks), []byte("baz"), lease.NoLease)
|
||||||
|
keys[ks] = struct{}{}
|
||||||
|
case 1:
|
||||||
|
// delete random key via random range on map
|
||||||
|
for k := range keys {
|
||||||
|
s.DeleteRange([]byte(k), nil)
|
||||||
|
delete(keys, k)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s.Close()
|
||||||
|
|
||||||
|
s = NewStore(b, &lease.FakeLessor{}, nil)
|
||||||
|
defer s.Close()
|
||||||
|
for i := 0; i < 20; i++ {
|
||||||
|
ks := fmt.Sprintf("foo-%d", i)
|
||||||
|
r, err := s.Range([]byte(ks), nil, RangeOptions{})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if _, ok := keys[ks]; ok {
|
||||||
|
if len(r.KVs) == 0 {
|
||||||
|
t.Errorf("#%d: expected %q, got deleted", i, ks)
|
||||||
|
}
|
||||||
|
} else if len(r.KVs) != 0 {
|
||||||
|
t.Errorf("#%d: expected deleted, got %q", i, ks)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRestoreContinueUnfinishedCompaction(t *testing.T) {
|
func TestRestoreContinueUnfinishedCompaction(t *testing.T) {
|
||||||
b, tmpPath := backend.NewDefaultTmpBackend()
|
b, tmpPath := backend.NewDefaultTmpBackend()
|
||||||
s0 := NewStore(b, &lease.FakeLessor{}, nil)
|
s0 := NewStore(b, &lease.FakeLessor{}, nil)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user