Commit c4f8e11e authored by Adrian Sutton's avatar Adrian Sutton

op-node: Switch peer score setter to use an enum for score type.

parent a163d0cc
......@@ -31,7 +31,6 @@ require (
github.com/olekukonko/tablewriter v0.0.5
github.com/prometheus/client_golang v1.14.0
github.com/schollz/progressbar/v3 v3.13.0
github.com/status-im/keycard-go v0.2.0
github.com/stretchr/testify v1.8.1
github.com/urfave/cli v1.22.9
github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa
......@@ -163,6 +162,7 @@ require (
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/status-im/keycard-go v0.2.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect
github.com/tklauser/go-sysconf v0.3.10 // indirect
......
......@@ -9,13 +9,19 @@ type PeerScores struct {
Gossip float64
}
type ScoreType int
const (
TypeGossip ScoreType = iota
)
// ScoreDatastore defines a type-safe API for getting and setting libp2p peer score information
type ScoreDatastore interface {
// GetPeerScores returns the current scores for the specified peer
GetPeerScores(id peer.ID) (PeerScores, error)
// SetGossipScore stores the latest gossip score for a peer
SetGossipScore(id peer.ID, score float64) error
// SetScore stores the latest score for the specified peer and score type
SetScore(id peer.ID, scoreType ScoreType, score float64) error
}
// ExtendedPeerstore defines a type-safe API to work with additional peer metadata based on a libp2p peerstore.Peerstore
......
......@@ -21,8 +21,6 @@ type scoreBook struct {
var scoresBase = ds.NewKey("/peers/scores")
type ScoreType string
const (
scoreDataV0 = "0"
scoreCacheSize = 100
......@@ -65,14 +63,19 @@ func (d *scoreBook) getPeerScoresNoLock(id peer.ID) (PeerScores, error) {
return scores, nil
}
func (d *scoreBook) SetGossipScore(id peer.ID, score float64) error {
func (d *scoreBook) SetScore(id peer.ID, scoreType ScoreType, score float64) error {
d.Lock()
defer d.Unlock()
scores, err := d.getPeerScoresNoLock(id)
if err != nil {
return err
}
scores.Gossip = score
switch scoreType {
case TypeGossip:
scores.Gossip = score
default:
return fmt.Errorf("unknown score type: %v", scoreType)
}
data, err := serializeScoresV0(scores)
if err != nil {
return fmt.Errorf("encode scores for peer %v: %w", id, err)
......
......@@ -21,7 +21,7 @@ func TestRoundTripGossipScore(t *testing.T) {
id := peer.ID("aaaa")
store := createMemoryStore(t)
score := 123.45
err := store.SetGossipScore(id, score)
err := store.SetScore(id, TypeGossip, score)
require.NoError(t, err)
assertPeerScores(t, store, id, PeerScores{Gossip: score})
......@@ -31,8 +31,8 @@ func TestUpdateGossipScore(t *testing.T) {
id := peer.ID("aaaa")
store := createMemoryStore(t)
score := 123.45
require.NoError(t, store.SetGossipScore(id, 444.223))
require.NoError(t, store.SetGossipScore(id, score))
require.NoError(t, store.SetScore(id, TypeGossip, 444.223))
require.NoError(t, store.SetScore(id, TypeGossip, score))
assertPeerScores(t, store, id, PeerScores{Gossip: score})
}
......@@ -43,8 +43,8 @@ func TestStoreScoresForMultiplePeers(t *testing.T) {
store := createMemoryStore(t)
score1 := 123.45
score2 := 453.22
require.NoError(t, store.SetGossipScore(id1, score1))
require.NoError(t, store.SetGossipScore(id2, score2))
require.NoError(t, store.SetScore(id1, TypeGossip, score1))
require.NoError(t, store.SetScore(id2, TypeGossip, score2))
assertPeerScores(t, store, id1, PeerScores{Gossip: score1})
assertPeerScores(t, store, id2, PeerScores{Gossip: score2})
......@@ -56,7 +56,7 @@ func TestPersistData(t *testing.T) {
backingStore := sync.MutexWrap(ds.NewMapDatastore())
store := createPeerstoreWithBacking(t, backingStore)
require.NoError(t, store.SetGossipScore(id, score))
require.NoError(t, store.SetScore(id, TypeGossip, score))
// Close and recreate a new store from the same backing
require.NoError(t, store.Close())
......@@ -65,6 +65,12 @@ func TestPersistData(t *testing.T) {
assertPeerScores(t, store, id, PeerScores{Gossip: score})
}
func TestUnknownScoreType(t *testing.T) {
store := createMemoryStore(t)
err := store.SetScore("aaaa", 92832, 244.24)
require.ErrorContains(t, err, "unknown score type")
}
func assertPeerScores(t *testing.T, store ExtendedPeerstore, id peer.ID, expected PeerScores) {
result, err := store.GetPeerScores(id)
require.NoError(t, err)
......
......@@ -3,7 +3,7 @@ package store
import (
"testing"
"github.com/status-im/keycard-go/hexutils"
"github.com/ethereum/go-ethereum/common"
"github.com/stretchr/testify/require"
)
......@@ -30,7 +30,7 @@ func TestParseHistoricSerializationsV0(t *testing.T) {
}{
{
name: "GossipOnly",
data: hexutils.HexToBytes("40934A18644523F6"),
data: common.Hex2Bytes("40934A18644523F6"),
expected: PeerScores{Gossip: 1234.52382},
},
}
......
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