Unverified Commit 07a95ce5 authored by Martin Holst Swende's avatar Martin Holst Swende Committed by GitHub

les/checkpointoracle: don't lookup checkpoint more than once per minute (#21285)

* les/checkpointoracle: don't lookup checkpoint more than once per second

* les/checkpoint/oracle: change oracle checktime to 1 minute
parent 04c4e50d
...@@ -21,7 +21,9 @@ package checkpointoracle ...@@ -21,7 +21,9 @@ package checkpointoracle
import ( import (
"encoding/binary" "encoding/binary"
"sync"
"sync/atomic" "sync/atomic"
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
...@@ -40,6 +42,11 @@ type CheckpointOracle struct { ...@@ -40,6 +42,11 @@ type CheckpointOracle struct {
running int32 // Flag whether the contract backend is set or not running int32 // Flag whether the contract backend is set or not
getLocal func(uint64) params.TrustedCheckpoint // Function used to retrieve local checkpoint getLocal func(uint64) params.TrustedCheckpoint // Function used to retrieve local checkpoint
checkMu sync.Mutex // Mutex to sync access to the fields below
lastCheckTime time.Time // Time we last checked the checkpoint
lastCheckPoint *params.TrustedCheckpoint // The last stable checkpoint
lastCheckPointHeight uint64 // The height of last stable checkpoint
} }
// New creates a checkpoint oracle handler with given configs and callback. // New creates a checkpoint oracle handler with given configs and callback.
...@@ -88,6 +95,12 @@ func (oracle *CheckpointOracle) Contract() *checkpointoracle.CheckpointOracle { ...@@ -88,6 +95,12 @@ func (oracle *CheckpointOracle) Contract() *checkpointoracle.CheckpointOracle {
// StableCheckpoint returns the stable checkpoint which was generated by local // StableCheckpoint returns the stable checkpoint which was generated by local
// indexers and announced by trusted signers. // indexers and announced by trusted signers.
func (oracle *CheckpointOracle) StableCheckpoint() (*params.TrustedCheckpoint, uint64) { func (oracle *CheckpointOracle) StableCheckpoint() (*params.TrustedCheckpoint, uint64) {
oracle.checkMu.Lock()
defer oracle.checkMu.Unlock()
if time.Since(oracle.lastCheckTime) < 1*time.Minute {
return oracle.lastCheckPoint, oracle.lastCheckPointHeight
}
// Look it up properly
// Retrieve the latest checkpoint from the contract, abort if empty // Retrieve the latest checkpoint from the contract, abort if empty
latest, hash, height, err := oracle.contract.Contract().GetLatestCheckpoint(nil) latest, hash, height, err := oracle.contract.Contract().GetLatestCheckpoint(nil)
if err != nil || (latest == 0 && hash == [32]byte{}) { if err != nil || (latest == 0 && hash == [32]byte{}) {
...@@ -103,6 +116,9 @@ func (oracle *CheckpointOracle) StableCheckpoint() (*params.TrustedCheckpoint, u ...@@ -103,6 +116,9 @@ func (oracle *CheckpointOracle) StableCheckpoint() (*params.TrustedCheckpoint, u
// //
// In both cases, no stable checkpoint will be returned. // In both cases, no stable checkpoint will be returned.
if local.HashEqual(hash) { if local.HashEqual(hash) {
oracle.lastCheckTime = time.Now()
oracle.lastCheckPointHeight = height.Uint64()
oracle.lastCheckPoint = &local
return &local, height.Uint64() return &local, height.Uint64()
} }
return nil, 0 return nil, 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment