Files
prysm/beacon-chain/sync/once.go
kasey 0d742c6f88 make registerSubscribers idempotent (#15779)
* make registerSubscribers idempotent

* clean up debugging changes

* test fix

* rm unused var

* sobbing noises

* naming feedback and separate test for digestActionDone

* gazelle

* manu's feedback

* refactor to enable immediate sub after init sync

* preston comment re panic causing db corruption risk

* ensure we check that we're 1 epoch past the fork

* manu feedback

---------

Co-authored-by: Kasey Kirkham <kasey@users.noreply.github.com>
2025-10-08 01:09:22 +00:00

41 lines
1.2 KiB
Go

package sync
import "sync"
// oncePerDigest represents an action that should only be performed once per fork digest.
type oncePerDigest uint8
const (
doneZero oncePerDigest = 0
registerGossipOnce oncePerDigest = 1 << 0
unregisterGossipOnce oncePerDigest = 1 << 1
registerRpcOnce oncePerDigest = 1 << 2
unregisterRpcOnce oncePerDigest = 1 << 3
)
// perDigestSet keeps track of which oncePerDigest actions
// have been performed for each fork digest.
type perDigestSet struct {
sync.Mutex
history map[[4]byte]oncePerDigest
}
// digestActionDone marks the action as done for the given digest, returning true if it was already done.
func (s *Service) digestActionDone(digest [4]byte, action oncePerDigest) bool {
s.digestActions.Lock()
defer s.digestActions.Unlock()
// lazy initialize registrationHistory; the lock is not a reference type so it is ready to go
if s.digestActions.history == nil {
s.digestActions.history = make(map[[4]byte]oncePerDigest)
}
prev := s.digestActions.history[digest]
// Return true if the bit was already set
if prev&action != 0 {
return true
}
s.digestActions.history[digest] = prev | action
return false
}