Skip to content

Commit 740e5cd

Browse files
committed
do not start indexer/synchronizer when beacon node is synchronizing
1 parent 9b23651 commit 740e5cd

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

indexer/indexer.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,18 +254,38 @@ func (indexer *Indexer) runIndexer() {
254254
defer indexer.runMutex.Unlock()
255255

256256
for {
257+
runIndexerLoop := true
258+
257259
genesis, err := indexer.rpcClient.GetGenesis()
258260
if err != nil {
259261
logger.Errorf("Indexer Error while fetching genesis: %v", err)
262+
runIndexerLoop = false
260263
} else if genesis != nil {
261264
genesisTime := uint64(genesis.Data.GenesisTime)
262265
if genesisTime != utils.Config.Chain.GenesisTimestamp {
263266
logger.Warnf("Genesis time from RPC does not match the genesis time from explorer configuration.")
267+
runIndexerLoop = false
264268
}
265269
if genesis.Data.GenesisForkVersion.String() != utils.Config.Chain.Config.GenesisForkVersion {
266270
logger.Warnf("Genesis fork version from RPC does not match the genesis fork version explorer configuration.")
271+
runIndexerLoop = false
267272
}
273+
}
274+
275+
if runIndexerLoop {
276+
syncStatus, err := indexer.rpcClient.GetNodeSyncing()
277+
if err != nil {
278+
logger.Errorf("Indexer Error while fetching syncing status: %v", err)
279+
runIndexerLoop = false
280+
} else if syncStatus != nil {
281+
if syncStatus.Data.IsSyncing {
282+
logger.Errorf("Cannot run indexer, beacon node is synchronizing.")
283+
runIndexerLoop = false
284+
}
285+
}
286+
}
268287

288+
if runIndexerLoop {
269289
err := indexer.runIndexerLoop()
270290
if err == nil {
271291
break

rpc/beaconapi.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,24 @@ func (bc *BeaconClient) GetGenesis() (*rpctypes.StandardV1GenesisResponse, error
109109
return &parsedGenesis, nil
110110
}
111111

112+
func (bc *BeaconClient) GetNodeSyncing() (*rpctypes.StandardV1NodeSyncingResponse, error) {
113+
resGenesis, err := bc.get(fmt.Sprintf("%s/eth/v1/node/syncing", bc.endpoint))
114+
if err != nil {
115+
if err == errNotFound {
116+
// no block found
117+
return nil, nil
118+
}
119+
return nil, fmt.Errorf("error retrieving syncing status: %v", err)
120+
}
121+
122+
var parsedSyncingStatus rpctypes.StandardV1NodeSyncingResponse
123+
err = json.Unmarshal(resGenesis, &parsedSyncingStatus)
124+
if err != nil {
125+
return nil, fmt.Errorf("error parsing syncing status response: %v", err)
126+
}
127+
return &parsedSyncingStatus, nil
128+
}
129+
112130
func (bc *BeaconClient) GetLatestBlockHead() (*rpctypes.StandardV1BeaconHeaderResponse, error) {
113131
resHeaders, err := bc.get(fmt.Sprintf("%s/eth/v1/beacon/headers/head", bc.endpoint))
114132
if err != nil {

rpctypes/beaconapi.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,13 @@ type StandardV1GenesisResponse struct {
9393
type StandardV1BlobSidecarsResponse struct {
9494
Data []BlobSidecar `json:"data"`
9595
}
96+
97+
type StandardV1NodeSyncingResponse struct {
98+
Data struct {
99+
HeadSlot Uint64Str `json:"head_slot"`
100+
SyncDistance Uint64Str `json:"sync_distance"`
101+
IsSyncing bool `json:"is_syncing"`
102+
IsOptimistic bool `json:"is_optimistic"`
103+
ElOffline bool `json:"el_offline"`
104+
} `json:"data"`
105+
}

0 commit comments

Comments
 (0)