polish(statetree): accept a context in statetree diff for timeouts

- this operation can take a while, this changes gives users the option
to abort if it takes "too long".
This commit is contained in:
frrist 2021-06-30 16:40:43 -07:00
parent 6a5b94ca3b
commit d02a2a2cfa
2 changed files with 32 additions and 27 deletions

View File

@ -547,7 +547,7 @@ func (st *StateTree) Version() types.StateTreeVersion {
return st.version return st.version
} }
func Diff(oldTree, newTree *StateTree) (map[string]types.Actor, error) { func Diff(ctx context.Context, oldTree, newTree *StateTree) (map[string]types.Actor, error) {
out := map[string]types.Actor{} out := map[string]types.Actor{}
var ( var (
@ -555,33 +555,38 @@ func Diff(oldTree, newTree *StateTree) (map[string]types.Actor, error) {
buf = bytes.NewReader(nil) buf = bytes.NewReader(nil)
) )
if err := newTree.root.ForEach(&ncval, func(k string) error { if err := newTree.root.ForEach(&ncval, func(k string) error {
var act types.Actor select {
case <-ctx.Done():
return ctx.Err()
default:
var act types.Actor
addr, err := address.NewFromBytes([]byte(k)) addr, err := address.NewFromBytes([]byte(k))
if err != nil { if err != nil {
return xerrors.Errorf("address in state tree was not valid: %w", err) return xerrors.Errorf("address in state tree was not valid: %w", err)
}
found, err := oldTree.root.Get(abi.AddrKey(addr), &ocval)
if err != nil {
return err
}
if found && bytes.Equal(ocval.Raw, ncval.Raw) {
return nil // not changed
}
buf.Reset(ncval.Raw)
err = act.UnmarshalCBOR(buf)
buf.Reset(nil)
if err != nil {
return err
}
out[addr.String()] = act
return nil
} }
found, err := oldTree.root.Get(abi.AddrKey(addr), &ocval)
if err != nil {
return err
}
if found && bytes.Equal(ocval.Raw, ncval.Raw) {
return nil // not changed
}
buf.Reset(ncval.Raw)
err = act.UnmarshalCBOR(buf)
buf.Reset(nil)
if err != nil {
return err
}
out[addr.String()] = act
return nil
}); err != nil { }); err != nil {
return nil, err return nil, err
} }

View File

@ -705,7 +705,7 @@ func (a *StateAPI) StateChangedActors(ctx context.Context, old cid.Cid, new cid.
return nil, xerrors.Errorf("failed to load new state tree: %w", err) return nil, xerrors.Errorf("failed to load new state tree: %w", err)
} }
return state.Diff(oldTree, newTree) return state.Diff(ctx, oldTree, newTree)
} }
func (a *StateAPI) StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MinerSectors, error) { func (a *StateAPI) StateMinerSectorCount(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MinerSectors, error) {