Merge pull request #11206 from AnomalRoil/fix/ctxonlongops
fix: chain: cancel long operations upon ctx cancelation
This commit is contained in:
commit
c4214e23bf
@ -388,6 +388,14 @@ func (sm *StateManager) GetCirculatingSupply(ctx context.Context, height abi.Cha
|
|||||||
circ := big.Zero()
|
circ := big.Zero()
|
||||||
unCirc := big.Zero()
|
unCirc := big.Zero()
|
||||||
err := st.ForEach(func(a address.Address, actor *types.Actor) error {
|
err := st.ForEach(func(a address.Address, actor *types.Actor) error {
|
||||||
|
// this can be a lengthy operation, we need to cancel early when
|
||||||
|
// the context is cancelled to avoid resource exhaustion
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
// this will cause ForEach to return
|
||||||
|
return ctx.Err()
|
||||||
|
default:
|
||||||
|
}
|
||||||
switch {
|
switch {
|
||||||
case actor.Balance.IsZero():
|
case actor.Balance.IsZero():
|
||||||
// Do nothing for zero-balance actors
|
// Do nothing for zero-balance actors
|
||||||
|
@ -948,6 +948,14 @@ func ReorgOps(ctx context.Context, lts func(ctx context.Context, _ types.TipSetK
|
|||||||
|
|
||||||
var leftChain, rightChain []*types.TipSet
|
var leftChain, rightChain []*types.TipSet
|
||||||
for !left.Equals(right) {
|
for !left.Equals(right) {
|
||||||
|
// this can take a long time and lot of memory if the tipsets are far apart
|
||||||
|
// since it can be reached through remote calls, we need to
|
||||||
|
// cancel early when possible to prevent resource exhaustion.
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil, nil, ctx.Err()
|
||||||
|
default:
|
||||||
|
}
|
||||||
if left.Height() > right.Height() {
|
if left.Height() > right.Height() {
|
||||||
leftChain = append(leftChain, left)
|
leftChain = append(leftChain, left)
|
||||||
par, err := lts(ctx, left.Parents())
|
par, err := lts(ctx, left.Parents())
|
||||||
@ -1004,7 +1012,7 @@ func (cs *ChainStore) AddToTipSetTracker(ctx context.Context, b *types.BlockHead
|
|||||||
// This means that we ideally want to keep only most recent 900 epochs in here
|
// This means that we ideally want to keep only most recent 900 epochs in here
|
||||||
// Golang's map iteration starts at a random point in a map.
|
// Golang's map iteration starts at a random point in a map.
|
||||||
// With 5 tries per epoch, and 900 entries to keep, on average we will have
|
// With 5 tries per epoch, and 900 entries to keep, on average we will have
|
||||||
// ~136 garbage entires in the `cs.tipsets` map. (solve for 1-(1-x/(900+x))^5 == 0.5)
|
// ~136 garbage entries in the `cs.tipsets` map. (solve for 1-(1-x/(900+x))^5 == 0.5)
|
||||||
// Seems good enough to me
|
// Seems good enough to me
|
||||||
|
|
||||||
for height := range cs.tipsets {
|
for height := range cs.tipsets {
|
||||||
|
Loading…
Reference in New Issue
Block a user