diff --git a/libtransmission/peer-mgr.c b/libtransmission/peer-mgr.c index 95853d65a..5a8bca248 100644 --- a/libtransmission/peer-mgr.c +++ b/libtransmission/peer-mgr.c @@ -121,7 +121,8 @@ enum */ struct peer_atom { - uint8_t from; + uint8_t fromFirst; /* where the peer was first found */ + uint8_t fromBest; /* the "best" value of where the peer has been found */ uint8_t flags; /* these match the added_f flags */ uint8_t flags2; /* flags that aren't defined in added_f */ uint8_t uploadOnly; /* UPLOAD_ONLY_ */ @@ -150,7 +151,8 @@ static tr_bool tr_isAtom( const struct peer_atom * atom ) { return ( atom != NULL ) - && ( atom->from < TR_PEER_FROM__MAX ) + && ( atom->fromFirst < TR_PEER_FROM__MAX ) + && ( atom->fromBest < TR_PEER_FROM__MAX ) && ( tr_isAddress( &atom->addr ) ); } #endif @@ -1571,7 +1573,8 @@ ensureAtomExists( Torrent * t, a->addr = *addr; a->port = port; a->flags = flags; - a->from = from; + a->fromFirst = from; + a->fromBest = from; a->shelf_date = tr_time( ) + getDefaultShelfLife( from ) + jitter; a->blocklisted = -1; atomSetSeedProbability( a, seedProbability ); @@ -1579,9 +1582,13 @@ ensureAtomExists( Torrent * t, tordbg( t, "got a new atom: %s", tr_atomAddrStr( a ) ); } - else if( a->seedProbability == -1 ) + else { - atomSetSeedProbability( a, seedProbability ); + if (from < a->fromBest) + a->fromBest = from; + + if( a->seedProbability == -1 ) + atomSetSeedProbability( a, seedProbability ); } } @@ -1944,8 +1951,8 @@ compareAtomsByUsefulness( const void * va, const void *vb ) if( a->piece_data_time != b->piece_data_time ) return a->piece_data_time > b->piece_data_time ? -1 : 1; - if( a->from != b->from ) - return a->from < b->from ? -1 : 1; + if( a->fromBest != b->fromBest ) + return a->fromBest < b->fromBest ? -1 : 1; if( a->numFails != b->numFails ) return a->numFails < b->numFails ? -1 : 1; @@ -2232,7 +2239,7 @@ tr_peerMgrTorrentStats( tr_torrent * tor, ++*setmePeersConnected; - ++setmePeersFrom[atom->from]; + ++setmePeersFrom[atom->fromFirst]; if( clientIsDownloadingFrom( tor, peer ) ) ++*setmePeersSendingToUs; @@ -2341,7 +2348,7 @@ tr_peerMgrPeerStats( const tr_torrent * tor, tr_strlcpy( stat->client, ( peer->client ? peer->client : "" ), sizeof( stat->client ) ); stat->port = ntohs( peer->atom->port ); - stat->from = atom->from; + stat->from = atom->fromFirst; stat->progress = peer->progress; stat->isEncrypted = tr_peerIoIsEncrypted( peer->io ) ? 1 : 0; stat->rateToPeer_KBps = toSpeedKBps( tr_peerGetPieceSpeed_Bps( peer, now_msec, TR_CLIENT_TO_PEER ) ); @@ -2373,7 +2380,7 @@ tr_peerMgrPeerStats( const tr_torrent * tor, if( !stat->peerIsChoked && !stat->peerIsInterested ) *pch++ = '?'; if( stat->isEncrypted ) *pch++ = 'E'; if( stat->from == TR_PEER_FROM_DHT ) *pch++ = 'H'; - if( stat->from == TR_PEER_FROM_PEX ) *pch++ = 'X'; + else if( stat->from == TR_PEER_FROM_PEX ) *pch++ = 'X'; if( stat->isIncoming ) *pch++ = 'I'; *pch = '\0'; } @@ -3453,8 +3460,8 @@ getPeerCandidateScore( const tr_torrent * tor, const struct peer_atom * atom, ui score = addValToKey( score, 8, i ); /* Prefer peers that we got from more trusted sources. - * lower `from' values indicate more trusted sources */ - score = addValToKey( score, 4, atom->from ); + * lower `fromBest' values indicate more trusted sources */ + score = addValToKey( score, 4, atom->fromBest ); /* salt */ score = addValToKey( score, 8, salt ); diff --git a/macosx/InfoPeersViewController.m b/macosx/InfoPeersViewController.m index 9399b55eb..536c95f66 100644 --- a/macosx/InfoPeersViewController.m +++ b/macosx/InfoPeersViewController.m @@ -185,7 +185,7 @@ if (connected > 0) { - NSMutableArray * fromComponents = [NSMutableArray arrayWithCapacity: 6]; + NSMutableArray * fromComponents = [NSMutableArray arrayWithCapacity: 7]; if (tracker > 0) [fromComponents addObject: [NSString stringWithFormat: NSLocalizedString(@"%d tracker", "Inspector -> Peers tab -> peers"), tracker]];