func (gc *localstoreCompactor) getAllVersions(k kv.Key) ([]kv.EncodedKey, error) { startKey := MvccEncodeVersionKey(k, kv.MaxVersion) endKey := MvccEncodeVersionKey(k, kv.MinVersion) it, err := gc.db.Seek(startKey) if err != nil { return nil, errors.Trace(err) } defer it.Release() var ret []kv.EncodedKey for it.Next() { if kv.EncodedKey(it.Key()).Cmp(endKey) < 0 { ret = append(ret, bytes.CloneBytes(kv.EncodedKey(it.Key()))) } } return ret, nil }
func (s *dbSnapshot) MvccGet(k kv.Key, ver kv.Version) ([]byte, error) { // engine Snapshot return nil, nil for value not found, // so here we will check nil and return kv.ErrNotExist. // get newest version, (0, MaxUint64) // Key arrangement: // Key -> META // ... // Key_ver // Key_ver-1 // Key_ver-2 // ... // Key_ver-n // Key_0 // NextKey -> META // NextKey_xxx startKey := MvccEncodeVersionKey(k, ver) endKey := MvccEncodeVersionKey(k, kv.MinVersion) // get raw iterator it, err := s.db.Seek(startKey) if err != nil { return nil, errors.Trace(err) } defer it.Release() var rawKey []byte var v []byte if it.Next() { // If scan exceed this key's all versions // it.Key() > endKey. if kv.EncodedKey(it.Key()).Cmp(endKey) < 0 { // Check newest version of this key. // If it's tombstone, just skip it. if !isTombstone(it.Value()) { rawKey = it.Key() v = it.Value() } } } // No such key (or it's tombstone). if rawKey == nil { return nil, kv.ErrNotExist } return v, nil }
func (s *dbSnapshot) MvccGet(k kv.Key, ver kv.Version) ([]byte, error) { // engine Snapshot return nil, nil for value not found, // so here we will check nil and return kv.ErrNotExist. // get newest version, (0, MaxUint64) // Key arrangement: // Key -> META // ... // Key_ver // Key_ver-1 // Key_ver-2 // ... // Key_ver-n // Key_0 // NextKey -> META // NextKey_xxx startKey := MvccEncodeVersionKey(k, ver) endKey := MvccEncodeVersionKey(k, kv.MinVersion) it, err := s.internalSeek(startKey) if err != nil { return nil, errors.Trace(err) } var rawKey []byte var v []byte // Check if the scan is not exceed this key's all versions and the value is not // tombstone. if kv.EncodedKey(it.Key()).Cmp(endKey) < 0 && !isTombstone(it.Value()) { rawKey = it.Key() v = it.Value() } // No such key (or it's tombstone). if rawKey == nil { return nil, kv.ErrNotExist } return bytes.CloneBytes(v), nil }