From 0c5e998eba776c2a6b3bfd3bd07c9d77f3b33d67 Mon Sep 17 00:00:00 2001 From: yihuang Date: Tue, 12 Nov 2024 14:36:37 +0800 Subject: [PATCH] Problem: can't read timestamp in versiondb iterator (#1688) * Problem: can't read timestamp in versiondb iterator Solution: - add timestamp api to versiondb iterator * Update CHANGELOG.md Signed-off-by: yihuang --------- Signed-off-by: yihuang --- CHANGELOG.md | 1 + versiondb/tsrocksdb/iterator.go | 10 ++++++++-- versiondb/tsrocksdb/store.go | 4 ++-- versiondb/types.go | 10 ++++++++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b2a0fa24c..4f8d8d0f71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Improvements * [#1684](https://github.com/crypto-org-chain/cronos/pull/1684) versiondb NewKVStore accept string as store name. +* [#1688](https://github.com/crypto-org-chain/cronos/pull/1688) Add Timestamp api to versiondb iterator. *Nov 6, 2024* diff --git a/versiondb/tsrocksdb/iterator.go b/versiondb/tsrocksdb/iterator.go index 02065a9980..4b54d43f9e 100644 --- a/versiondb/tsrocksdb/iterator.go +++ b/versiondb/tsrocksdb/iterator.go @@ -3,7 +3,7 @@ package tsrocksdb import ( "bytes" - "cosmossdk.io/store/types" + "github.com/crypto-org-chain/cronos/versiondb" "github.com/linxGnu/grocksdb" ) @@ -14,7 +14,7 @@ type rocksDBIterator struct { isInvalid bool } -var _ types.Iterator = (*rocksDBIterator)(nil) +var _ versiondb.Iterator = (*rocksDBIterator)(nil) func newRocksDBIterator(source *grocksdb.Iterator, prefix, start, end []byte, isReverse bool) *rocksDBIterator { if isReverse { @@ -94,6 +94,12 @@ func (itr *rocksDBIterator) Valid() bool { return true } +// Timestamp implements Iterator. +func (itr *rocksDBIterator) Timestamp() []byte { + itr.assertIsValid() + return moveSliceToBytes(itr.source.Timestamp()) +} + // Key implements Iterator. func (itr *rocksDBIterator) Key() []byte { itr.assertIsValid() diff --git a/versiondb/tsrocksdb/store.go b/versiondb/tsrocksdb/store.go index 44f82afb2b..bf51b1c066 100644 --- a/versiondb/tsrocksdb/store.go +++ b/versiondb/tsrocksdb/store.go @@ -127,7 +127,7 @@ func (s Store) GetLatestVersion() (int64, error) { } // IteratorAtVersion implements VersionStore interface -func (s Store) IteratorAtVersion(storeKey string, start, end []byte, version *int64) (types.Iterator, error) { +func (s Store) IteratorAtVersion(storeKey string, start, end []byte, version *int64) (versiondb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { return nil, errKeyEmpty } @@ -140,7 +140,7 @@ func (s Store) IteratorAtVersion(storeKey string, start, end []byte, version *in } // ReverseIteratorAtVersion implements VersionStore interface -func (s Store) ReverseIteratorAtVersion(storeKey string, start, end []byte, version *int64) (types.Iterator, error) { +func (s Store) ReverseIteratorAtVersion(storeKey string, start, end []byte, version *int64) (versiondb.Iterator, error) { if (start != nil && len(start) == 0) || (end != nil && len(end) == 0) { return nil, errKeyEmpty } diff --git a/versiondb/types.go b/versiondb/types.go index b3940bdf93..0d17ca99f5 100644 --- a/versiondb/types.go +++ b/versiondb/types.go @@ -4,14 +4,20 @@ import ( "cosmossdk.io/store/types" ) +type Iterator interface { + types.Iterator + + Timestamp() []byte +} + // VersionStore is a versioned storage of a flat key-value pairs. // it don't need to support merkle proof, so could be implemented in a much more efficient way. // `nil` version means the latest version. type VersionStore interface { GetAtVersion(storeKey string, key []byte, version *int64) ([]byte, error) HasAtVersion(storeKey string, key []byte, version *int64) (bool, error) - IteratorAtVersion(storeKey string, start, end []byte, version *int64) (types.Iterator, error) - ReverseIteratorAtVersion(storeKey string, start, end []byte, version *int64) (types.Iterator, error) + IteratorAtVersion(storeKey string, start, end []byte, version *int64) (Iterator, error) + ReverseIteratorAtVersion(storeKey string, start, end []byte, version *int64) (Iterator, error) GetLatestVersion() (int64, error) // Persist the change set of a block,