node/pkg/common: guardian set state node cleanup
This feature is dedicated to Chorus One, who really like to rotate node keys! :-) https://github.com/certusone/wormhole/issues/304 Change-Id: Ic0f1e52095676222970752b1e2ac893d7f0915ec
This commit is contained in:
parent
2396adc2c5
commit
621962982a
|
@ -6,6 +6,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/libp2p/go-libp2p-core/peer"
|
"github.com/libp2p/go-libp2p-core/peer"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MaxGuardianCount specifies the maximum number of guardians supported by on-chain contracts.
|
// MaxGuardianCount specifies the maximum number of guardians supported by on-chain contracts.
|
||||||
|
@ -24,6 +25,10 @@ const MaxGuardianCount = 19
|
||||||
// accidentally reaching the limit due to operational mistakes.
|
// accidentally reaching the limit due to operational mistakes.
|
||||||
const MaxNodesPerGuardian = 15
|
const MaxNodesPerGuardian = 15
|
||||||
|
|
||||||
|
// MaxStateAge specified the maximum age of state entries in seconds. Expired entries are purged
|
||||||
|
// from the state by Cleanup().
|
||||||
|
const MaxStateAge = 1 * time.Minute
|
||||||
|
|
||||||
type GuardianSet struct {
|
type GuardianSet struct {
|
||||||
// Guardian's public key hashes truncated by the ETH standard hashing mechanism (20 bytes).
|
// Guardian's public key hashes truncated by the ETH standard hashing mechanism (20 bytes).
|
||||||
Keys []common.Address
|
Keys []common.Address
|
||||||
|
@ -132,3 +137,18 @@ func (st *GuardianSetState) GetAll() map[common.Address]map[peer.ID]*gossipv1.He
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cleanup removes expired entries from the state.
|
||||||
|
func (st *GuardianSetState) Cleanup() {
|
||||||
|
st.mu.Lock()
|
||||||
|
defer st.mu.Unlock()
|
||||||
|
|
||||||
|
for addr, v := range st.lastHeartbeats {
|
||||||
|
for peerId, hb := range v {
|
||||||
|
ts := time.Unix(hb.Timestamp, 0)
|
||||||
|
if time.Since(ts) > MaxStateAge {
|
||||||
|
delete(st.lastHeartbeats[addr], peerId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -178,6 +178,20 @@ func Run(obsvC chan *gossipv1.SignedObservation, sendC chan []byte, signedInC ch
|
||||||
|
|
||||||
bootTime := time.Now()
|
bootTime := time.Now()
|
||||||
|
|
||||||
|
// Periodically run guardian state set cleanup.
|
||||||
|
go func() {
|
||||||
|
ticker := time.NewTicker(15 * time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ticker.C:
|
||||||
|
gst.Cleanup()
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
ctr := int64(0)
|
ctr := int64(0)
|
||||||
tick := time.NewTicker(15 * time.Second)
|
tick := time.NewTicker(15 * time.Second)
|
||||||
|
|
Loading…
Reference in New Issue