Fix initialization race (#12374)

* block all the sync startup code on init signal

* don't need chainStarted if everything blocks

* set empty clock by default to work around panics

* remove unused clock, zero-value for init-sync

---------

Co-authored-by: Kasey Kirkham <kasey@users.noreply.github.com>
Co-authored-by: Nishant Das <nishdas93@gmail.com>
This commit is contained in:
kasey 2023-05-09 23:09:15 -05:00 committed by GitHub
parent 98f8ca4e34
commit 7d9f36985e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 2 additions and 5 deletions

View File

@ -11,7 +11,6 @@ import (
"github.com/prysmaticlabs/prysm/v4/beacon-chain/db" "github.com/prysmaticlabs/prysm/v4/beacon-chain/db"
"github.com/prysmaticlabs/prysm/v4/beacon-chain/p2p" "github.com/prysmaticlabs/prysm/v4/beacon-chain/p2p"
p2pTypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/p2p/types" p2pTypes "github.com/prysmaticlabs/prysm/v4/beacon-chain/p2p/types"
"github.com/prysmaticlabs/prysm/v4/beacon-chain/startup"
prysmsync "github.com/prysmaticlabs/prysm/v4/beacon-chain/sync" prysmsync "github.com/prysmaticlabs/prysm/v4/beacon-chain/sync"
"github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/flags" "github.com/prysmaticlabs/prysm/v4/cmd/beacon-chain/flags"
"github.com/prysmaticlabs/prysm/v4/config/params" "github.com/prysmaticlabs/prysm/v4/config/params"
@ -87,7 +86,6 @@ type blocksFetcher struct {
capacityWeight float64 // how remaining capacity affects peer selection capacityWeight float64 // how remaining capacity affects peer selection
mode syncMode // allows to use fetcher in different sync scenarios mode syncMode // allows to use fetcher in different sync scenarios
quit chan struct{} // termination notifier quit chan struct{} // termination notifier
clock *startup.Clock
} }
// peerLock restricts fetcher actions on per peer basis. Currently, used for rate limiting. // peerLock restricts fetcher actions on per peer basis. Currently, used for rate limiting.

View File

@ -552,7 +552,6 @@ func TestBlocksFetcher_RequestBlocksRateLimitingLocks(t *testing.T) {
gt := time.Now() gt := time.Now()
vr := [32]byte{} vr := [32]byte{}
fetcher.chain = &mock.ChainService{Genesis: gt, ValidatorsRoot: vr} fetcher.chain = &mock.ChainService{Genesis: gt, ValidatorsRoot: vr}
fetcher.clock = startup.NewClock(gt, vr)
hook := logTest.NewGlobal() hook := logTest.NewGlobal()
wg := new(sync.WaitGroup) wg := new(sync.WaitGroup)
wg.Add(1) wg.Add(1)
@ -621,7 +620,6 @@ func TestBlocksFetcher_WaitForBandwidth(t *testing.T) {
gt := time.Now() gt := time.Now()
vr := [32]byte{} vr := [32]byte{}
fetcher.chain = &mock.ChainService{Genesis: gt, ValidatorsRoot: vr} fetcher.chain = &mock.ChainService{Genesis: gt, ValidatorsRoot: vr}
fetcher.clock = startup.NewClock(gt, vr)
start := time.Now() start := time.Now()
assert.NoError(t, fetcher.waitForBandwidth(p2.PeerID(), 10)) assert.NoError(t, fetcher.waitForBandwidth(p2.PeerID(), 10))
dur := time.Since(start) dur := time.Since(start)

View File

@ -67,6 +67,7 @@ func NewService(ctx context.Context, cfg *Config) *Service {
chainStarted: abool.New(), chainStarted: abool.New(),
counter: ratecounter.NewRateCounter(counterSeconds * time.Second), counter: ratecounter.NewRateCounter(counterSeconds * time.Second),
genesisChan: make(chan time.Time), genesisChan: make(chan time.Time),
clock: startup.NewClock(time.Unix(0, 0), [32]byte{}), // default clock to prevent panic
} }
return s return s

View File

@ -150,7 +150,7 @@ func NewService(ctx context.Context, opts ...Option) *Service {
ctx: ctx, ctx: ctx,
cancel: cancel, cancel: cancel,
chainStarted: abool.New(), chainStarted: abool.New(),
cfg: &config{}, cfg: &config{clock: startup.NewClock(time.Unix(0, 0), [32]byte{})},
slotToPendingBlocks: c, slotToPendingBlocks: c,
seenPendingBlocks: make(map[[32]byte]bool), seenPendingBlocks: make(map[[32]byte]bool),
blkRootToPendingAtts: make(map[[32]byte][]*ethpb.SignedAggregateAttestationAndProof), blkRootToPendingAtts: make(map[[32]byte][]*ethpb.SignedAggregateAttestationAndProof),