Skip to content

Commit b2c39b9

Browse files
committed
Integrate MapReduce cache
Signed-off-by: Jakub Sztandera <[email protected]>
1 parent afa991c commit b2c39b9

File tree

6 files changed

+182
-2
lines changed

6 files changed

+182
-2
lines changed

builtin/claim.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package builtin
2+
3+
import (
4+
"github.com/filecoin-project/go-address"
5+
"github.com/filecoin-project/go-state-types/abi"
6+
)
7+
8+
type OwnedClaim struct {
9+
// Address of the miner.
10+
Address address.Address
11+
12+
// Sum of raw byte power for a miner's sectors.
13+
RawBytePower abi.StoragePower
14+
// Sum of quality adjusted power for a miner's sectors.
15+
QualityAdjPower abi.StoragePower
16+
}

builtin/shared.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ func MakeEmptyState() (cid.Cid, error) {
3131

3232
return emptyObject, nil
3333
}
34+
35+
type MapReduceCache any

builtin/v16/power/power_state.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"golang.org/x/xerrors"
66

77
addr "github.com/filecoin-project/go-address"
8+
hamt "github.com/filecoin-project/go-hamt-ipld/v3"
89
"github.com/filecoin-project/go-state-types/abi"
910
"github.com/filecoin-project/go-state-types/big"
1011
"github.com/filecoin-project/go-state-types/builtin"
@@ -151,6 +152,85 @@ func (st *State) ClaimMeetsConsensusMinimums(claim *Claim) (bool, error) {
151152
return minerNominalPower.GreaterThan(abi.NewStoragePower(0)), nil
152153
}
153154

155+
type powerMapReduceCache struct {
156+
cmr *hamt.CachedMapReduce[Claim, *Claim, []builtin.OwnedClaim]
157+
}
158+
159+
func (st *State) CollectEligibleClaims(s adt.Store, cacheInOut *builtin.MapReduceCache) ([]builtin.OwnedClaim, error) {
160+
if st.MinerAboveMinPowerCount < ConsensusMinerMinMiners {
161+
// simple collect all claims,
162+
var res []builtin.OwnedClaim
163+
claims, err := adt.AsMap(s, st.Claims, builtin.DefaultHamtBitwidth)
164+
if err != nil {
165+
return nil, xerrors.Errorf("failed to load claims: %w", err)
166+
}
167+
var out Claim
168+
claims.ForEach(&out, func(k string) error {
169+
if !out.RawBytePower.GreaterThan(abi.NewStoragePower(0)) {
170+
return nil
171+
}
172+
addr, err := addr.NewFromBytes([]byte(k))
173+
if err != nil {
174+
return xerrors.Errorf("parsing address from bytes: %w", err)
175+
}
176+
res = append(res, builtin.OwnedClaim{
177+
Address: addr,
178+
RawBytePower: out.RawBytePower,
179+
QualityAdjPower: out.QualityAdjPower,
180+
})
181+
return nil
182+
})
183+
return res, nil
184+
}
185+
cache, ok := (*cacheInOut).(powerMapReduceCache)
186+
if !ok {
187+
mapper := func(k string, claim Claim) ([]builtin.OwnedClaim, error) {
188+
minerMinPower, err := builtin.ConsensusMinerMinPower(claim.WindowPoStProofType)
189+
if err != nil {
190+
return nil, xerrors.Errorf("could not get miner min power from proof type: %w", err)
191+
}
192+
if !claim.RawBytePower.GreaterThanEqual(minerMinPower) {
193+
return nil, nil
194+
}
195+
addr, err := addr.NewFromBytes([]byte(k))
196+
if err != nil {
197+
return nil, err
198+
}
199+
return []builtin.OwnedClaim{
200+
{
201+
Address: addr,
202+
RawBytePower: claim.RawBytePower,
203+
QualityAdjPower: claim.QualityAdjPower,
204+
},
205+
}, nil
206+
}
207+
reducer := func(in [][]builtin.OwnedClaim) ([]builtin.OwnedClaim, error) {
208+
var out []builtin.OwnedClaim
209+
for _, v := range in {
210+
out = append(out, v...)
211+
}
212+
return out, nil
213+
}
214+
cmr, err := hamt.NewCachedMapReduce[Claim, *Claim, []builtin.OwnedClaim](mapper, reducer, 2000)
215+
if err != nil {
216+
return nil, err
217+
}
218+
219+
cache = powerMapReduceCache{
220+
cmr: cmr,
221+
}
222+
(*cacheInOut) = cache
223+
}
224+
225+
claims, err := cache.cmr.MapReduce(s.Context(), s, st.Claims,
226+
hamt.UseTreeBitWidth(builtin.DefaultHamtBitwidth))
227+
if err != nil {
228+
return nil, xerrors.Errorf("failed to map reduce claims: %w", err)
229+
}
230+
231+
return claims, nil
232+
}
233+
154234
// MinerNominalPowerMeetsConsensusMinimum is used to validate Election PoSt
155235
// winners outside the chain state. If the miner has over a threshold of power
156236
// the miner meets the minimum. If the network is a below a threshold of

builtin/v17/power/power_state.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"golang.org/x/xerrors"
66

77
addr "github.com/filecoin-project/go-address"
8+
"github.com/filecoin-project/go-hamt-ipld/v3"
89
"github.com/filecoin-project/go-state-types/abi"
910
"github.com/filecoin-project/go-state-types/big"
1011
"github.com/filecoin-project/go-state-types/builtin"
@@ -151,6 +152,85 @@ func (st *State) ClaimMeetsConsensusMinimums(claim *Claim) (bool, error) {
151152
return minerNominalPower.GreaterThan(abi.NewStoragePower(0)), nil
152153
}
153154

155+
type powerMapReduceCache struct {
156+
cmr *hamt.CachedMapReduce[Claim, *Claim, []builtin.OwnedClaim]
157+
}
158+
159+
func (st *State) CollectEligibleClaims(s adt.Store, cacheInOut *builtin.MapReduceCache) ([]builtin.OwnedClaim, error) {
160+
if st.MinerAboveMinPowerCount < ConsensusMinerMinMiners {
161+
// simple collect all claims,
162+
var res []builtin.OwnedClaim
163+
claims, err := adt.AsMap(s, st.Claims, builtin.DefaultHamtBitwidth)
164+
if err != nil {
165+
return nil, xerrors.Errorf("failed to load claims: %w", err)
166+
}
167+
var out Claim
168+
claims.ForEach(&out, func(k string) error {
169+
if !out.RawBytePower.GreaterThan(abi.NewStoragePower(0)) {
170+
return nil
171+
}
172+
addr, err := addr.NewFromBytes([]byte(k))
173+
if err != nil {
174+
return xerrors.Errorf("parsing address from bytes: %w", err)
175+
}
176+
res = append(res, builtin.OwnedClaim{
177+
Address: addr,
178+
RawBytePower: out.RawBytePower,
179+
QualityAdjPower: out.QualityAdjPower,
180+
})
181+
return nil
182+
})
183+
return res, nil
184+
}
185+
cache, ok := (*cacheInOut).(powerMapReduceCache)
186+
if !ok {
187+
mapper := func(k string, claim Claim) ([]builtin.OwnedClaim, error) {
188+
minerMinPower, err := builtin.ConsensusMinerMinPower(claim.WindowPoStProofType)
189+
if err != nil {
190+
return nil, xerrors.Errorf("could not get miner min power from proof type: %w", err)
191+
}
192+
if !claim.RawBytePower.GreaterThanEqual(minerMinPower) {
193+
return nil, nil
194+
}
195+
addr, err := addr.NewFromBytes([]byte(k))
196+
if err != nil {
197+
return nil, err
198+
}
199+
return []builtin.OwnedClaim{
200+
{
201+
Address: addr,
202+
RawBytePower: claim.RawBytePower,
203+
QualityAdjPower: claim.QualityAdjPower,
204+
},
205+
}, nil
206+
}
207+
reducer := func(in [][]builtin.OwnedClaim) ([]builtin.OwnedClaim, error) {
208+
var out []builtin.OwnedClaim
209+
for _, v := range in {
210+
out = append(out, v...)
211+
}
212+
return out, nil
213+
}
214+
cmr, err := hamt.NewCachedMapReduce[Claim, *Claim, []builtin.OwnedClaim](mapper, reducer, 2000)
215+
if err != nil {
216+
return nil, err
217+
}
218+
219+
cache = powerMapReduceCache{
220+
cmr: cmr,
221+
}
222+
(*cacheInOut) = cache
223+
}
224+
225+
claims, err := cache.cmr.MapReduce(s.Context(), s, st.Claims,
226+
hamt.UseTreeBitWidth(builtin.DefaultHamtBitwidth))
227+
if err != nil {
228+
return nil, xerrors.Errorf("failed to map reduce claims: %w", err)
229+
}
230+
231+
return claims, nil
232+
}
233+
154234
// MinerNominalPowerMeetsConsensusMinimum is used to validate Election PoSt
155235
// winners outside the chain state. If the miner has over a threshold of power
156236
// the miner meets the minimum. If the network is a below a threshold of

go.mod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ module github.com/filecoin-project/go-state-types
22

33
go 1.23.0
44

5+
toolchain go1.24.2
6+
57
retract v0.12.7 // wrongfully skipped a patch version, use v0.12.6 or v0.12.8&^
68

79
require (
@@ -44,3 +46,5 @@ require (
4446
gopkg.in/yaml.v3 v3.0.1 // indirect
4547
lukechampine.com/blake3 v1.3.0 // indirect
4648
)
49+
50+
replace github.com/filecoin-project/go-hamt-ipld/v3 => ../go-hamt-ipld

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ github.com/filecoin-project/go-fil-commcid v0.2.0 h1:B+5UX8XGgdg/XsdUpST4pEBviKk
1717
github.com/filecoin-project/go-fil-commcid v0.2.0/go.mod h1:8yigf3JDIil+/WpqR5zoKyP0jBPCOGtEqq/K1CcMy9Q=
1818
github.com/filecoin-project/go-fil-commp-hashhash v0.2.0 h1:HYIUugzjq78YvV3vC6rL95+SfC/aSTVSnZSZiDV5pCk=
1919
github.com/filecoin-project/go-fil-commp-hashhash v0.2.0/go.mod h1:VH3fAFOru4yyWar4626IoS5+VGE8SfZiBODJLUigEo4=
20-
github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 h1:nYs6OPUF8KbZ3E8o9p9HJnQaE8iugjHR5WYVMcicDJc=
21-
github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0/go.mod h1:s0qiHRhFyrgW0SvdQMSJFQxNa4xEIG5XvqCBZUEgcbc=
2220
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
2321
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
2422
github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0=

0 commit comments

Comments
 (0)