Skip to content

Commit c473895

Browse files
authored
add a local registerValidator cache to avoid going to redis (#721)
1 parent 0eeb02d commit c473895

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

datastore/datastore.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ type Datastore struct {
4646
knownValidatorsIsUpdating uberatomic.Bool
4747
knownValidatorsLastSlot uberatomic.Uint64
4848

49+
validatorRegistrations map[common.PubkeyHex]builderApiV1.ValidatorRegistration
50+
validatorRegistrationLock sync.RWMutex
51+
4952
// Used for proposer-API readiness check
5053
KnownValidatorsWasUpdated uberatomic.Bool
5154
}
@@ -55,6 +58,7 @@ func NewDatastore(redisCache *RedisCache, memcached *Memcached, db database.IDat
5558
db: db,
5659
memcached: memcached,
5760
redis: redisCache,
61+
validatorRegistrations: make(map[common.PubkeyHex]builderApiV1.ValidatorRegistration),
5862
knownValidatorsByPubkey: make(map[common.PubkeyHex]uint64),
5963
knownValidatorsByIndex: make(map[uint64]common.PubkeyHex),
6064
}
@@ -184,14 +188,47 @@ func (ds *Datastore) SetKnownValidator(pubkeyHex common.PubkeyHex, index uint64)
184188
ds.knownValidatorsByIndex[index] = pubkeyHex
185189
}
186190

187-
// SaveValidatorRegistration saves a validator registration into both Redis and the database
191+
// GetCachedValidatorRegistration returns a validator registration from local cache or Redis
192+
// If not found, it returns (nil, nil)
193+
func (ds *Datastore) GetCachedValidatorRegistration(proposerPubkey common.PubkeyHex) (*builderApiV1.ValidatorRegistration, error) {
194+
var err error
195+
196+
// acquire read lock and read
197+
ds.validatorRegistrationLock.RLock()
198+
cachedRegistration, foundInLocalCache := ds.validatorRegistrations[proposerPubkey]
199+
ds.validatorRegistrationLock.RUnlock()
200+
if foundInLocalCache {
201+
return &cachedRegistration, nil
202+
}
203+
204+
// if not, try to get it from Redis
205+
cachedRegistrationData, err := ds.redis.GetValidatorRegistrationData(proposerPubkey)
206+
if err == nil && cachedRegistrationData != nil {
207+
// save in local cache
208+
ds.saveValidatorRegistrationInLocalCache(*cachedRegistrationData)
209+
}
210+
return cachedRegistrationData, err
211+
}
212+
213+
func (ds *Datastore) saveValidatorRegistrationInLocalCache(entry builderApiV1.ValidatorRegistration) {
214+
ds.validatorRegistrationLock.Lock()
215+
ds.validatorRegistrations[common.NewPubkeyHex(entry.Pubkey.String())] = entry
216+
ds.validatorRegistrationLock.Unlock()
217+
}
218+
219+
// SaveValidatorRegistration saves a validator registration into local cache, Redis and the database
220+
// Note that this function is called synchronously, so no need to lock the cache
188221
func (ds *Datastore) SaveValidatorRegistration(entry builderApiV1.SignedValidatorRegistration) error {
189-
// First save in the database
222+
// Save in local cache
223+
ds.saveValidatorRegistrationInLocalCache(*entry.Message)
224+
225+
// Save in the database
190226
err := ds.db.SaveValidatorRegistration(database.SignedValidatorRegistrationToEntry(entry))
191227
if err != nil {
192228
return errors.Wrap(err, "failed saving validator registration to database")
193229
}
194230

231+
// Save in Redis
195232
err = ds.redis.SetValidatorRegistrationData(entry.Message)
196233
if err != nil {
197234
return errors.Wrap(err, "failed saving validator registration to redis")

services/api/service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1104,7 +1104,7 @@ func (api *RelayAPI) handleRegisterValidator(w http.ResponseWriter, req *http.Re
11041104
}
11051105

11061106
// Check for a previous registration timestamp and see if fields changed
1107-
cachedRegistrationData, err := api.redis.GetValidatorRegistrationData(pkHex)
1107+
cachedRegistrationData, err := api.datastore.GetCachedValidatorRegistration(pkHex)
11081108
haveCachedRegistration := cachedRegistrationData != nil
11091109

11101110
if err != nil {

0 commit comments

Comments
 (0)