@@ -381,12 +381,12 @@ func TestPeersDownloadFailed(t *testing.T) {
381
381
if len (peerSelector .pools ) == 2 {
382
382
b1orb2 := peerAddress (peerSelector .pools [0 ].peers [1 ].peer ) == "b1" || peerAddress (peerSelector .pools [0 ].peers [1 ].peer ) == "b2"
383
383
require .True (t , b1orb2 )
384
- require .Equal (t , peerSelector .pools [1 ].rank , 900 )
384
+ require .Equal (t , peerSelector .pools [1 ].rank , peerRankDownloadFailed )
385
385
require .Equal (t , len (peerSelector .pools [1 ].peers ), 3 )
386
386
} else { // len(pools) == 3
387
387
b1orb2 := peerAddress (peerSelector .pools [1 ].peers [0 ].peer ) == "b1" || peerAddress (peerSelector .pools [1 ].peers [0 ].peer ) == "b2"
388
388
require .True (t , b1orb2 )
389
- require .Equal (t , peerSelector .pools [2 ].rank , 900 )
389
+ require .Equal (t , peerSelector .pools [2 ].rank , peerRankDownloadFailed )
390
390
require .Equal (t , len (peerSelector .pools [2 ].peers ), 3 )
391
391
}
392
392
@@ -459,6 +459,7 @@ func TestPeerDownloadDurationToRank(t *testing.T) {
459
459
peers2 := []network.Peer {& mockHTTPPeer {address : "b1" }, & mockHTTPPeer {address : "b2" }}
460
460
peers3 := []network.Peer {& mockHTTPPeer {address : "c1" }, & mockHTTPPeer {address : "c2" }}
461
461
peers4 := []network.Peer {& mockHTTPPeer {address : "d1" }, & mockHTTPPeer {address : "b2" }}
462
+ peers5 := []network.Peer {& mockHTTPPeer {address : "e1" }, & mockHTTPPeer {address : "b2" }}
462
463
463
464
peerSelector := makePeerSelector (
464
465
makePeersRetrieverStub (func (options ... network.PeerOption ) (peers []network.Peer ) {
@@ -469,15 +470,18 @@ func TestPeerDownloadDurationToRank(t *testing.T) {
469
470
peers = append (peers , peers2 ... )
470
471
} else if opt == network .PeersConnectedOut {
471
472
peers = append (peers , peers3 ... )
472
- } else {
473
+ } else if opt == network . PeersPhonebookArchivalNodes {
473
474
peers = append (peers , peers4 ... )
475
+ } else { // PeersConnectedIn
476
+ peers = append (peers , peers5 ... )
474
477
}
475
478
}
476
479
return
477
480
}), []peerClass {{initialRank : peerRankInitialFirstPriority , peerClass : network .PeersPhonebookArchivers },
478
481
{initialRank : peerRankInitialSecondPriority , peerClass : network .PeersPhonebookRelays },
479
482
{initialRank : peerRankInitialThirdPriority , peerClass : network .PeersConnectedOut },
480
- {initialRank : peerRankInitialFourthPriority , peerClass : network .PeersConnectedIn }},
483
+ {initialRank : peerRankInitialFourthPriority , peerClass : network .PeersPhonebookArchivalNodes },
484
+ {initialRank : peerRankInitialFifthPriority , peerClass : network .PeersConnectedIn }},
481
485
)
482
486
483
487
_ , err := peerSelector .getNextPeer ()
@@ -490,7 +494,10 @@ func TestPeerDownloadDurationToRank(t *testing.T) {
490
494
require .Equal (t , downloadDurationToRank (500 * time .Millisecond , lowBlockDownloadThreshold , highBlockDownloadThreshold , peerRank2LowBlockTime , peerRank2HighBlockTime ),
491
495
peerSelector .peerDownloadDurationToRank (& peerSelectorPeer {peers3 [0 ], network .PeersConnectedOut }, 500 * time .Millisecond ))
492
496
require .Equal (t , downloadDurationToRank (500 * time .Millisecond , lowBlockDownloadThreshold , highBlockDownloadThreshold , peerRank3LowBlockTime , peerRank3HighBlockTime ),
493
- peerSelector .peerDownloadDurationToRank (& peerSelectorPeer {peers4 [0 ], network .PeersConnectedIn }, 500 * time .Millisecond ))
497
+ peerSelector .peerDownloadDurationToRank (& peerSelectorPeer {peers4 [0 ], network .PeersPhonebookArchivalNodes }, 500 * time .Millisecond ))
498
+ require .Equal (t , downloadDurationToRank (500 * time .Millisecond , lowBlockDownloadThreshold , highBlockDownloadThreshold , peerRank4LowBlockTime , peerRank4HighBlockTime ),
499
+ peerSelector .peerDownloadDurationToRank (& peerSelectorPeer {peers5 [0 ], network .PeersConnectedIn }, 500 * time .Millisecond ))
500
+
494
501
}
495
502
496
503
func TestLowerUpperBounds (t * testing.T ) {
@@ -499,23 +506,26 @@ func TestLowerUpperBounds(t *testing.T) {
499
506
classes := []peerClass {{initialRank : peerRankInitialFirstPriority , peerClass : network .PeersPhonebookArchivers },
500
507
{initialRank : peerRankInitialSecondPriority , peerClass : network .PeersPhonebookRelays },
501
508
{initialRank : peerRankInitialThirdPriority , peerClass : network .PeersConnectedOut },
502
- {initialRank : peerRankInitialFourthPriority , peerClass : network .PeersConnectedIn }}
509
+ {initialRank : peerRankInitialFourthPriority , peerClass : network .PeersConnectedIn },
510
+ {initialRank : peerRankInitialFifthPriority , peerClass : network .PeersConnectedIn }}
503
511
504
512
require .Equal (t , peerRank0LowBlockTime , lowerBound (classes [0 ]))
505
513
require .Equal (t , peerRank1LowBlockTime , lowerBound (classes [1 ]))
506
514
require .Equal (t , peerRank2LowBlockTime , lowerBound (classes [2 ]))
507
515
require .Equal (t , peerRank3LowBlockTime , lowerBound (classes [3 ]))
516
+ require .Equal (t , peerRank4LowBlockTime , lowerBound (classes [4 ]))
508
517
509
518
require .Equal (t , peerRank0HighBlockTime , upperBound (classes [0 ]))
510
519
require .Equal (t , peerRank1HighBlockTime , upperBound (classes [1 ]))
511
520
require .Equal (t , peerRank2HighBlockTime , upperBound (classes [2 ]))
512
521
require .Equal (t , peerRank3HighBlockTime , upperBound (classes [3 ]))
522
+ require .Equal (t , peerRank4HighBlockTime , upperBound (classes [4 ]))
513
523
}
514
524
515
525
func TestFullResetRequestPenalty (t * testing.T ) {
516
526
partitiontest .PartitionTest (t )
517
527
518
- class := peerClass {initialRank : 10 , peerClass : network .PeersPhonebookArchivers }
528
+ class := peerClass {initialRank : 0 , peerClass : network .PeersPhonebookArchivers }
519
529
hs := makeHistoricStatus (10 , class )
520
530
hs .push (5 , 1 , class )
521
531
require .Equal (t , 1 , len (hs .requestGaps ))
@@ -524,6 +534,30 @@ func TestFullResetRequestPenalty(t *testing.T) {
524
534
require .Equal (t , 0 , len (hs .requestGaps ))
525
535
}
526
536
537
+ // TesPenaltyBounds makes sure that the penalty does not demote the peer to a lower class,
538
+ // and resetting the penalty of a demoted peer does not promote it back
539
+ func TestPenaltyBounds (t * testing.T ) {
540
+ partitiontest .PartitionTest (t )
541
+
542
+ class := peerClass {initialRank : peerRankInitialThirdPriority , peerClass : network .PeersPhonebookArchivers }
543
+ hs := makeHistoricStatus (peerHistoryWindowSize , class )
544
+ for x := 0 ; x < 65 ; x ++ {
545
+ r0 := hs .push (peerRank2LowBlockTime + 50 , uint64 (x + 1 ), class )
546
+ require .LessOrEqual (t , peerRank2LowBlockTime , r0 )
547
+ require .GreaterOrEqual (t , peerRank2HighBlockTime , r0 )
548
+ }
549
+
550
+ r1 := hs .resetRequestPenalty (4 , peerRankInitialThirdPriority , class )
551
+ r2 := hs .resetRequestPenalty (10 , peerRankInitialThirdPriority , class )
552
+ r3 := hs .resetRequestPenalty (10 , peerRankDownloadFailed , class )
553
+
554
+ // r2 is at a better rank than r1 because it has one penalty less
555
+ require .Greater (t , r1 , r2 )
556
+
557
+ // r3 is worse rank at peerRankDownloadFailed because it was demoted and resetRequestPenalty should not improve it
558
+ require .Equal (t , peerRankDownloadFailed , r3 )
559
+ }
560
+
527
561
// TestClassUpperBound makes sure the peer rank does not exceed the class upper bound
528
562
// This was a bug where the resetRequestPenalty was not bounding the returned rank, and was having download failures.
529
563
// Initializing rankSamples to 0 makes this works, since the dropped value subtracts 0 from rankSum.
@@ -613,7 +647,7 @@ func TestEvictionAndUpgrade(t *testing.T) {
613
647
_ , err := peerSelector .getNextPeer ()
614
648
require .NoError (t , err )
615
649
for i := 0 ; i < 10 ; i ++ {
616
- if peerSelector .pools [len (peerSelector .pools )- 1 ].rank == 900 {
650
+ if peerSelector .pools [len (peerSelector .pools )- 1 ].rank == peerRankDownloadFailed {
617
651
require .Equal (t , 6 , i )
618
652
break
619
653
}
0 commit comments