mirror of
https://github.com/transmission/transmission
synced 2024-12-25 09:13:06 +00:00
lessons learned from 0.82:
* if we can't bind a socket to a peer, take that peer out of the retry pool. * also, try to connect with more peers up-front.
This commit is contained in:
parent
4da5fc85bb
commit
10b6e8ff8f
2 changed files with 40 additions and 37 deletions
|
@ -174,14 +174,18 @@ tr_peerIoNewOutgoing( struct tr_handle * handle,
|
||||||
int port,
|
int port,
|
||||||
const uint8_t * torrentHash )
|
const uint8_t * torrentHash )
|
||||||
{
|
{
|
||||||
|
int socket;
|
||||||
|
|
||||||
assert( handle != NULL );
|
assert( handle != NULL );
|
||||||
assert( in_addr != NULL );
|
assert( in_addr != NULL );
|
||||||
assert( port >= 0 );
|
assert( port >= 0 );
|
||||||
assert( torrentHash != NULL );
|
assert( torrentHash != NULL );
|
||||||
|
|
||||||
return tr_peerIoNew( handle, in_addr, port,
|
socket = tr_netOpenTCP( in_addr, port, 0 );
|
||||||
torrentHash, 0,
|
|
||||||
tr_netOpenTCP( in_addr, port, 0 ) );
|
return socket < 0
|
||||||
|
? NULL
|
||||||
|
: tr_peerIoNew( handle, in_addr, port, torrentHash, 0, socket );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -110,8 +110,12 @@ enum
|
||||||
|
|
||||||
/* number of bad pieces a peer is allowed to send before we ban them */
|
/* number of bad pieces a peer is allowed to send before we ban them */
|
||||||
MAX_BAD_PIECES_PER_PEER = 3,
|
MAX_BAD_PIECES_PER_PEER = 3,
|
||||||
|
|
||||||
/* use for bitwise operations w/peer_atom.myflags */
|
/* use for bitwise operations w/peer_atom.myflags */
|
||||||
MYFLAG_BANNED = 1
|
MYFLAG_BANNED = 1,
|
||||||
|
|
||||||
|
/* unreachable for now... but not banned. if they try to connect to us it's okay */
|
||||||
|
MYFLAG_UNREACHABLE = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1735,40 +1739,26 @@ getPeerCandidates( Torrent * t, int * setmeSize )
|
||||||
|
|
||||||
/* peer fed us too much bad data ... we only keep it around
|
/* peer fed us too much bad data ... we only keep it around
|
||||||
* now to weed it out in case someone sends it to us via pex */
|
* now to weed it out in case someone sends it to us via pex */
|
||||||
if( atom->myflags & MYFLAG_BANNED ) {
|
if( atom->myflags & MYFLAG_BANNED )
|
||||||
#if 0
|
continue;
|
||||||
tordbg( t, "RECONNECT peer %d (%s) is banned...",
|
|
||||||
i, tr_peerIoAddrStr(&atom->addr,atom->port) );
|
/* peer was unconnectable before, so we're not going to keep trying.
|
||||||
#endif
|
* this is needs a separate flag from `banned', since if they try
|
||||||
|
* to connect to us later, we'll let them in */
|
||||||
|
if( atom->myflags & MYFLAG_UNREACHABLE )
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/* we don't need two connections to the same peer... */
|
/* we don't need two connections to the same peer... */
|
||||||
if( peerIsInUse( t, &atom->addr ) ) {
|
if( peerIsInUse( t, &atom->addr ) )
|
||||||
#if 0
|
|
||||||
tordbg( t, "RECONNECT peer %d (%s) is in use..",
|
|
||||||
i, tr_peerIoAddrStr(&atom->addr,atom->port) );
|
|
||||||
#endif
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/* no need to connect if we're both seeds... */
|
/* no need to connect if we're both seeds... */
|
||||||
if( seed && (atom->flags & ADDED_F_SEED_FLAG) ) {
|
if( seed && (atom->flags & ADDED_F_SEED_FLAG) )
|
||||||
#if 0
|
|
||||||
tordbg( t, "RECONNECT peer %d (%s) is a seed and so are we..",
|
|
||||||
i, tr_peerIoAddrStr(&atom->addr,atom->port) );
|
|
||||||
#endif
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/* we're wasting our time trying to connect to this bozo. */
|
/* we're wasting our time trying to connect to this bozo. */
|
||||||
if( atom->numFails > 10 ) {
|
if( atom->numFails > 10 )
|
||||||
#if 0
|
|
||||||
tordbg( t, "RECONNECT peer %d (%s) gives us nothing but failure.",
|
|
||||||
i, tr_peerIoAddrStr(&atom->addr,atom->port) );
|
|
||||||
#endif
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
/* if we used this peer recently, give someone else a turn */
|
/* if we used this peer recently, give someone else a turn */
|
||||||
minWait = 60;
|
minWait = 60;
|
||||||
|
@ -1803,7 +1793,7 @@ reconnectPulse( void * vtorrent )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int i, nCandidates, nBad;
|
int i, nCandidates, nBad, addMax;
|
||||||
struct peer_atom ** candidates = getPeerCandidates( t, &nCandidates );
|
struct peer_atom ** candidates = getPeerCandidates( t, &nCandidates );
|
||||||
struct tr_peer ** connections = getPeersToClose( t, &nBad );
|
struct tr_peer ** connections = getPeersToClose( t, &nBad );
|
||||||
|
|
||||||
|
@ -1829,26 +1819,35 @@ reconnectPulse( void * vtorrent )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add some new ones */
|
/* add some new ones */
|
||||||
|
addMax = tr_ptrArraySize(t->pool)
|
||||||
|
? MAX_RECONNECTIONS_PER_PULSE
|
||||||
|
: MAX_CONNECTED_PEERS_PER_TORRENT;
|
||||||
|
|
||||||
for( i=0; i<nCandidates && i<MAX_RECONNECTIONS_PER_PULSE; ++i )
|
for( i=0; i<nCandidates && i<MAX_RECONNECTIONS_PER_PULSE; ++i )
|
||||||
{
|
{
|
||||||
tr_peerMgr * mgr = t->manager;
|
tr_peerMgr * mgr = t->manager;
|
||||||
struct peer_atom * atom = candidates[i];
|
struct peer_atom * atom = candidates[i];
|
||||||
tr_peerIo * io;
|
tr_peerIo * io;
|
||||||
tr_handshake * handshake;
|
|
||||||
|
|
||||||
tordbg( t, "Starting an OUTGOING connection with %s",
|
tordbg( t, "Starting an OUTGOING connection with %s",
|
||||||
tr_peerIoAddrStr( &atom->addr, atom->port ) );
|
tr_peerIoAddrStr( &atom->addr, atom->port ) );
|
||||||
|
|
||||||
io = tr_peerIoNewOutgoing( mgr->handle, &atom->addr, atom->port, t->hash );
|
io = tr_peerIoNewOutgoing( mgr->handle, &atom->addr, atom->port, t->hash );
|
||||||
|
if( io == NULL )
|
||||||
|
{
|
||||||
|
atom->myflags |= MYFLAG_UNREACHABLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tr_handshake * handshake = tr_handshakeNew( io,
|
||||||
|
mgr->handle->encryptionMode,
|
||||||
|
myHandshakeDoneCB,
|
||||||
|
mgr );
|
||||||
|
|
||||||
handshake = tr_handshakeNew( io,
|
assert( tr_peerIoGetTorrentHash( io ) != NULL );
|
||||||
mgr->handle->encryptionMode,
|
|
||||||
myHandshakeDoneCB,
|
|
||||||
mgr );
|
|
||||||
|
|
||||||
assert( tr_peerIoGetTorrentHash( io ) != NULL );
|
tr_ptrArrayInsertSorted( t->outgoingHandshakes, handshake, handshakeCompare );
|
||||||
|
}
|
||||||
tr_ptrArrayInsertSorted( t->outgoingHandshakes, handshake, handshakeCompare );
|
|
||||||
|
|
||||||
atom->time = time( NULL );
|
atom->time = time( NULL );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue