From aeb4c6e20817695f3b8f887a5d8f5c50617c7700 Mon Sep 17 00:00:00 2001 From: Eric Petit Date: Sat, 13 May 2006 17:28:54 +0000 Subject: [PATCH] Toughens the criteria for banning, tries to make guesses about the peers two got banned for a few pieces because of someone else --- libtransmission/peer.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/libtransmission/peer.c b/libtransmission/peer.c index 580897ad9..276d2e04f 100644 --- a/libtransmission/peer.c +++ b/libtransmission/peer.c @@ -532,19 +532,12 @@ int tr_peerIsOptimistic( tr_peer_t * peer ) static inline int peerIsBad( tr_peer_t * peer ) { - if( peer->goodPcs >= 5 && - peer->badPcs >= ( peer->goodPcs * 3 ) ) - { - /* need poor success rate if we've successfully downloaded before */ - return 1; - } - else if( peer->goodPcs < 5 && - peer->badPcs >= ( 10 + peer->goodPcs ) ) - { - /* need 10 more bad pieces than good before we discard peer */ - return 1; - } - return 0; + return ( peer->badPcs > 4 + 2 * peer->goodPcs ); +} + +static inline int peerIsGood( tr_peer_t * peer ) +{ + return ( peer->goodPcs > 3 * peer->badPcs ); } void tr_peerBlame( tr_torrent_t * tor, tr_peer_t * peer, @@ -558,11 +551,19 @@ void tr_peerBlame( tr_torrent_t * tor, tr_peer_t * peer, if( success ) { peer->goodPcs++; + + if( peer->banfield && peerIsGood( peer ) ) + { + /* Assume the peer wasn't responsible for the bad pieces + we was banned for */ + memset( peer->banfield, 0x00, ( tor->info.pieceCount + 7 ) / 8 ); + } } else { peer->badPcs++; + /* Ban the peer for this piece */ if( !peer->banfield ) { peer->banfield = calloc( ( tor->info.pieceCount + 7 ) / 8, 1 );