diff --git a/model/model_test.go b/model/model_test.go index 7ed9061c..32a39033 100644 --- a/model/model_test.go +++ b/model/model_test.go @@ -242,17 +242,20 @@ func BenchmarkRequest(b *testing.B) { } func TestActivityMap(t *testing.T) { + isValid := func(protocol.NodeID) bool { + return true + } m := make(activityMap) - if node := m.leastBusyNode([]protocol.NodeID{node1}); node != node1 { + if node := m.leastBusyNode([]protocol.NodeID{node1}, isValid); node != node1 { t.Errorf("Incorrect least busy node %q", node) } - if node := m.leastBusyNode([]protocol.NodeID{node2}); node != node2 { + if node := m.leastBusyNode([]protocol.NodeID{node2}, isValid); node != node2 { t.Errorf("Incorrect least busy node %q", node) } - if node := m.leastBusyNode([]protocol.NodeID{node1, node2}); node != node1 { + if node := m.leastBusyNode([]protocol.NodeID{node1, node2}, isValid); node != node1 { t.Errorf("Incorrect least busy node %q", node) } - if node := m.leastBusyNode([]protocol.NodeID{node1, node2}); node != node2 { + if node := m.leastBusyNode([]protocol.NodeID{node1, node2}, isValid); node != node2 { t.Errorf("Incorrect least busy node %q", node) } } diff --git a/model/puller.go b/model/puller.go index e9499aba..d6a65b5b 100644 --- a/model/puller.go +++ b/model/puller.go @@ -41,12 +41,12 @@ type openFile struct { type activityMap map[protocol.NodeID]int -func (m activityMap) leastBusyNode(availability []protocol.NodeID) protocol.NodeID { +func (m activityMap) leastBusyNode(availability []protocol.NodeID, isValid func(protocol.NodeID) bool) protocol.NodeID { var low int = 2<<30 - 1 var selected protocol.NodeID for _, node := range availability { usage := m[node] - if usage < low { + if usage < low && isValid(node) { low = usage selected = node } @@ -533,7 +533,7 @@ func (p *puller) handleRequestBlock(b bqBlock) bool { panic("bug: request for non-open file") } - node := p.oustandingPerNode.leastBusyNode(of.availability) + node := p.oustandingPerNode.leastBusyNode(of.availability, p.model.ConnectedTo) if node == (protocol.NodeID{}) { of.err = errNoNode if of.file != nil {