From 9d3e02ce5c09b376ccfa45c61f7467f704557750 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 22 Apr 2010 03:12:31 +0000 Subject: [PATCH] (trunk libT) #2993 '"Downloaded" much greater than "Have" or "verified"' -- tweak the download throttle algorithm a bit to try & address the slowness reported by Rolcol @ http://trac.transmissionbt.com/ticket/2993#comment:42 --- libtransmission/peer-mgr.c | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/libtransmission/peer-mgr.c b/libtransmission/peer-mgr.c index 2f5965a3c..039af144f 100644 --- a/libtransmission/peer-mgr.c +++ b/libtransmission/peer-mgr.c @@ -193,7 +193,7 @@ typedef struct tr_torrent_peers /* An arbitrary metric of how congested the downloads are. * Based on how many of requests are cancelled and how many are completed. * Lower values indicate less congestion. */ - double downloadCongestion; + double cancelRate; } Torrent; @@ -2401,7 +2401,7 @@ rechokeDownloads( Torrent * t ) * * We're working on 2. here, so we need to ignore unresponsive * peers in our calculations lest they confuse Transmission into - * think it's hit its bandwidth cap. + * thinking it's hit its bandwidth cap. */ for( i=0; i 5 ) maxPeers = t->interestedCount * 0.7; - else if( c > 3 ) maxPeers = t->interestedCount * 0.8; - else if( c > 1 ) maxPeers = t->interestedCount * 0.9; - else if( c > 0.5 ) maxPeers = t->interestedCount; - else maxPeers = t->interestedCount + 1; + const double cancelRate = cancels / (double)(cancels + blocks); + if( cancelRate >= 0.20 ) maxPeers = t->interestedCount * 0.7; + else if( cancelRate >= 0.10 ) maxPeers = t->interestedCount * 0.8; + else if( cancelRate >= 0.05 ) maxPeers = t->interestedCount * 0.9; + else if( cancelRate >= 0.01 ) maxPeers = t->interestedCount; + else maxPeers = t->interestedCount + 1; /* if things are getting worse, don't add more peers */ - if( ( t->downloadCongestion > 0.1 ) && ( c > t->downloadCongestion ) ) + if( ( t->cancelRate > 0.01 ) && ( cancelRate > t->cancelRate ) ) maxPeers = MIN( maxPeers, t->interestedCount ); - t->downloadCongestion = c; -/*fprintf( stderr, "OVERALL TORRENT DOWNLOAD CONGESTION: %.3f... num allowed goes from %d to %d\n", c, t->interestedCount, maxPeers );*/ + t->cancelRate = cancelRate; + + tordbg( t, "cancel rate is %.3f -- changing the " + "number of peers we're interested in from %d to %d", + cancelRate, t->interestedCount, maxPeers ); } } /* don't let the previous paragraph's number tweaking go too far... */ - maxPeers = MAX( maxPeers, MIN_INTERESTING_PEERS ); - maxPeers = MIN( maxPeers, t->tor->maxConnectedPeers ); + if( maxPeers < MIN_INTERESTING_PEERS ) + maxPeers = MIN_INTERESTING_PEERS; + if( maxPeers > t->tor->maxConnectedPeers ) + maxPeers = t->tor->maxConnectedPeers; /* separate the peers into "good" (ones with a low cancel-to-block ratio), * untested peers, and "bad" (ones with a high cancel-to-block ratio). @@ -2472,7 +2477,7 @@ rechokeDownloads( Torrent * t ) good[goodCount++] = peer; else if( !blocks ) bad[badCount++] = peer; - else if( ( ( cancels * 10.0 ) / blocks ) < 1.0 ) + else if( ( cancels * 10 ) < blocks ) good[goodCount++] = peer; else bad[badCount++] = peer; @@ -3426,7 +3431,8 @@ initiateConnection( tr_peerMgr * mgr, Torrent * t, struct peer_atom * atom ) assert( tr_peerIoGetTorrentHash( io ) ); - tr_peerIoUnref( io ); /* balanced by the implicit ref in tr_peerIoNewOutgoing() */ + tr_peerIoUnref( io ); /* balanced by the initial ref + in tr_peerIoNewOutgoing() */ tr_ptrArrayInsertSorted( &t->outgoingHandshakes, handshake, handshakeCompare );