mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
mvcc: fix rev inconsistency
Try: ./etcdctl put foo bar ./etcdctl del foo ./etcdctl compact 3 restart etcd ./etcdctl get foo mvcc: required revision has been compacted The error is unexpected when range over the head revision. Internally, we incorrectly set current revision smaller than the compacted revision when we remove all keys around compacted revision. This commit fixes the issue by recovering the current revision at least to compacted revision.
This commit is contained in:
parent
ca91f898a2
commit
f935290bbc
@ -408,6 +408,13 @@ func (s *store) restore() error {
|
||||
s.currentRev = rev
|
||||
}
|
||||
|
||||
// keys in the range [compacted revision -N, compaction] might all be deleted due to compaction.
|
||||
// the correct revision should be set to compaction revision in the case, not the largest revision
|
||||
// we have seen.
|
||||
if s.currentRev.main < s.compactMainRev {
|
||||
s.currentRev.main = s.compactMainRev
|
||||
}
|
||||
|
||||
for key, lid := range keyToLease {
|
||||
if s.le == nil {
|
||||
panic("no lessor to attach lease")
|
||||
|
@ -15,8 +15,10 @@
|
||||
package mvcc
|
||||
|
||||
import (
|
||||
"os"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/etcd/lease"
|
||||
"github.com/coreos/etcd/mvcc/backend"
|
||||
@ -93,3 +95,41 @@ func TestScheduleCompaction(t *testing.T) {
|
||||
cleanup(s, b, tmpPath)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCompactAllAndRestore(t *testing.T) {
|
||||
b, tmpPath := backend.NewDefaultTmpBackend()
|
||||
s0 := NewStore(b, &lease.FakeLessor{}, nil)
|
||||
defer os.Remove(tmpPath)
|
||||
|
||||
s0.Put([]byte("foo"), []byte("bar"), lease.NoLease)
|
||||
s0.Put([]byte("foo"), []byte("bar1"), lease.NoLease)
|
||||
s0.Put([]byte("foo"), []byte("bar2"), lease.NoLease)
|
||||
s0.DeleteRange([]byte("foo"), nil)
|
||||
|
||||
rev := s0.Rev()
|
||||
// compact all keys
|
||||
done, err := s0.Compact(rev)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
case <-time.After(10 * time.Second):
|
||||
t.Fatal("timeout waiting for compaction to finish")
|
||||
}
|
||||
|
||||
err = s0.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
s1 := NewStore(b, &lease.FakeLessor{}, nil)
|
||||
if s1.Rev() != rev {
|
||||
t.Errorf("rev = %v, want %v", s1.Rev(), rev)
|
||||
}
|
||||
_, err = s1.Range([]byte("foo"), nil, RangeOptions{})
|
||||
if err != nil {
|
||||
t.Errorf("unexpect range error %v", err)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user