Compare commits

...

12 Commits

Author SHA1 Message Date
james-prysm
45d2219cf5 wip trying something 2024-11-13 16:27:01 -06:00
james-prysm
660b4d7678 wip changing locks 2024-11-13 13:36:46 -06:00
james-prysm
b3f0194a79 Merge branch 'develop' into tracked-validators-metric 2024-11-13 13:36:20 -06:00
james-prysm
421f7a75e0 Merge branch 'develop' into tracked-validators-metric 2024-10-29 10:44:56 -05:00
james-prysm
b6965f0174 Merge branch 'develop' into tracked-validators-metric 2024-10-28 16:49:38 -05:00
james-prysm
b98e9c510e Merge branch 'develop' into tracked-validators-metric 2024-10-24 16:00:07 -05:00
james-prysm
d4017743d3 fixing bazel issue 2024-10-24 15:56:10 -05:00
james-prysm
c85a23251c gaz 2024-10-24 15:39:07 -05:00
james-prysm
0a6457fc3a changing import cycle 2024-10-23 16:06:31 -05:00
james-prysm
f3458a3f4a changelog 2024-10-23 15:40:43 -05:00
james-prysm
8da7bdeaa6 gaz 2024-10-23 15:39:51 -05:00
james-prysm
74b07cf48c adding in a metric to set the tracked validators cache size 2024-10-23 15:39:16 -05:00
5 changed files with 73 additions and 7 deletions

View File

@@ -24,6 +24,7 @@ The format is based on Keep a Changelog, and this project adheres to Semantic Ve
- Added GetAggregatedAttestationV2 endpoint.
- Added SubmitAttestationsV2 endpoint.
- Validator REST mode Electra block support
- Metric for the size of tracked validators cache
### Changed

View File

@@ -2,19 +2,28 @@ package cache
import (
"sync"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prysmaticlabs/prysm/v5/config/params"
"github.com/prysmaticlabs/prysm/v5/consensus-types/primitives"
)
var validatorInactivityThreshold = 5 // 5 epochs
type TrackedValidator struct {
Active bool
FeeRecipient primitives.ExecutionAddress
Index primitives.ValidatorIndex
LastUpdated time.Time
}
type TrackedValidatorsCache struct {
sync.Mutex
trackedValidators map[primitives.ValidatorIndex]TrackedValidator
sync.RWMutex
trackedValidators map[primitives.ValidatorIndex]TrackedValidator
trackedValidatorsNum uint64
trackedValidatorsNumLastUpdated uint64
trackedValidatorsMetric prometheus.GaugeFunc
}
func NewTrackedValidatorsCache() *TrackedValidatorsCache {
@@ -24,8 +33,8 @@ func NewTrackedValidatorsCache() *TrackedValidatorsCache {
}
func (t *TrackedValidatorsCache) Validator(index primitives.ValidatorIndex) (TrackedValidator, bool) {
t.Lock()
defer t.Unlock()
t.RLock()
defer t.RUnlock()
val, ok := t.trackedValidators[index]
return val, ok
}
@@ -34,6 +43,32 @@ func (t *TrackedValidatorsCache) Set(val TrackedValidator) {
t.Lock()
defer t.Unlock()
t.trackedValidators[val.Index] = val
t.updateTackedValidatorsNum()
}
func (t *TrackedValidatorsCache) updateTackedValidatorsNum() {
epochTime := uint64(params.BeaconConfig().SlotsPerEpoch) * params.BeaconConfig().SecondsPerSlot
if t.trackedValidatorsNumLastUpdated != 0 && t.trackedValidatorsNumLastUpdated+epochTime < uint64(time.Now().Unix()) {
// too early to update again
return
}
num := 0
for _, value := range t.trackedValidators {
if value.LastUpdated.Unix()+int64(validatorInactivityThreshold)*int64(epochTime) < time.Now().Unix() {
// validator expired
// TODO: should we prune?
continue
}
num++
}
t.trackedValidatorsNum = uint64(num)
t.trackedValidatorsNumLastUpdated = uint64(time.Now().Unix())
}
func (t *TrackedValidatorsCache) GetTrackedValidatorsNum() uint64 {
t.RLock()
defer t.RUnlock()
return t.trackedValidatorsNum
}
func (t *TrackedValidatorsCache) Prune() {
@@ -43,7 +78,32 @@ func (t *TrackedValidatorsCache) Prune() {
}
func (t *TrackedValidatorsCache) Validating() bool {
t.Lock()
defer t.Unlock()
t.RLock()
defer t.RUnlock()
return len(t.trackedValidators) > 0
}
func (t *TrackedValidatorsCache) Size() int {
t.RLock()
defer t.RUnlock()
return len(t.trackedValidators)
}
func (t *TrackedValidatorsCache) RegisterTrackedValidatorMetric() error {
t.Lock()
defer t.Unlock()
t.trackedValidatorsMetric = prometheus.NewGaugeFunc(
prometheus.GaugeOpts{
Name: "tracked_validator_count",
Help: "The total number of validators tracked by trackedValidatorsCache in the beacon node. This is updated at intervals via the push proposer settings API endpoint.",
},
func() float64 { return float64(t.GetTrackedValidatorsNum()) },
)
return prometheus.Register(t.trackedValidatorsMetric)
}
func (t *TrackedValidatorsCache) UnregisterTrackedValidatorMetric() {
t.RLock()
defer t.RUnlock()
prometheus.Unregister(t.trackedValidatorsMetric)
}

View File

@@ -217,7 +217,9 @@ func New(cliCtx *cli.Context, cancel context.CancelFunc, opts ...Option) (*Beaco
return nil, err
}
beacon.collector = c
if err := beacon.trackedValidatorsCache.RegisterTrackedValidatorMetric(); err != nil {
return nil, errors.Wrap(err, "unable to register tracked validator metric")
}
// Do not store the finalized state as it has been provided to the respective services during
// their initialization.
beacon.finalizedStateAtStartUp = nil
@@ -457,6 +459,7 @@ func (b *BeaconNode) Close() {
log.WithError(err).Error("Failed to close database")
}
b.collector.unregister()
b.trackedValidatorsCache.UnregisterTrackedValidatorMetric()
b.cancel()
close(b.stop)
}

View File

@@ -761,6 +761,7 @@ func (s *Server) PrepareBeaconProposer(w http.ResponseWriter, r *http.Request) {
Active: true, // TODO: either check or add the field in the request
Index: primitives.ValidatorIndex(validatorIndex),
FeeRecipient: feeRecipient,
LastUpdated: time.Now().UTC(),
}
s.TrackedValidatorsCache.Set(val)
validatorIndices = append(validatorIndices, primitives.ValidatorIndex(validatorIndex))

View File

@@ -33,6 +33,7 @@ go_library(
importpath = "github.com/prysmaticlabs/prysm/v5/beacon-chain/rpc/prysm/v1alpha1/validator",
visibility = ["//beacon-chain:__subpackages__"],
deps = [
"//api:go_default_library",
"//api/client/builder:go_default_library",
"//async/event:go_default_library",
"//beacon-chain/blockchain:go_default_library",