feat(store/v2): Fallback to SC on queries (#19090)
This commit is contained in:
@@ -67,12 +67,21 @@ func (t *IavlTree) Commit() ([]byte, uint64, error) {
|
||||
|
||||
// GetProof returns a proof for the given key and version.
|
||||
func (t *IavlTree) GetProof(version uint64, key []byte) (*ics23.CommitmentProof, error) {
|
||||
imutableTree, err := t.tree.GetImmutable(int64(version))
|
||||
immutableTree, err := t.tree.GetImmutable(int64(version))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("failed to get immutable tree at version %d: %w", version, err)
|
||||
}
|
||||
|
||||
return imutableTree.GetProof(key)
|
||||
return immutableTree.GetProof(key)
|
||||
}
|
||||
|
||||
func (t *IavlTree) Get(version uint64, key []byte) ([]byte, error) {
|
||||
immutableTree, err := t.tree.GetImmutable(int64(version))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get immutable tree at version %d: %w", version, err)
|
||||
}
|
||||
|
||||
return immutableTree.Get(key)
|
||||
}
|
||||
|
||||
// GetLatestVersion returns the latest version of the tree.
|
||||
|
||||
@@ -57,6 +57,15 @@ func TestIavlTree(t *testing.T) {
|
||||
require.Equal(t, workingHash, commitHash)
|
||||
require.Equal(t, uint64(1), tree.GetLatestVersion())
|
||||
|
||||
// ensure we can get expected values
|
||||
bz, err := tree.Get(1, []byte("key1"))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []byte("value1"), bz)
|
||||
|
||||
bz, err = tree.Get(2, []byte("key1"))
|
||||
require.Error(t, err)
|
||||
require.Nil(t, bz)
|
||||
|
||||
// write a batch of version 2
|
||||
require.NoError(t, tree.Set([]byte("key4"), []byte("value4")))
|
||||
require.NoError(t, tree.Set([]byte("key5"), []byte("value5")))
|
||||
|
||||
@@ -255,6 +255,20 @@ func (c *CommitStore) GetProof(storeKey string, version uint64, key []byte) ([]s
|
||||
return []store.CommitmentOp{commitOp, *storeCommitmentOp}, nil
|
||||
}
|
||||
|
||||
func (c *CommitStore) Get(storeKey string, version uint64, key []byte) ([]byte, error) {
|
||||
tree, ok := c.multiTrees[storeKey]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("store %s not found", storeKey)
|
||||
}
|
||||
|
||||
bz, err := tree.Get(version, key)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get key %s from store %s: %w", key, storeKey, err)
|
||||
}
|
||||
|
||||
return bz, nil
|
||||
}
|
||||
|
||||
func (c *CommitStore) Prune(version uint64) (ferr error) {
|
||||
// prune the metadata
|
||||
batch := c.db.NewBatch()
|
||||
|
||||
@@ -17,14 +17,24 @@ type Tree interface {
|
||||
Set(key, value []byte) error
|
||||
Remove(key []byte) error
|
||||
GetLatestVersion() uint64
|
||||
|
||||
// Hash returns the hash of the latest saved version of the tree.
|
||||
Hash() []byte
|
||||
|
||||
// WorkingHash returns the working hash of the tree.
|
||||
WorkingHash() []byte
|
||||
|
||||
LoadVersion(version uint64) error
|
||||
Commit() ([]byte, uint64, error)
|
||||
SetInitialVersion(version uint64) error
|
||||
GetProof(version uint64, key []byte) (*ics23.CommitmentProof, error)
|
||||
|
||||
// Get attempts to retrieve a value from the tree for a given version.
|
||||
//
|
||||
// NOTE: This method only exists to support migration from IAVL v0/v1 to v2.
|
||||
// Once migration is complete, this method should be removed and/or not used.
|
||||
Get(version uint64, key []byte) ([]byte, error)
|
||||
|
||||
Prune(version uint64) error
|
||||
Export(version uint64) (Exporter, error)
|
||||
Import(version uint64) (Importer, error)
|
||||
|
||||
Reference in New Issue
Block a user