Make Limits type a struct

This commit is contained in:
Ivan Danyliuk 2018-04-20 09:39:31 +02:00 committed by Ivan Daniluk
parent 07b2c3d750
commit 56292fb505
6 changed files with 26 additions and 16 deletions

View File

@ -47,6 +47,6 @@ func (f *TopicLimitsFlag) Set(value string) error {
if err != nil { if err != nil {
return err return err
} }
(*f)[discv5.Topic(parts[0])] = params.Limits{minL, maxL} (*f)[discv5.Topic(parts[0])] = params.NewLimits(minL, maxL)
return nil return nil
} }

View File

@ -52,17 +52,17 @@ func TestTopicLimitsFlag(t *testing.T) {
{ {
shortcut: "single", shortcut: "single",
flags: []string{"whisper=1,1"}, flags: []string{"whisper=1,1"},
expected: TopicLimitsFlag{"whisper": params.Limits{1, 1}}, expected: TopicLimitsFlag{"whisper": params.NewLimits(1, 1)},
}, },
{ {
shortcut: "multiple", shortcut: "multiple",
flags: []string{"whisper=1,1", "les=2,3"}, flags: []string{"whisper=1,1", "les=2,3"},
expected: TopicLimitsFlag{"whisper": params.Limits{1, 1}, "les": params.Limits{2, 3}}, expected: TopicLimitsFlag{"whisper": params.NewLimits(1, 1), "les": params.NewLimits(2, 3)},
}, },
{ {
shortcut: "corrupted", shortcut: "corrupted",
flags: []string{" whisper=1,1 ", " les=2,3"}, flags: []string{" whisper=1,1 ", " les=2,3"},
expected: TopicLimitsFlag{"whisper": params.Limits{1, 1}, "les": params.Limits{2, 3}}, expected: TopicLimitsFlag{"whisper": params.NewLimits(1, 1), "les": params.NewLimits(2, 3)},
}, },
{ {
shortcut: "badseparator", shortcut: "badseparator",

View File

@ -181,7 +181,17 @@ func (c *ClusterConfig) String() string {
} }
// Limits represent min and max amount of peers // Limits represent min and max amount of peers
type Limits [2]int type Limits struct {
Min, Max int
}
// NewLimits creates new Limits config with given min and max values.
func NewLimits(min, max int) Limits {
return Limits{
Min: min,
Max: max,
}
}
// ---------- // ----------
// UpstreamRPCConfig // UpstreamRPCConfig

View File

@ -96,7 +96,7 @@ func (s *PeerPoolSimulationSuite) TestSingleTopicDiscoveryWithFailover() {
topic := discv5.Topic("cap=test") topic := discv5.Topic("cap=test")
// simulation should only rely on fast sync // simulation should only rely on fast sync
config := map[discv5.Topic]params.Limits{ config := map[discv5.Topic]params.Limits{
topic: {1, 1}, // limits a chosen for simplicity of the simulation topic: params.NewLimits(1, 1), // limits a chosen for simplicity of the simulation
} }
peerPool := NewPeerPool(config, 100*time.Millisecond, 100*time.Millisecond, nil, true) peerPool := NewPeerPool(config, 100*time.Millisecond, 100*time.Millisecond, nil, true)
register := NewRegister(topic) register := NewRegister(topic)

View File

@ -107,14 +107,14 @@ func (t *TopicPool) SearchRunning() bool {
func (t *TopicPool) MaxReached() bool { func (t *TopicPool) MaxReached() bool {
t.mu.RLock() t.mu.RLock()
defer t.mu.RUnlock() defer t.mu.RUnlock()
return len(t.connectedPeers) == t.limits[1] return len(t.connectedPeers) == t.limits.Max
} }
// BelowMin returns true if current number of peers is below min limit. // BelowMin returns true if current number of peers is below min limit.
func (t *TopicPool) BelowMin() bool { func (t *TopicPool) BelowMin() bool {
t.mu.RLock() t.mu.RLock()
defer t.mu.RUnlock() defer t.mu.RUnlock()
return len(t.connectedPeers) < t.limits[0] return len(t.connectedPeers) < t.limits.Min
} }
// ConfirmAdded called when peer was added by p2p Server. // ConfirmAdded called when peer was added by p2p Server.
@ -145,7 +145,7 @@ func (t *TopicPool) ConfirmAdded(server *p2p.Server, nodeID discover.NodeID) {
} }
// if the upper limit is already reached, drop this peer // if the upper limit is already reached, drop this peer
if len(t.connectedPeers) == t.limits[1] { if len(t.connectedPeers) == t.limits.Max {
log.Debug("max limit is reached drop the peer", "ID", nodeID, "topic", t.topic) log.Debug("max limit is reached drop the peer", "ID", nodeID, "topic", t.topic)
peer.dismissed = true peer.dismissed = true
t.removeServerPeer(server, peer.peerInfo) t.removeServerPeer(server, peer.peerInfo)
@ -158,7 +158,7 @@ func (t *TopicPool) ConfirmAdded(server *p2p.Server, nodeID discover.NodeID) {
peer.dismissed = false peer.dismissed = false
// when the lower limit is reached, we can switch to slow mode // when the lower limit is reached, we can switch to slow mode
if t.SearchRunning() && len(t.connectedPeers) == t.limits[0] { if t.SearchRunning() && len(t.connectedPeers) == t.limits.Min {
t.period <- t.slowSync t.period <- t.slowSync
} }
} }
@ -193,7 +193,7 @@ func (t *TopicPool) ConfirmDropped(server *p2p.Server, nodeID discover.NodeID) b
// switch to fast mode as the number of connected peers is about to drop // switch to fast mode as the number of connected peers is about to drop
// below the lower limit // below the lower limit
if t.SearchRunning() && len(t.connectedPeers) == t.limits[0] { if t.SearchRunning() && len(t.connectedPeers) == t.limits.Min {
t.period <- t.fastSync t.period <- t.fastSync
} }
@ -267,7 +267,7 @@ func (t *TopicPool) StartSearch(server *p2p.Server) error {
} }
func (t *TopicPool) handleFoundPeers(server *p2p.Server, found <-chan *discv5.Node, lookup <-chan bool) { func (t *TopicPool) handleFoundPeers(server *p2p.Server, found <-chan *discv5.Node, lookup <-chan bool) {
if len(t.connectedPeers) >= t.limits[0] { if len(t.connectedPeers) >= t.limits.Min {
t.period <- t.slowSync t.period <- t.slowSync
} else { } else {
t.period <- t.fastSync t.period <- t.fastSync
@ -313,7 +313,7 @@ func (t *TopicPool) processFoundNode(server *p2p.Server, node *discv5.Node) {
} }
// the upper limit is not reached, so let's add this peer // the upper limit is not reached, so let's add this peer
if len(t.connectedPeers) < t.limits[1] { if len(t.connectedPeers) < t.limits.Max {
t.addServerPeer(server, t.peerPool[node.ID].peerInfo) t.addServerPeer(server, t.peerPool[node.ID].peerInfo)
} }
} }

View File

@ -38,7 +38,7 @@ func (s *TopicPoolSuite) SetupTest() {
} }
s.Require().NoError(s.peer.Start()) s.Require().NoError(s.peer.Start())
topic := discv5.Topic("cap=cap1") topic := discv5.Topic("cap=cap1")
limits := params.Limits{1, 2} limits := params.NewLimits(1, 2)
s.topicPool = NewTopicPool(topic, limits, 100*time.Millisecond, 200*time.Millisecond) s.topicPool = NewTopicPool(topic, limits, 100*time.Millisecond, 200*time.Millisecond)
s.topicPool.period = make(chan time.Duration, 2) s.topicPool.period = make(chan time.Duration, 2)
s.topicPool.running = 1 s.topicPool.running = 1
@ -97,7 +97,7 @@ func (s *TopicPoolSuite) TestNewPeerSelectedOnDrop() {
func (s *TopicPoolSuite) TestRequestedDoesntRemove() { func (s *TopicPoolSuite) TestRequestedDoesntRemove() {
// max limit is 1 because we test that 2nd peer will stay in local table // max limit is 1 because we test that 2nd peer will stay in local table
// when we request to drop it // when we request to drop it
s.topicPool.limits = params.Limits{1, 1} s.topicPool.limits = params.NewLimits(1, 1)
peer1 := discv5.NewNode(discv5.NodeID{1}, s.peer.Self().IP, 32311, 32311) peer1 := discv5.NewNode(discv5.NodeID{1}, s.peer.Self().IP, 32311, 32311)
peer2 := discv5.NewNode(discv5.NodeID{2}, s.peer.Self().IP, 32311, 32311) peer2 := discv5.NewNode(discv5.NodeID{2}, s.peer.Self().IP, 32311, 32311)
s.topicPool.processFoundNode(s.peer, peer1) s.topicPool.processFoundNode(s.peer, peer1)
@ -115,7 +115,7 @@ func (s *TopicPoolSuite) TestRequestedDoesntRemove() {
} }
func (s *TopicPoolSuite) TestTheMostRecentPeerIsSelected() { func (s *TopicPoolSuite) TestTheMostRecentPeerIsSelected() {
s.topicPool.limits = params.Limits{1, 1} s.topicPool.limits = params.NewLimits(1, 1)
peer1 := discv5.NewNode(discv5.NodeID{1}, s.peer.Self().IP, 32311, 32311) peer1 := discv5.NewNode(discv5.NodeID{1}, s.peer.Self().IP, 32311, 32311)
peer2 := discv5.NewNode(discv5.NodeID{2}, s.peer.Self().IP, 32311, 32311) peer2 := discv5.NewNode(discv5.NodeID{2}, s.peer.Self().IP, 32311, 32311)