From f0d97e1a02eb360b380d1e6300cf8353bb055ace Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Fri, 13 Jul 2007 22:22:46 +0000 Subject: [PATCH] fix bug that gave the wrong peer count when uploading. --- libtransmission/choking.c | 14 +++++----- libtransmission/fdlimit.c | 6 +++- libtransmission/peer.c | 51 +++++++++++++++++----------------- libtransmission/peer.h | 6 ++-- libtransmission/peeraz.h | 10 +++---- libtransmission/peerext.h | 4 +-- libtransmission/peermessages.h | 6 ++-- libtransmission/peerparse.h | 41 ++++++++++++++------------- libtransmission/peertree.h | 2 +- libtransmission/peerutils.h | 18 +++++------- libtransmission/torrent.c | 32 +++++++++------------ mk/lib.mk | 35 +++++++++++++++++++---- 12 files changed, 124 insertions(+), 101 deletions(-) diff --git a/libtransmission/choking.c b/libtransmission/choking.c index 71238a559..d57f70033 100644 --- a/libtransmission/choking.c +++ b/libtransmission/choking.c @@ -165,7 +165,7 @@ void tr_chokingPulse( tr_choking_t * c ) /* Choke peers who have lost their interest in us */ if( !tr_peerIsInterested( peer ) ) { - if( !tr_peerAmChoking( peer ) ) + if( !tr_peerIsChokedByUs( peer ) ) { tr_peerChoke( peer ); tr_peerSetOptimistic( peer, 0 ); @@ -177,7 +177,12 @@ void tr_chokingPulse( tr_choking_t * c ) those we may unchoke. Whatever happens, we never choke a peer less than 10 seconds after the time we unchoked him (or the other way around). */ - if( !tr_peerAmChoking( peer ) ) + if( tr_peerIsChokedByUs( peer ) ) + { + if( !tr_peerTimesChoked(peer) || tr_peerLastChoke( peer ) + 10000 < now ) + canUnchoke[canUnchokeCount++] = peer; + } + else { if( tr_peerIsOptimistic( peer ) ) { @@ -199,11 +204,6 @@ void tr_chokingPulse( tr_choking_t * c ) if( tr_peerLastChoke( peer ) + 10000 < now ) canChoke[canChokeCount++] = peer; } - else - { - if( !tr_peerTimesChoked(peer) || tr_peerLastChoke( peer ) + 10000 < now ) - canUnchoke[canUnchokeCount++] = peer; - } } } diff --git a/libtransmission/fdlimit.c b/libtransmission/fdlimit.c index 871a83026..dbcb89f24 100644 --- a/libtransmission/fdlimit.c +++ b/libtransmission/fdlimit.c @@ -465,11 +465,15 @@ static int OpenFile( int i, const char * folder, const char * name, int write ) } /* Now try to really open the file */ + errno = 0; file->file = open( path, write ? ( O_RDWR | O_CREAT ) : O_RDONLY, 0666 ); if( file->file < 0 ) { ret = tr_ioErrorFromErrno(); - tr_err( "Could not open %s in %s (%d, %d)", name, folder, write, ret ); + if( errno ) + tr_err( "Couldn't open %s in %s: %s", name, folder, strerror(errno) ); + else + tr_err( "Couldn't open %s in %s", name, folder ); return ret; } diff --git a/libtransmission/peer.c b/libtransmission/peer.c index 59f05fc3b..eeb6195cc 100644 --- a/libtransmission/peer.c +++ b/libtransmission/peer.c @@ -146,10 +146,10 @@ struct tr_peer_s int advertisedPort; /* listening port we last told peer */ tr_peertree_t sentPeers; - char amChoking; - char amInterested; - char peerChoking; - char peerInterested; + char isChokedByUs; + char isChokingUs; + char isInteresting; + char isInterested; int optimistic; int timesChoked; @@ -238,14 +238,14 @@ tr_peer_t * tr_peerInit( struct in_addr addr, in_port_t port, int s, int from ) assert( 0 <= from && TR_PEER_FROM__MAX > from ); - peer = tr_new0( tr_peer_t, 1 ); + peer = tr_new0( tr_peer_t, 1 ); + peer->isChokedByUs = TRUE; + peer->isChokingUs = TRUE; + peer->date = tr_date(); + peer->keepAlive = peer->date; + peer->download = tr_rcInit(); + peer->upload = tr_rcInit(); peertreeInit( &peer->sentPeers ); - peer->amChoking = TRUE; - peer->peerChoking = TRUE; - peer->date = tr_date(); - peer->keepAlive = peer->date; - peer->download = tr_rcInit(); - peer->upload = tr_rcInit(); peer->inRequestMax = peer->inRequestAlloc = 2; peer->inRequests = tr_new0( tr_request_t, peer->inRequestAlloc ); @@ -395,7 +395,7 @@ int tr_peerRead( tr_peer_t * peer ) peer->pos += ret; if( NULL != tor ) { - if( tr_peerAmInterested( peer ) && !tr_peerIsChoking( peer ) ) + if( peer->isInteresting && !peer->isChokingUs ) { tor->activityDate = date; } @@ -583,7 +583,7 @@ writeBegin: date = tr_date(); peer->outDate = date; - if( !tr_peerAmChoking( peer ) ) + if( !tr_peerIsChokedByUs( peer ) ) tor->activityDate = date; /* In case this block is done, you may have messages @@ -594,7 +594,7 @@ writeEnd: /* Ask for a block whenever possible */ if( !isSeeding - && !peer->amInterested + && !peer->isInteresting && tor->peerCount > TR_MAX_PEER_COUNT - 2 ) { /* This peer is no use to us, and it seems there are @@ -603,8 +603,8 @@ writeEnd: return TR_ERROR; } - if( peer->amInterested - && !peer->peerChoking + if( peer->isInteresting + && !peer->isChokingUs && !peer->banned && peer->inRequestCount < peer->inRequestMax ) { @@ -656,21 +656,21 @@ int tr_peerIsFrom( const tr_peer_t * peer ) return peer->from; } -int tr_peerAmChoking( const tr_peer_t * peer ) +int tr_peerIsChokedByUs( const tr_peer_t * peer ) { - return peer->amChoking; + return peer->isChokedByUs; } -int tr_peerAmInterested( const tr_peer_t * peer ) +int tr_peerIsInteresting( const tr_peer_t * peer ) { - return peer->amInterested; + return peer->isInteresting; } -int tr_peerIsChoking( const tr_peer_t * peer ) +int tr_peerIsChokingUs( const tr_peer_t * peer ) { - return peer->peerChoking; + return peer->isChokingUs; } int tr_peerIsInterested( const tr_peer_t * peer ) { - return peer->peerInterested; + return peer->isInterested; } float tr_peerProgress( const tr_peer_t * peer ) @@ -776,8 +776,9 @@ void tr_peerBlame( tr_peer_t * peer, int piece, int success ) { /* Full ban */ peer_dbg( "banned (%d / %d)", peer->goodPcs, peer->badPcs ); - peer->banned = 1; - peer->peerInterested = 0; + peer->banned = TRUE; + peer->isInteresting = FALSE; + peer->isInterested = FALSE; } } tr_bitfieldRem( peer->blamefield, piece ); diff --git a/libtransmission/peer.h b/libtransmission/peer.h index c465527ab..5f471c5b8 100644 --- a/libtransmission/peer.h +++ b/libtransmission/peer.h @@ -42,10 +42,10 @@ const uint8_t * tr_peerHash ( const tr_peer_t * ); int tr_peerPulse ( tr_peer_t * ); int tr_peerIsConnected ( const tr_peer_t * ); int tr_peerIsFrom ( const tr_peer_t * ); -int tr_peerAmChoking ( const tr_peer_t * ); -int tr_peerAmInterested ( const tr_peer_t * ); -int tr_peerIsChoking ( const tr_peer_t * ); int tr_peerTimesChoked ( const tr_peer_t * ); +int tr_peerIsChokingUs ( const tr_peer_t * ); +int tr_peerIsChokedByUs ( const tr_peer_t * ); +int tr_peerIsInteresting ( const tr_peer_t * ); int tr_peerIsInterested ( const tr_peer_t * ); float tr_peerProgress ( const tr_peer_t * ); int tr_peerPort ( const tr_peer_t * ); diff --git a/libtransmission/peeraz.h b/libtransmission/peeraz.h index b888f41be..53de77869 100644 --- a/libtransmission/peeraz.h +++ b/libtransmission/peeraz.h @@ -61,7 +61,7 @@ az_msgs[] = { #define azmsgId( idx ) ( az_msgs[(idx)].id ) #define azmsgCount() ( (int)(sizeof( az_msgs ) / sizeof( az_msgs[0] ) ) ) -static inline int +static int azmsgIdIndex( int id ) { int ii; @@ -79,7 +79,7 @@ azmsgIdIndex( int id ) return 0; } -static inline int +static int azmsgNameIndex( const char * name, int len ) { int ii; @@ -272,7 +272,7 @@ sendAZHandshake( tr_torrent_t * tor, tr_peer_t * peer ) return len; } -static inline int +static int parseAZMessageHeader( tr_peer_t * peer, uint8_t * buf, int len, int * msgidret, int * msglenret ) { @@ -338,7 +338,7 @@ parseAZMessageHeader( tr_peer_t * peer, uint8_t * buf, int len, return off; } -static inline int +static int parseAZHandshake( tr_peer_t * peer, uint8_t * buf, int len ) { benc_val_t val, * sub, * dict, * subsub; @@ -453,7 +453,7 @@ parseAZHandshake( tr_peer_t * peer, uint8_t * buf, int len ) return TR_OK; } -static inline int +static int parseAZPex( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * buf, int len ) { tr_info_t * info = &tor->info; diff --git a/libtransmission/peerext.h b/libtransmission/peerext.h index 66b325d44..05c1b3996 100644 --- a/libtransmission/peerext.h +++ b/libtransmission/peerext.h @@ -210,7 +210,7 @@ makeUTPex( tr_torrent_t * tor, tr_peer_t * peer, char ** buf, int * len ) buf, len ); } -static inline int +static int parseExtendedHandshake( tr_peer_t * peer, uint8_t * buf, int len ) { benc_val_t val, * sub; @@ -276,7 +276,7 @@ parseExtendedHandshake( tr_peer_t * peer, uint8_t * buf, int len ) return TR_OK; } -static inline int +static int parseUTPex( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * buf, int len ) { benc_val_t val, * sub; diff --git a/libtransmission/peermessages.h b/libtransmission/peermessages.h index 04ab34cf3..12e19f0a0 100644 --- a/libtransmission/peermessages.h +++ b/libtransmission/peermessages.h @@ -115,7 +115,7 @@ blockPending( tr_torrent_t * tor, tr_request_t * r; int hdrlen; - if( peer->amChoking ) + if( peer->isChokedByUs ) /* we don't want to send them anything */ return NULL; if( !peer->outRequests ) /* nothing to send */ @@ -220,7 +220,7 @@ static void sendChoke( tr_peer_t * peer, int yes ) id = ( yes ? PEER_MSG_CHOKE : PEER_MSG_UNCHOKE ); getMessagePointer( peer, 0, id ); - peer->amChoking = yes; + peer->isChokedByUs = yes; if( !yes ) { @@ -245,7 +245,7 @@ static void sendInterest( tr_peer_t * peer, int yes ) id = ( yes ? PEER_MSG_INTERESTED : PEER_MSG_UNINTERESTED ); getMessagePointer( peer, 0, id ); - peer->amInterested = yes; + peer->isInteresting = yes; peer_dbg( "SEND %sinterested", yes ? "" : "un" ); } diff --git a/libtransmission/peerparse.h b/libtransmission/peerparse.h index 696fb09ba..b80efdbad 100644 --- a/libtransmission/peerparse.h +++ b/libtransmission/peerparse.h @@ -31,8 +31,11 @@ *********************************************************************** * **********************************************************************/ -static inline int parseChoke( tr_torrent_t * tor, tr_peer_t * peer, - int len, int choking ) + +static int parseChoke( tr_torrent_t * tor, + tr_peer_t * peer, + int len, + int choking ) { tr_request_t * r; int i; @@ -45,7 +48,7 @@ static inline int parseChoke( tr_torrent_t * tor, tr_peer_t * peer, peer_dbg( "GET %schoke", choking ? "" : "un" ); - peer->peerChoking = choking; + peer->isChokingUs = choking; if( choking ) { @@ -77,7 +80,7 @@ static inline int parseChoke( tr_torrent_t * tor, tr_peer_t * peer, *********************************************************************** * **********************************************************************/ -static inline int parseInterested( tr_peer_t * peer, int len, +static int parseInterested( tr_peer_t * peer, int len, int interested ) { if( len != 0 ) @@ -88,7 +91,7 @@ static inline int parseInterested( tr_peer_t * peer, int len, peer_dbg( "GET %sinterested", interested ? "" : "un" ); - peer->peerInterested = interested; + peer->isInterested = interested; return TR_OK; } @@ -98,7 +101,7 @@ static inline int parseInterested( tr_peer_t * peer, int len, *********************************************************************** * **********************************************************************/ -static inline int parseHave( tr_torrent_t * tor, tr_peer_t * peer, +static int parseHave( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * p, int len ) { tr_info_t * inf = &tor->info; @@ -136,7 +139,7 @@ static inline int parseHave( tr_torrent_t * tor, tr_peer_t * peer, return TR_OK; } -static inline int parseBitfield( tr_torrent_t * tor, tr_peer_t * peer, +static int parseBitfield( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * p, int len ) { tr_info_t * inf = &tor->info; @@ -191,7 +194,7 @@ static inline int parseBitfield( tr_torrent_t * tor, tr_peer_t * peer, return TR_OK; } -static inline int parseRequest( tr_torrent_t * tor, tr_peer_t * peer, +static int parseRequest( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * p, int len ) { tr_info_t * inf = &tor->info; @@ -204,7 +207,7 @@ static inline int parseRequest( tr_torrent_t * tor, tr_peer_t * peer, return TR_ERROR_ASSERT; } - if( peer->amChoking ) + if( peer->isChokedByUs ) { /* Didn't he get it? */ sendChoke( peer, 1 ); @@ -246,7 +249,7 @@ static inline int parseRequest( tr_torrent_t * tor, tr_peer_t * peer, return TR_OK; } -static inline void updateRequests( tr_peer_t * peer, int index, int begin ) +static void updateRequests( tr_peer_t * peer, int index, int begin ) { tr_request_t * r; int i; @@ -278,7 +281,7 @@ static inline void updateRequests( tr_peer_t * peer, int index, int begin ) } } -static inline int parsePiece( tr_torrent_t * tor, tr_peer_t * peer, +static int parsePiece( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * p, int len ) { tr_info_t * inf = &tor->info; @@ -379,7 +382,7 @@ static int reqCompare( const void * va, const void * vb ) return a->length - b->length; } -static inline int parseCancel( tr_torrent_t * tor, tr_peer_t * peer, +static int parseCancel( tr_torrent_t * tor, tr_peer_t * peer, uint8_t * p, int len ) { tr_info_t * inf = &tor->info; @@ -424,7 +427,7 @@ static inline int parseCancel( tr_torrent_t * tor, tr_peer_t * peer, return TR_OK; } -static inline int parsePort( tr_peer_t * peer, uint8_t * p, int len ) +static int parsePort( tr_peer_t * peer, uint8_t * p, int len ) { in_port_t port; @@ -440,7 +443,7 @@ static inline int parsePort( tr_peer_t * peer, uint8_t * p, int len ) return TR_OK; } -static inline int +static int parseMessageHeader( tr_peer_t * peer, uint8_t * buf, int buflen, int * msgid, int * msglen ) { @@ -474,7 +477,7 @@ parseMessageHeader( tr_peer_t * peer, uint8_t * buf, int buflen, } } -static inline int parseMessage( tr_torrent_t * tor, tr_peer_t * peer, +static int parseMessage( tr_torrent_t * tor, tr_peer_t * peer, int id, uint8_t * p, int len ) { int extid; @@ -539,7 +542,7 @@ static inline int parseMessage( tr_torrent_t * tor, tr_peer_t * peer, return TR_ERROR; } -static inline int parseBufHeader( tr_peer_t * peer ) +static int parseBufHeader( tr_peer_t * peer ) { static uint8_t badproto_http[] = "HTTP/1.0 400 Nice try...\015\012" @@ -597,7 +600,7 @@ static const uint8_t * parseBufHash( const tr_peer_t * peer ) } } -static inline int parseHandshake( tr_torrent_t * tor, tr_peer_t * peer ) +static int parseHandshake( tr_torrent_t * tor, tr_peer_t * peer ) { tr_info_t * inf = &tor->info; int ii; @@ -654,7 +657,7 @@ static inline int parseHandshake( tr_torrent_t * tor, tr_peer_t * peer ) return TR_OK; } -static inline int sendInitial( tr_torrent_t * tor, tr_peer_t * peer ) +static int sendInitial( tr_torrent_t * tor, tr_peer_t * peer ) { if( PEER_STATUS_CONNECTED != peer->status ) { @@ -675,7 +678,7 @@ static inline int sendInitial( tr_torrent_t * tor, tr_peer_t * peer ) return TR_OK; } -static inline int parseBuf( tr_torrent_t * tor, tr_peer_t * peer ) +static int parseBuf( tr_torrent_t * tor, tr_peer_t * peer ) { int len, ret, msgid; uint8_t * buf; diff --git a/libtransmission/peertree.h b/libtransmission/peertree.h index daa3d675c..ddff64b59 100644 --- a/libtransmission/peertree.h +++ b/libtransmission/peertree.h @@ -40,7 +40,7 @@ tr_peertree_t; #define peertreeNext(tree, item) RB_NEXT( tr_peertree_s, (tree), (item) ) #define peertreeFind(tree, item) RB_FIND( tr_peertree_s, (tree), (item) ) -static inline int +static int peertreekeycmp( tr_peertree_entry_t * aa, tr_peertree_entry_t * bb ) { return memcmp( aa->peer, bb->peer, 6 ); diff --git a/libtransmission/peerutils.h b/libtransmission/peerutils.h index 6b8dd3cd6..6a3dc43a1 100644 --- a/libtransmission/peerutils.h +++ b/libtransmission/peerutils.h @@ -219,18 +219,14 @@ static int isInteresting( const tr_torrent_t * tor, const tr_peer_t * peer ) return 0; } -static void updateInterest( tr_torrent_t * tor, tr_peer_t * peer ) -{ - int interested = isInteresting( tor, peer ); - if( interested && !peer->amInterested ) - { - sendInterest( peer, 1 ); - } - if( !interested && peer->amInterested ) - { - sendInterest( peer, 0 ); - } +static void +updateInterest( tr_torrent_t * tor, tr_peer_t * peer ) +{ + const int i = !!isInteresting( tor, peer ); + + if( i != peer->isInteresting ) + sendInterest( peer, i ); } /** utility structure used by getPreferredPieces() and comparePieces() */ diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c index f67d75977..42aea9315 100644 --- a/libtransmission/torrent.c +++ b/libtransmission/torrent.c @@ -549,12 +549,12 @@ tr_stat_t * tr_torrentStat( tr_torrent_t * tor ) s->peersDownloading = 0; for( i=0; ipeerCount; ++i ) { const tr_peer_t * peer = tor->peers[i]; - ++s->peersTotal; + ++s->peersTotal; if( tr_peerIsConnected( peer ) ) { ++s->peersFrom[tr_peerIsFrom(peer)]; - if( tr_peerAmInterested( peer ) && !tr_peerIsChoking( peer ) ) + if( tr_peerIsInterested( peer ) && !tr_peerIsChokedByUs( peer ) ) ++s->peersUploading; - if( !tr_peerAmChoking( peer ) ) + if( tr_peerIsInteresting( peer ) && !tr_peerIsChokingUs( peer ) ) ++s->peersDownloading; } } @@ -630,7 +630,7 @@ tr_torrentPeers( const tr_torrent_t * tor, int * peerCount ) tr_peer_t * peer; struct in_addr * addr; int i; - for( i = 0; i < tor->peerCount; i++ ) + for( i=0; ipeerCount; ++i ) { peer = tor->peers[i]; @@ -641,21 +641,15 @@ tr_torrentPeers( const tr_torrent_t * tor, int * peerCount ) sizeof( peers[i].addr ) ); } - peers[i].client = tr_peerClient( peer ); - peers[i].isConnected = tr_peerIsConnected( peer ); - peers[i].from = tr_peerIsFrom( peer ); - peers[i].progress = tr_peerProgress( peer ); - peers[i].port = tr_peerPort( peer ); - - if( ( peers[i].isDownloading = !tr_peerAmChoking( peer ) ) ) - { - peers[i].uploadToRate = tr_peerUploadRate( peer ); - } - if( ( peers[i].isUploading = ( tr_peerAmInterested( peer ) && - !tr_peerIsChoking( peer ) ) ) ) - { - peers[i].downloadFromRate = tr_peerDownloadRate( peer ); - } + peers[i].client = tr_peerClient( peer ); + peers[i].isConnected = tr_peerIsConnected( peer ); + peers[i].from = tr_peerIsFrom( peer ); + peers[i].progress = tr_peerProgress( peer ); + peers[i].port = tr_peerPort( peer ); + peers[i].isDownloading = !tr_peerIsChokingUs( peer ); + peers[i].uploadToRate = tr_peerUploadRate( peer ); + peers[i].isUploading = !tr_peerIsChokedByUs( peer ); + peers[i].downloadFromRate = tr_peerDownloadRate( peer ); } } diff --git a/mk/lib.mk b/mk/lib.mk index 2cd6dda19..3018bb7f3 100644 --- a/mk/lib.mk +++ b/mk/lib.mk @@ -3,11 +3,36 @@ include ../mk/config.mk include ../mk/common.mk -SRCS = basename.c bencode.c choking.c clients.c completion.c dirname.c \ - fastresume.c fdlimit.c http.c inout.c ipcparse.c list.c makemeta.c \ - metainfo.c natpmp.c net.c peer.c platform.c ratecontrol.c sha1.c \ - shared.c strlcat.c strlcpy.c torrent.c tracker.c transmission.c \ - upnp.c utils.c xml.c +SRCS = \ + basename.c \ + bencode.c \ + choking.c \ + clients.c \ + completion.c \ + dirname.c \ + fastresume.c \ + fdlimit.c \ + http.c \ + inout.c \ + ipcparse.c \ + list.c \ + makemeta.c \ + metainfo.c \ + natpmp.c \ + net.c \ + peer.c \ + platform.c \ + ratecontrol.c \ + sha1.c \ + shared.c \ + strlcat.c \ + strlcpy.c \ + torrent.c \ + tracker.c \ + transmission.c \ + upnp.c \ + utils.c \ + xml.c OBJS = $(SRCS:%.c=%.o)