stats: increase miner power lookup perf

This commit is contained in:
Travis Person 2020-06-15 20:34:48 +00:00
parent 66b15b7076
commit f31fcdae08

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"bytes"
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
@ -13,9 +14,14 @@ import (
"github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/build"
"github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types"
"github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-actors/actors/builtin"
"github.com/filecoin-project/specs-actors/actors/builtin/power"
"github.com/filecoin-project/specs-actors/actors/util/adt"
"github.com/ipfs/go-cid" "github.com/ipfs/go-cid"
"github.com/multiformats/go-multihash" "github.com/multiformats/go-multihash"
cbg "github.com/whyrusleeping/cbor-gen"
_ "github.com/influxdata/influxdb1-client" _ "github.com/influxdata/influxdb1-client"
models "github.com/influxdata/influxdb1-client/models" models "github.com/influxdata/influxdb1-client/models"
client "github.com/influxdata/influxdb1-client/v2" client "github.com/influxdata/influxdb1-client/v2"
@ -135,6 +141,36 @@ func RecordTipsetPoints(ctx context.Context, api api.FullNode, pl *PointList, ti
return nil return nil
} }
type apiIpldStore struct {
ctx context.Context
api api.FullNode
}
func (ht *apiIpldStore) Context() context.Context {
return ht.ctx
}
func (ht *apiIpldStore) Get(ctx context.Context, c cid.Cid, out interface{}) error {
raw, err := ht.api.ChainReadObj(ctx, c)
if err != nil {
return err
}
cu, ok := out.(cbg.CBORUnmarshaler)
if ok {
if err := cu.UnmarshalCBOR(bytes.NewReader(raw)); err != nil {
return err
}
return nil
}
return fmt.Errorf("Object does not implement CBORUnmarshaler")
}
func (ht *apiIpldStore) Put(ctx context.Context, v interface{}) (cid.Cid, error) {
return cid.Undef, fmt.Errorf("Put is not implemented on apiIpldStore")
}
func RecordTipsetStatePoints(ctx context.Context, api api.FullNode, pl *PointList, tipset *types.TipSet) error { func RecordTipsetStatePoints(ctx context.Context, api api.FullNode, pl *PointList, tipset *types.TipSet) error {
pc, err := api.StatePledgeCollateral(ctx, tipset.Key()) pc, err := api.StatePledgeCollateral(ctx, tipset.Key())
if err != nil { if err != nil {
@ -158,24 +194,58 @@ func RecordTipsetStatePoints(ctx context.Context, api api.FullNode, pl *PointLis
p = NewPoint("network.balance", netBalFilFloat) p = NewPoint("network.balance", netBalFilFloat)
pl.AddPoint(p) pl.AddPoint(p)
power, err := api.StateMinerPower(ctx, address.Address{}, tipset.Key()) totalPower, err := api.StateMinerPower(ctx, address.Address{}, tipset.Key())
if err != nil { if err != nil {
return err return err
} }
p = NewPoint("chain.power", power.TotalPower.QualityAdjPower.Int64()) p = NewPoint("chain.power", totalPower.TotalPower.QualityAdjPower.Int64())
pl.AddPoint(p) pl.AddPoint(p)
miners, err := api.StateListMiners(ctx, tipset.Key()) powerActor, err := api.StateGetActor(ctx, builtin.StoragePowerActorAddr, tipset.Key())
for _, miner := range miners { if err != nil {
power, err := api.StateMinerPower(ctx, miner, tipset.Key()) return err
}
powerRaw, err := api.ChainReadObj(ctx, powerActor.Head)
if err != nil {
return err
}
var powerActorState power.State
if err := powerActorState.UnmarshalCBOR(bytes.NewReader(powerRaw)); err != nil {
return fmt.Errorf("failed to unmarshal power actor state: %w", err)
}
s := &apiIpldStore{ctx, api}
mp, err := adt.AsMap(s, powerActorState.Claims)
if err != nil {
return err
}
err = mp.ForEach(nil, func(key string) error {
addr, err := address.NewFromBytes([]byte(key))
if err != nil { if err != nil {
return err return err
} }
p = NewPoint("chain.miner_power", power.MinerPower.QualityAdjPower.Int64()) var claim power.Claim
p.AddTag("miner", miner.String()) keyerAddr := adt.AddrKey(addr)
mp.Get(keyerAddr, &claim)
if claim.QualityAdjPower.Int64() == 0 {
return nil
}
p = NewPoint("chain.miner_power", claim.QualityAdjPower.Int64())
p.AddTag("miner", addr.String())
pl.AddPoint(p) pl.AddPoint(p)
return nil
})
if err != nil {
return err
} }
return nil return nil