Skip to content
This repository was archived by the owner on Feb 1, 2023. It is now read-only.

Commit cbb8d35

Browse files
authored
Merge pull request #185 from ipfs/fix/flakey-tests
Test: fix flakey session peer manager tests
2 parents c980d7e + 64ecba6 commit cbb8d35

File tree

2 files changed

+35
-15
lines changed

2 files changed

+35
-15
lines changed

sessionpeermanager/sessionpeermanager.go

+11
Original file line numberDiff line numberDiff line change
@@ -277,27 +277,38 @@ type getPeersMessage struct {
277277
resp chan<- []bssd.OptimizedPeer
278278
}
279279

280+
// Get all optimized peers in order followed by randomly ordered unoptimized
281+
// peers, with a limit of maxOptimizedPeers
280282
func (prm *getPeersMessage) handle(spm *SessionPeerManager) {
281283
randomOrder := rand.Perm(len(spm.unoptimizedPeersArr))
284+
285+
// Number of peers to get in total: unoptimized + optimized
286+
// limited by maxOptimizedPeers
282287
maxPeers := len(spm.unoptimizedPeersArr) + len(spm.optimizedPeersArr)
283288
if maxPeers > maxOptimizedPeers {
284289
maxPeers = maxOptimizedPeers
285290
}
291+
292+
// The best peer latency is the first optimized peer's latency.
293+
// If we haven't recorded any peer's latency, use 0.
286294
var bestPeerLatency float64
287295
if len(spm.optimizedPeersArr) > 0 {
288296
bestPeerLatency = float64(spm.activePeers[spm.optimizedPeersArr[0]].latency)
289297
} else {
290298
bestPeerLatency = 0
291299
}
300+
292301
optimizedPeers := make([]bssd.OptimizedPeer, 0, maxPeers)
293302
for i := 0; i < maxPeers; i++ {
303+
// First add optimized peers in order
294304
if i < len(spm.optimizedPeersArr) {
295305
p := spm.optimizedPeersArr[i]
296306
optimizedPeers = append(optimizedPeers, bssd.OptimizedPeer{
297307
Peer: p,
298308
OptimizationRating: bestPeerLatency / float64(spm.activePeers[p].latency),
299309
})
300310
} else {
311+
// Then add unoptimized peers in random order
301312
p := spm.unoptimizedPeersArr[randomOrder[i-len(spm.optimizedPeersArr)]]
302313
optimizedPeers = append(optimizedPeers, bssd.OptimizedPeer{Peer: p, OptimizationRating: 0.0})
303314
}

sessionpeermanager/sessionpeermanager_test.go

+24-15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sessionpeermanager
22

33
import (
44
"context"
5+
"fmt"
56
"math/rand"
67
"sync"
78
"testing"
@@ -148,9 +149,10 @@ func TestRecordingReceivedBlocks(t *testing.T) {
148149

149150
func TestOrderingPeers(t *testing.T) {
150151
ctx := context.Background()
151-
ctx, cancel := context.WithTimeout(ctx, 30*time.Millisecond)
152+
ctx, cancel := context.WithTimeout(ctx, 60*time.Millisecond)
152153
defer cancel()
153-
peers := testutil.GeneratePeers(100)
154+
peerCount := 100
155+
peers := testutil.GeneratePeers(peerCount)
154156
completed := make(chan struct{})
155157
fpt := &fakePeerTagger{}
156158
fppf := &fakePeerProviderFinder{peers, completed}
@@ -165,28 +167,32 @@ func TestOrderingPeers(t *testing.T) {
165167
case <-ctx.Done():
166168
t.Fatal("Did not finish finding providers")
167169
}
168-
time.Sleep(2 * time.Millisecond)
170+
time.Sleep(5 * time.Millisecond)
169171

170172
// record broadcast
171173
sessionPeerManager.RecordPeerRequests(nil, c)
172174

173175
// record receives
174-
peer1 := peers[rand.Intn(100)]
175-
peer2 := peers[rand.Intn(100)]
176-
peer3 := peers[rand.Intn(100)]
177-
time.Sleep(1 * time.Millisecond)
178-
sessionPeerManager.RecordPeerResponse(peer1, []cid.Cid{c[0]})
176+
randi := rand.Perm(peerCount)
177+
peer1 := peers[randi[0]]
178+
peer2 := peers[randi[1]]
179+
peer3 := peers[randi[2]]
179180
time.Sleep(5 * time.Millisecond)
181+
sessionPeerManager.RecordPeerResponse(peer1, []cid.Cid{c[0]})
182+
time.Sleep(25 * time.Millisecond)
180183
sessionPeerManager.RecordPeerResponse(peer2, []cid.Cid{c[0]})
181-
time.Sleep(1 * time.Millisecond)
184+
time.Sleep(5 * time.Millisecond)
182185
sessionPeerManager.RecordPeerResponse(peer3, []cid.Cid{c[0]})
183186

184187
sessionPeers := sessionPeerManager.GetOptimizedPeers()
185188
if len(sessionPeers) != maxOptimizedPeers {
186-
t.Fatal("Should not return more than the max of optimized peers")
189+
t.Fatal(fmt.Sprintf("Should not return more (%d) than the max of optimized peers (%d)", len(sessionPeers), maxOptimizedPeers))
187190
}
188191

189192
// should prioritize peers which are fastest
193+
// peer1: ~5ms
194+
// peer2: 5 + 25 = ~30ms
195+
// peer3: 5 + 25 + 5 = ~35ms
190196
if (sessionPeers[0].Peer != peer1) || (sessionPeers[1].Peer != peer2) || (sessionPeers[2].Peer != peer3) {
191197
t.Fatal("Did not prioritize peers that received blocks")
192198
}
@@ -202,7 +208,7 @@ func TestOrderingPeers(t *testing.T) {
202208
t.Fatal("Did not assign rating to other optimized peers correctly")
203209
}
204210

205-
// should other peers rating of zero
211+
// should give other non-optimized peers rating of zero
206212
for i := 3; i < maxOptimizedPeers; i++ {
207213
if sessionPeers[i].OptimizationRating != 0.0 {
208214
t.Fatal("Did not assign rating to unoptimized peer correctly")
@@ -220,13 +226,16 @@ func TestOrderingPeers(t *testing.T) {
220226
// call again
221227
nextSessionPeers := sessionPeerManager.GetOptimizedPeers()
222228
if len(nextSessionPeers) != maxOptimizedPeers {
223-
t.Fatal("Should not return more than the max of optimized peers")
229+
t.Fatal(fmt.Sprintf("Should not return more (%d) than the max of optimized peers (%d)", len(nextSessionPeers), maxOptimizedPeers))
224230
}
225231

226232
// should sort by average latency
233+
// peer1: ~5ms
234+
// peer3: (~35ms + ~5ms) / 2 = ~20ms
235+
// peer2: ~30ms
227236
if (nextSessionPeers[0].Peer != peer1) || (nextSessionPeers[1].Peer != peer3) ||
228237
(nextSessionPeers[2].Peer != peer2) {
229-
t.Fatal("Did not dedup peers which received multiple blocks")
238+
t.Fatal("Did not correctly update order of peers sorted by average latency")
230239
}
231240

232241
// should randomize other peers
@@ -358,7 +367,7 @@ func TestTimeoutsAndCancels(t *testing.T) {
358367

359368
func TestUntaggingPeers(t *testing.T) {
360369
ctx := context.Background()
361-
ctx, cancel := context.WithTimeout(ctx, 10*time.Millisecond)
370+
ctx, cancel := context.WithTimeout(ctx, 30*time.Millisecond)
362371
defer cancel()
363372
peers := testutil.GeneratePeers(5)
364373
completed := make(chan struct{})
@@ -375,7 +384,7 @@ func TestUntaggingPeers(t *testing.T) {
375384
case <-ctx.Done():
376385
t.Fatal("Did not finish finding providers")
377386
}
378-
time.Sleep(2 * time.Millisecond)
387+
time.Sleep(15 * time.Millisecond)
379388

380389
if fpt.count() != len(peers) {
381390
t.Fatal("Peers were not tagged!")

0 commit comments

Comments
 (0)