Browse Source

storage: return ErrFutureRev if rev is a future one

Yicheng Qin 10 years ago
parent
commit
93f477944b
2 changed files with 5 additions and 0 deletions
  1. 4 0
      storage/kvstore.go
  2. 1 0
      storage/kvstore_test.go

+ 4 - 0
storage/kvstore.go

@@ -24,6 +24,7 @@ var (
 
 
 	ErrTnxIDMismatch = errors.New("storage: tnx id mismatch")
 	ErrTnxIDMismatch = errors.New("storage: tnx id mismatch")
 	ErrCompacted     = errors.New("storage: required reversion has been compacted")
 	ErrCompacted     = errors.New("storage: required reversion has been compacted")
+	ErrFutureRev     = errors.New("storage: required reversion is a future reversion")
 )
 )
 
 
 type store struct {
 type store struct {
@@ -240,6 +241,9 @@ func (a *store) Equal(b *store) bool {
 
 
 // range is a keyword in Go, add Keys suffix.
 // range is a keyword in Go, add Keys suffix.
 func (s *store) rangeKeys(key, end []byte, limit, rangeRev int64) (kvs []storagepb.KeyValue, rev int64, err error) {
 func (s *store) rangeKeys(key, end []byte, limit, rangeRev int64) (kvs []storagepb.KeyValue, rev int64, err error) {
+	if rangeRev > s.currentRev.main {
+		return nil, s.currentRev.main, ErrFutureRev
+	}
 	if rangeRev <= 0 {
 	if rangeRev <= 0 {
 		rev = int64(s.currentRev.main)
 		rev = int64(s.currentRev.main)
 		if s.currentRev.sub > 0 {
 		if s.currentRev.sub > 0 {

+ 1 - 0
storage/kvstore_test.go

@@ -79,6 +79,7 @@ func TestRangeBadRev(t *testing.T) {
 	}{
 	}{
 		{2, ErrCompacted},
 		{2, ErrCompacted},
 		{3, ErrCompacted},
 		{3, ErrCompacted},
+		{4, ErrFutureRev},
 	}
 	}
 	for i, tt := range tests {
 	for i, tt := range tests {
 		_, _, err := s.Range([]byte("foo"), []byte("foo3"), 0, tt.rev)
 		_, _, err := s.Range([]byte("foo"), []byte("foo3"), 0, tt.rev)