better lazy generation of "allowed set": wait until we get the {have-all|have-none|bitfield} from the peer so that we'll know if they qualify for an allowed set

This commit is contained in:
Charles Kerr 2008-01-06 22:20:44 +00:00
parent 35f73c097c
commit 1e45d3e478
1 changed files with 23 additions and 19 deletions

View File

@ -513,20 +513,6 @@ sendFastReject( tr_peermsgs * msgs,
} }
} }
static void
sendFastAllowed( tr_peermsgs * msgs,
uint32_t pieceIndex)
{
assert( msgs != NULL );
if( tr_peerIoSupportsFEXT( msgs->io ) )
{
tr_peerIoWriteUint32( msgs->io, msgs->outMessages, sizeof(uint8_t) + sizeof(uint32_t) );
tr_peerIoWriteUint8( msgs->io, msgs->outMessages, BT_ALLOWED_FAST );
tr_peerIoWriteUint32( msgs->io, msgs->outMessages, pieceIndex );
}
}
static tr_bitfield* static tr_bitfield*
getPeerAllowedPieces( tr_peermsgs * msgs ) getPeerAllowedPieces( tr_peermsgs * msgs )
{ {
@ -542,6 +528,19 @@ getPeerAllowedPieces( tr_peermsgs * msgs )
return msgs->peerAllowedPieces; return msgs->peerAllowedPieces;
} }
static void
sendFastAllowed( tr_peermsgs * msgs,
uint32_t pieceIndex)
{
assert( msgs != NULL );
if( tr_peerIoSupportsFEXT( msgs->io ) )
{
tr_peerIoWriteUint32( msgs->io, msgs->outMessages, sizeof(uint8_t) + sizeof(uint32_t) );
tr_peerIoWriteUint8( msgs->io, msgs->outMessages, BT_ALLOWED_FAST );
tr_peerIoWriteUint32( msgs->io, msgs->outMessages, pieceIndex );
}
}
static void static void
sendFastAllowedSet( tr_peermsgs * msgs ) sendFastAllowedSet( tr_peermsgs * msgs )
@ -556,6 +555,13 @@ sendFastAllowedSet( tr_peermsgs * msgs )
} }
} }
static void
maybeSendFastAllowedSet( tr_peermsgs * msgs )
{
if( tr_bitfieldCountTrueBits( msgs->info->have ) <= MAX_FAST_ALLOWED_THRESHOLD )
sendFastAllowedSet( msgs );
}
/** /**
*** ***
@ -1223,6 +1229,7 @@ readBtMessage( tr_peermsgs * msgs, struct evbuffer * inbuf, size_t inlen )
msgs->peerSentBitfield = 1; msgs->peerSentBitfield = 1;
tr_peerIoReadBytes( msgs->io, inbuf, msgs->info->have->bits, msglen ); tr_peerIoReadBytes( msgs->io, inbuf, msgs->info->have->bits, msglen );
updatePeerProgress( msgs ); updatePeerProgress( msgs );
maybeSendFastAllowedSet( msgs );
tr_peerMsgsSetChoke( msgs, !clientIsSeed || (msgs->info->progress<1.0) ); tr_peerMsgsSetChoke( msgs, !clientIsSeed || (msgs->info->progress<1.0) );
fireNeedReq( msgs ); fireNeedReq( msgs );
break; break;
@ -1271,6 +1278,7 @@ readBtMessage( tr_peermsgs * msgs, struct evbuffer * inbuf, size_t inlen )
dbgmsg( msgs, "Got a BT_HAVE_ALL" ); dbgmsg( msgs, "Got a BT_HAVE_ALL" );
tr_bitfieldAddRange( msgs->info->have, 0, msgs->torrent->info.pieceCount ); tr_bitfieldAddRange( msgs->info->have, 0, msgs->torrent->info.pieceCount );
updatePeerProgress( msgs ); updatePeerProgress( msgs );
maybeSendFastAllowedSet( msgs );
break; break;
@ -1278,6 +1286,7 @@ readBtMessage( tr_peermsgs * msgs, struct evbuffer * inbuf, size_t inlen )
dbgmsg( msgs, "Got a BT_HAVE_NONE" ); dbgmsg( msgs, "Got a BT_HAVE_NONE" );
tr_bitfieldClear( msgs->info->have ); tr_bitfieldClear( msgs->info->have );
updatePeerProgress( msgs ); updatePeerProgress( msgs );
maybeSendFastAllowedSet( msgs );
break; break;
case BT_REJECT: { case BT_REJECT: {
@ -1909,7 +1918,6 @@ tr_peerMsgsNew( struct tr_torrent * torrent,
sendBitfield( m ); sendBitfield( m );
else { else {
/* This peer is fastpeer-enabled, send it have-all or have-none if appropriate */ /* This peer is fastpeer-enabled, send it have-all or have-none if appropriate */
uint32_t peerProgress;
float completion = tr_cpPercentComplete( m->torrent->completion ); float completion = tr_cpPercentComplete( m->torrent->completion );
if ( completion == 0.0f ) { if ( completion == 0.0f ) {
sendFastHave( m, 0 ); sendFastHave( m, 0 );
@ -1918,10 +1926,6 @@ tr_peerMsgsNew( struct tr_torrent * torrent,
} else { } else {
sendBitfield( m ); sendBitfield( m );
} }
peerProgress = m->torrent->info.pieceCount * m->info->progress;
if ( peerProgress < MAX_FAST_ALLOWED_COUNT )
sendFastAllowedSet( m );
} }
return m; return m;