Add test
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This commit is contained in:
parent
be42dd824b
commit
cb0513f4c1
@ -26,10 +26,11 @@ var log = logging.Logger("statetree")
|
|||||||
|
|
||||||
// StateTree stores actors state by their ID.
|
// StateTree stores actors state by their ID.
|
||||||
type StateTree struct {
|
type StateTree struct {
|
||||||
root adt.Map
|
root adt.Map
|
||||||
version types.StateTreeVersion
|
version types.StateTreeVersion
|
||||||
info cid.Cid
|
info cid.Cid
|
||||||
Store cbor.IpldStore
|
Store cbor.IpldStore
|
||||||
|
lookupIDFun func(address.Address) (address.Address, error)
|
||||||
|
|
||||||
snaps *stateSnaps
|
snaps *stateSnaps
|
||||||
}
|
}
|
||||||
@ -173,13 +174,15 @@ func NewStateTree(cst cbor.IpldStore, ver types.StateTreeVersion) (*StateTree, e
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &StateTree{
|
s := &StateTree{
|
||||||
root: root,
|
root: root,
|
||||||
info: info,
|
info: info,
|
||||||
version: ver,
|
version: ver,
|
||||||
Store: cst,
|
Store: cst,
|
||||||
snaps: newStateSnaps(),
|
snaps: newStateSnaps(),
|
||||||
}, nil
|
}
|
||||||
|
s.lookupIDFun = s.lookupIDinternal
|
||||||
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadStateTree(cst cbor.IpldStore, c cid.Cid) (*StateTree, error) {
|
func LoadStateTree(cst cbor.IpldStore, c cid.Cid) (*StateTree, error) {
|
||||||
@ -203,13 +206,15 @@ func LoadStateTree(cst cbor.IpldStore, c cid.Cid) (*StateTree, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &StateTree{
|
s := &StateTree{
|
||||||
root: nd,
|
root: nd,
|
||||||
info: root.Info,
|
info: root.Info,
|
||||||
version: root.Version,
|
version: root.Version,
|
||||||
Store: cst,
|
Store: cst,
|
||||||
snaps: newStateSnaps(),
|
snaps: newStateSnaps(),
|
||||||
}, nil
|
}
|
||||||
|
s.lookupIDFun = s.lookupIDinternal
|
||||||
|
return s, nil
|
||||||
default:
|
default:
|
||||||
return nil, xerrors.Errorf("unsupported state tree version: %d", root.Version)
|
return nil, xerrors.Errorf("unsupported state tree version: %d", root.Version)
|
||||||
}
|
}
|
||||||
@ -226,17 +231,7 @@ func (st *StateTree) SetActor(addr address.Address, act *types.Actor) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// LookupID gets the ID address of this actor's `addr` stored in the `InitActor`.
|
func (st *StateTree) lookupIDinternal(addr address.Address) (address.Address, error) {
|
||||||
func (st *StateTree) LookupID(addr address.Address) (address.Address, error) {
|
|
||||||
if addr.Protocol() == address.ID {
|
|
||||||
return addr, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
resa, ok := st.snaps.resolveAddress(addr)
|
|
||||||
if ok {
|
|
||||||
return resa, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
act, err := st.GetActor(init_.Address)
|
act, err := st.GetActor(init_.Address)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return address.Undef, xerrors.Errorf("getting init actor: %w", err)
|
return address.Undef, xerrors.Errorf("getting init actor: %w", err)
|
||||||
@ -254,6 +249,23 @@ func (st *StateTree) LookupID(addr address.Address) (address.Address, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return address.Undef, xerrors.Errorf("resolve address %s: %w", addr, err)
|
return address.Undef, xerrors.Errorf("resolve address %s: %w", addr, err)
|
||||||
}
|
}
|
||||||
|
return a, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// LookupID gets the ID address of this actor's `addr` stored in the `InitActor`.
|
||||||
|
func (st *StateTree) LookupID(addr address.Address) (address.Address, error) {
|
||||||
|
if addr.Protocol() == address.ID {
|
||||||
|
return addr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
resa, ok := st.snaps.resolveAddress(addr)
|
||||||
|
if ok {
|
||||||
|
return resa, nil
|
||||||
|
}
|
||||||
|
a, err := st.lookupIDFun(addr)
|
||||||
|
if err != nil {
|
||||||
|
return a, err
|
||||||
|
}
|
||||||
|
|
||||||
st.snaps.cacheResolveAddress(addr, a)
|
st.snaps.cacheResolveAddress(addr, a)
|
||||||
|
|
||||||
|
@ -73,6 +73,104 @@ func BenchmarkStateTreeSetFlush(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestResolveCache(t *testing.T) {
|
||||||
|
cst := cbor.NewMemCborStore()
|
||||||
|
st, err := NewStateTree(cst, VersionForNetwork(build.NewestNetworkVersion))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
nonId := address.NewForTestGetter()()
|
||||||
|
id, _ := address.NewIDAddress(1000)
|
||||||
|
|
||||||
|
st.lookupIDFun = func(a address.Address) (address.Address, error) {
|
||||||
|
if a == nonId {
|
||||||
|
return id, nil
|
||||||
|
} else {
|
||||||
|
return address.Undef, types.ErrActorNotFound
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = st.SetActor(nonId, &types.Actor{Nonce: 1})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
err = st.Snapshot(context.TODO())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
act, err := st.GetActor(nonId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if act.Nonce != 1 {
|
||||||
|
t.Fatalf("expected nonce 1, got %d", act.Nonce)
|
||||||
|
}
|
||||||
|
err = st.SetActor(nonId, &types.Actor{Nonce: 2})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
act, err = st.GetActor(nonId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if act.Nonce != 2 {
|
||||||
|
t.Fatalf("expected nonce 2, got %d", act.Nonce)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := st.Revert(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
st.ClearSnapshot()
|
||||||
|
}
|
||||||
|
|
||||||
|
act, err := st.GetActor(nonId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if act.Nonce != 1 {
|
||||||
|
t.Fatalf("expected nonce 1, got %d", act.Nonce)
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
err = st.Snapshot(context.TODO())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
act, err := st.GetActor(nonId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if act.Nonce != 1 {
|
||||||
|
t.Fatalf("expected nonce 1, got %d", act.Nonce)
|
||||||
|
}
|
||||||
|
err = st.SetActor(nonId, &types.Actor{Nonce: 2})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
act, err = st.GetActor(nonId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if act.Nonce != 2 {
|
||||||
|
t.Fatalf("expected nonce 2, got %d", act.Nonce)
|
||||||
|
}
|
||||||
|
st.ClearSnapshot()
|
||||||
|
}
|
||||||
|
|
||||||
|
act, err = st.GetActor(nonId)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if act.Nonce != 2 {
|
||||||
|
t.Fatalf("expected nonce 2, got %d", act.Nonce)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkStateTree10kGetActor(b *testing.B) {
|
func BenchmarkStateTree10kGetActor(b *testing.B) {
|
||||||
cst := cbor.NewMemCborStore()
|
cst := cbor.NewMemCborStore()
|
||||||
st, err := NewStateTree(cst, VersionForNetwork(build.NewestNetworkVersion))
|
st, err := NewStateTree(cst, VersionForNetwork(build.NewestNetworkVersion))
|
||||||
|
Loading…
Reference in New Issue
Block a user