1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2024-12-26 01:27:28 +00:00

(libT) (1) shave a few bytes from tr_peer and tr_ratecontrol's footprints. (2) remove some dead code.

This commit is contained in:
Charles Kerr 2008-05-26 12:14:35 +00:00
parent 5f9ec561e6
commit 70fcc56beb
5 changed files with 157 additions and 179 deletions

View file

@ -34,27 +34,6 @@ enum
ENCRYPTION_PREFERENCE_NO
};
/**
*** The "SWIFT" system is described by Karthik Tamilmani,
*** Vinay Pai, and Alexander Mohr of Stony Brook University
*** in their paper "SWIFT: A System With Incentives For Trading"
*** http://citeseer.ist.psu.edu/tamilmani04swift.html
***
*** More SWIFT constants are defined in peer-mgr.c
**/
/**
* Use SWIFT?
*/
static const int SWIFT_ENABLED = 0;
/**
* For every byte the peer uploads to us,
* allow them to download this many bytes from us
*/
static const double SWIFT_REPAYMENT_RATIO = 1.33;
typedef struct tr_peer
{
unsigned int peerIsChoked : 1;
@ -88,10 +67,8 @@ typedef struct tr_peer
struct tr_ratecontrol * rcToClient;
struct tr_ratecontrol * rcToPeer;
double rateToClient;
double rateToPeer;
int64_t credit;
float rateToClient;
float rateToPeer;
}
tr_peer;

View file

@ -35,35 +35,6 @@
#include "trevent.h"
#include "utils.h"
/**
*** The "SWIFT" system is described by Karthik Tamilmani,
*** Vinay Pai, and Alexander Mohr of Stony Brook University
*** in their paper "SWIFT: A System With Incentives For Trading"
*** http://citeseer.ist.psu.edu/tamilmani04swift.html
***
*** More SWIFT constants are defined in peer-mgr-private.h
**/
/**
* Allow new peers to download this many bytes from
* us when getting started. This can prevent gridlock
* with other peers using tit-for-tat algorithms
*/
static const int SWIFT_INITIAL_CREDIT = 64 * 1024; /* 64 KiB */
/**
* We expend a fraction of our torrent's total upload speed
* on largesse by uniformly distributing free credit to
* all of our peers. This too helps prevent gridlock.
*/
static const double SWIFT_LARGESSE = 0.15; /* 15% of our UL */
/**
* How frequently to extend largesse-based credit
*/
static const int SWIFT_PERIOD_MSEC = 5000;
enum
{
/* how frequently to change which peers are choked */
@ -135,7 +106,6 @@ typedef struct
tr_timer * reconnectTimer;
tr_timer * rechokeTimer;
tr_timer * refillTimer;
tr_timer * swiftTimer;
tr_torrent * tor;
tr_peer * optimistic; /* the optimistic peer, or NULL if none */
tr_bitfield * requested;
@ -308,7 +278,6 @@ peerConstructor( const struct in_addr * in_addr )
{
tr_peer * p;
p = tr_new0( tr_peer, 1 );
p->credit = SWIFT_INITIAL_CREDIT;
p->rcToClient = tr_rcInit( );
p->rcToPeer = tr_rcInit( );
memcpy( &p->in_addr, in_addr, sizeof(struct in_addr) );
@ -392,7 +361,6 @@ torrentDestructor( Torrent * t )
tr_timerFree( &t->reconnectTimer );
tr_timerFree( &t->rechokeTimer );
tr_timerFree( &t->refillTimer );
tr_timerFree( &t->swiftTimer );
tr_bitfieldFree( t->requested );
tr_ptrArrayFree( t->pool, (PtrArrayForeachFunc)tr_free );
@ -1235,7 +1203,6 @@ tr_peerMgrGetPeers( tr_peerMgr * manager,
static int reconnectPulse( void * vtorrent );
static int rechokePulse( void * vtorrent );
static int swiftPulse( void * vtorrent );
void
tr_peerMgrStartTorrent( tr_peerMgr * manager,
@ -1250,7 +1217,6 @@ tr_peerMgrStartTorrent( tr_peerMgr * manager,
assert( t != NULL );
assert( ( t->isRunning != 0 ) == ( t->reconnectTimer != NULL ) );
assert( ( t->isRunning != 0 ) == ( t->rechokeTimer != NULL ) );
assert( ( t->isRunning != 0 ) == ( t->swiftTimer != NULL ) );
if( !t->isRunning )
{
@ -1264,15 +1230,9 @@ tr_peerMgrStartTorrent( tr_peerMgr * manager,
rechokePulse, t,
RECHOKE_PERIOD_MSEC );
t->swiftTimer = tr_timerNew( t->manager->handle,
swiftPulse, t,
SWIFT_PERIOD_MSEC );
reconnectPulse( t );
rechokePulse( t );
swiftPulse( t );
}
managerUnlock( manager );
@ -1286,7 +1246,6 @@ stopTorrent( Torrent * t )
t->isRunning = 0;
tr_timerFree( &t->rechokeTimer );
tr_timerFree( &t->reconnectTimer );
tr_timerFree( &t->swiftTimer );
/* disconnect the peers. */
tr_ptrArrayForeach( t->peers, (PtrArrayForeachFunc)peerDestructor );
@ -1563,7 +1522,7 @@ isSame( const tr_peer * peer )
***
**/
static double
static int
getWeightedRate( const tr_peer * peer, int clientIsSeed )
{
return (int)( 10.0 * ( clientIsSeed ? peer->rateToPeer
@ -1658,55 +1617,6 @@ rechokePulse( void * vtorrent )
return TRUE;
}
/***
****
***/
static int
swiftPulse( void * vtorrent )
{
Torrent * t = vtorrent;
torrentLock( t );
if( !tr_torrentIsSeed( t->tor ) )
{
int i;
int peerCount = 0;
int deadbeatCount = 0;
tr_peer ** peers = getConnectedPeers( t, &peerCount );
tr_peer ** deadbeats = tr_new( tr_peer*, peerCount );
const double ul_KiBsec = tr_rcRate( t->tor->upload );
const double ul_KiB = ul_KiBsec * (SWIFT_PERIOD_MSEC/1000.0);
const double ul_bytes = ul_KiB * 1024;
const double freeCreditTotal = ul_bytes * SWIFT_LARGESSE;
int freeCreditPerPeer;
for( i=0; i<peerCount; ++i ) {
tr_peer * peer = peers[i];
if( peer->credit <= 0 )
deadbeats[deadbeatCount++] = peer;
}
freeCreditPerPeer = (int)( freeCreditTotal / deadbeatCount );
for( i=0; i<deadbeatCount; ++i )
deadbeats[i]->credit = freeCreditPerPeer;
tordbg( t, "%d deadbeats, "
"who are each being granted %d bytes' credit "
"for a total of %.1f KiB, "
"%d%% of the torrent's ul speed %.1f\n",
deadbeatCount, freeCreditPerPeer,
ul_KiBsec*SWIFT_LARGESSE, (int)(SWIFT_LARGESSE*100), ul_KiBsec );
tr_free( deadbeats );
tr_free( peers );
}
torrentUnlock( t );
return TRUE;
}
/***
****
**** Life and Death
@ -1752,9 +1662,9 @@ shouldPeerBeClosed( const Torrent * t, const tr_peer * peer, int peerCount )
const int relaxStrictnessIfFewerThanN = (int)((getMaxPeerCount(tor) * 0.9) + 0.5);
/* if we have >= relaxIfFewerThan, strictness is 100%.
* if we have zero connections, strictness is 0% */
const double strictness = peerCount >= relaxStrictnessIfFewerThanN
const float strictness = peerCount >= relaxStrictnessIfFewerThanN
? 1.0
: peerCount / (double)relaxStrictnessIfFewerThanN;
: peerCount / (float)relaxStrictnessIfFewerThanN;
const int lo = MIN_UPLOAD_IDLE_SECS;
const int hi = MAX_UPLOAD_IDLE_SECS;
const int limit = lo + ((hi-lo) * strictness);

View file

@ -1160,7 +1160,6 @@ clientGotBytes( tr_peermsgs * msgs, uint32_t byteCount )
tor->activityDate = now;
tor->downloadedCur += byteCount;
msgs->info->pieceDataActivityDate = now;
msgs->info->credit += (int)(byteCount * SWIFT_REPAYMENT_RATIO);
tr_rcTransferred( msgs->info->rcToClient, byteCount );
tr_rcTransferred( tor->download, byteCount );
tr_rcTransferred( tor->handle->download, byteCount );
@ -1383,7 +1382,6 @@ peerGotBytes( tr_peermsgs * msgs, uint32_t byteCount )
tor->activityDate = now;
tor->uploadedCur += byteCount;
msgs->info->pieceDataActivityDate = now;
msgs->info->credit -= byteCount;
tr_rcTransferred( msgs->info->rcToPeer, byteCount );
tr_rcTransferred( tor->upload, byteCount );
tr_rcTransferred( tor->handle->upload, byteCount );
@ -1578,27 +1576,13 @@ sendKeepalive( tr_peermsgs * msgs )
***
**/
static int
isSwiftEnabled( const tr_peermsgs * msgs )
{
/* rationale: SWIFT is good for getting rid of deadbeats, but most
* private trackers have ratios where you _want_ to feed deadbeats
* as much as possible. So we disable SWIFT on private torrents */
return SWIFT_ENABLED
&& !tr_torrentIsSeed( msgs->torrent )
&& !tr_torrentIsPrivate( msgs->torrent );
}
static size_t
getUploadMax( const tr_peermsgs * msgs )
{
static const size_t maxval = ~0;
const tr_torrent * tor = msgs->torrent;
const int useSwift = isSwiftEnabled( msgs );
const size_t swiftLeft = msgs->info->credit;
int speedLeft;
int bufLeft;
size_t ret;
if( tor->uploadLimitMode == TR_SPEEDLIMIT_GLOBAL )
speedLeft = tor->handle->useUploadLimit ? tr_rcBytesLeft( tor->handle->upload ) : maxval;
@ -1611,10 +1595,7 @@ getUploadMax( const tr_peermsgs * msgs )
* queued up in it... blocksize, +13 for the size of the BT protocol's
* block message overhead */
bufLeft = tor->blockSize + 13 - tr_peerIoWriteBytesWaiting( msgs->io );
ret = MIN( speedLeft, bufLeft );
if( useSwift)
ret = MIN( ret, swiftLeft );
return ret;
return MIN( speedLeft, bufLeft );
}
static int

View file

@ -42,8 +42,8 @@ struct tr_transfer
struct tr_ratecontrol
{
int limit;
int newest;
int8_t limit;
int8_t newest;
struct tr_transfer transfers[HISTORY_SIZE];
};

View file

@ -52,6 +52,20 @@ typedef uint32_t tr_file_index_t;
typedef uint32_t tr_piece_index_t;
typedef uint64_t tr_block_index_t;
/**
* @brief returns Transmission's default configuration file directory.
*
* The default configuration directory is determined this way:
* - If the TRANSMISSION_HOME environmental variable is set,
* its value is returned.
* - otherwise, if we're running on Darwin,
* "$HOME/Library/Application Support/Transmission" is returned.
* - otherwise, if we're running on WIN32,
* "$CSIDL_APPDATA/Transmission" is returned.
* - otherwise, if XDG_CONFIG_HOME is set,
* "$XDG_CONFIG_HOME/transmission" is returned.
* - lastly, $HOME/.config/transmission" is used.
*/
const char* tr_getDefaultConfigDir( void );
typedef struct tr_ctor tr_ctor;
@ -72,61 +86,123 @@ typedef struct tr_torrent tr_torrent;
* @{
*/
/** @see tr_sessionInitFull */
#define TR_DEFAULT_CONFIG_DIR tr_getDefaultConfigDir()
/** @see tr_sessionInitFull */
#define TR_DEFAULT_PEX_ENABLED 1
/** @see tr_sessionInitFull */
#define TR_DEFAULT_PORT_FORWARDING_ENABLED 0
/** @see tr_sessionInitFull */
#define TR_DEFAULT_PORT 51413
/** @see tr_sessionInitFull */
#define TR_DEFAULT_GLOBAL_PEER_LIMIT 200
/** @see tr_sessionInitFull */
#define TR_DEFAULT_PEER_SOCKET_TOS 8
/** @see tr_sessionInitFull */
#define TR_DEFAULT_BLOCKLIST_ENABLED 0
/** @see tr_sessionInitFull */
#define TR_DEFAULT_RPC_ENABLED 0
/** @see tr_sessionInitFull */
#define TR_DEFAULT_RPC_PORT 9091
/** @see tr_sessionInitFull */
#define TR_DEFAULT_RPC_PORT_STR "9091"
/** @see tr_sessionInitFull */
#define TR_DEFAULT_RPC_ACL "+127.0.0.1"
/**
* Create and return a Transmission session handle.
* @brief Start a libtransmission session.
* @return an opaque handle to the new session
*
* @param configDir the config directory where libtransmission config
* subdirectories will be found, such as "torrents",
* "resume", and "blocklists".
* TR_DEFAULT_CONFIG_DIR can be used as a default.
* @param downloadDir The default directory to save added torrents.
* @param configDir
* The config directory where libtransmission config subdirectories
* will be found, such as "torrents", "resume", and "blocklists".
* #TR_DEFAULT_CONFIG_DIR can be used as a default.
*
* @param downloadDir
* The default directory to save added torrents.
* This can be changed per-session with
* tr_sessionSetDownloadDir() and per-torrent with
* tr_ctorSetDownloadDir().
* @param tag Obsolete. Only used now for locating legacy fastresume files.
* Valid tags: beos, cli, daemon, gtk, macos, wx
* @param isPexEnabled whether or not PEX is allowed for non-private torrents.
*
* @param tag
* Obsolete. Only used now for locating legacy fastresume files.
* This will be removed at some point in the future.
* Valid tags: beos cli daemon gtk macos wx
*
* @param isPexEnabled
* whether or not PEX is allowed for non-private torrents.
* This can be changed per-session with
* tr_sessionSetPexEnabled().
* TR_DEFAULT_PEX_ENABLED is the default.
* @param isPortForwardingEnabled If true, libtransmission will attempt
* #TR_DEFAULT_PEX_ENABLED is the default.
*
* @param isPortForwardingEnabled
* If true, libtransmission will attempt
* to find a local UPnP-enabled or NATPMP-enabled
* router and forward a port from there to the local
* machine. This is so remote peers can initiate
* connections with us.
* TR_DEFAULT_PORT_FORWARDING_ENABLED is the default.
* @param publicPort Port number to open for incoming peer connections.
* TR_DEFAULT_PORT is the default.
* @param encryptionMode must be one of TR_PLAINTEXT_PREFERRED,
* TR_ENCRYPTION_PREFERRED, or TR_ENCRYPTION_REQUIRED.
* @param isUploadLimitEnabled If true, libtransmission will limit the entire
* session's upload speed from `uploadLimit'.
* @param uploadLimit The speed limit to use for the entire session when
* isUploadLimitEnabled is true.
* @param isDownloadLimitEnabled If true, libtransmission will limit the entire
* session's download speed from `downloadLimit'.
* @param downloadLimit The speed limit to use for the entire session when
* isDownloadLimitEnabled is true.
* @param peerLimit The maximum number of peer connections allowed in a session.
* TR_DEFAULT_GLOBAL_PEER_LIMIT can be used as a default.
* #TR_DEFAULT_PORT_FORWARDING_ENABLED is the default.
*
* @param publicPort
* Port number to open for incoming peer connections.
* #TR_DEFAULT_PORT is the default.
*
* @param encryptionMode
* Must be one of #TR_PLAINTEXT_PREFERRED,
* #TR_ENCRYPTION_PREFERRED, or #TR_ENCRYPTION_REQUIRED.
*
* @param isUploadLimitEnabled
* If true, libtransmission will limit the entire
* session's upload speed from "uploadLimit".
*
* @param uploadLimit
* The speed limit to use for the entire session when
* "isUploadLimitEnabled" is true.
*
* @param isDownloadLimitEnabled
* If true, libtransmission will limit the entire
* session's download speed from "downloadLimit".
*
* @param downloadLimit
* The speed limit to use for the entire session when
* "isDownloadLimitEnabled" is true.
*
* @param peerLimit
* The maximum number of peer connections allowed in a session.
* #TR_DEFAULT_GLOBAL_PEER_LIMIT can be used as a default.
*
* @param messageLevel
* Verbosity level of libtransmission's logging mechanism.
* Must be one of #TR_MSG_ERR, #TR_MSG_INF, #TR_MSG_DBG.
*
* @param isMessageQueueingEnabled
* If true, then messages will build up in a queue until
* processed by the client application.
*
* @param isBlocklistEnabled
* If true, then Transmission will not allow peer connections
* to the IP addressess specified in the blocklist.
*
* @param peerSocketTOS
*
* @param rpcIsEnabled
* If true, then libtransmission will open an http server port
* to listen for incoming RPC requests.
*
* @param rpcPort
* The port on which to listen for incoming RPC requests
*
* @param rpcACL
* The access control list for allowing/denying RPC requests
* from specific IP ranges.
* @see tr_sessionSetRPCACL()
*
* @see TR_DEFAULT_PEER_SOCKET_TOS
* @see TR_DEFAULT_BLOCKLIST_ENABLED
* @see TR_DEFAULT_RPC_ENABLED
* @see TR_DEFAULT_RPC_PORT
* @see TR_DEFAULT_RPC_ACL
* @see tr_sessionClose()
*/
tr_handle * tr_sessionInitFull( const char * configDir,
const char * downloadDir,
@ -146,17 +222,20 @@ tr_handle * tr_sessionInitFull( const char * configDir,
int peerSocketTOS,
int rpcIsEnabled,
int rpcPort,
const char * rpcACL );
const char * rpcAccessControlList );
/**
* Like tr_sessionInitFull() but with default values supplied.
* @brief shorter form of tr_sessionInitFull()
*
* @deprecated Use tr_sessionInitFull() instead.
*/
tr_handle * tr_sessionInit( const char * configDir,
const char * downloadDir,
const char * tag );
/**
* Shut down a libtransmission instance created by tr_sessionInit*()
* @brief end a libtransmission session
* @see tr_sessionInitFull()
*/
void tr_sessionClose( tr_handle * );
@ -170,18 +249,43 @@ const char * tr_sessionGetConfigDir( const tr_handle * );
/**
* Set the per-session default download folder for new torrents.
* @see tr_sessionInitFull()
* @see tr_sessionGetDownloadDir()
* @see tr_ctorSetDownloadDir()
*/
void tr_sessionSetDownloadDir( tr_handle *, const char * downloadDir );
/**
* Get the default download folder for new torrents.
*
* This is set by tr_sessionInitFull() or tr_sessionSetDownloadDir(),
* and can be overridden on a per-torrent basis by tr_ctorSetDownloadDir().
*/
const char * tr_sessionGetDownloadDir( const tr_handle * );
/**
* @brief Set whether or not RPC calls are allowed in this session.
*
* @details If true, libtransmission will open a server socket to listen
* for incoming http RPC requests as described in docs/rpc-spec.txt.
*
* This is intially set by tr_sessionInitFull() and can be
* queried by tr_sessionIsRPCEnabled().
*/
void tr_sessionSetRPCEnabled( tr_handle *, int isEnabled );
/** @brief Get whether or not RPC calls are allowed in this session.
@see tr_sessionInitFull()
@see tr_sessionSetRPCEnabled() */
int tr_sessionIsRPCEnabled( const tr_handle * handle );
/** @brief Specify which port to listen for RPC requests on.
@see tr_sessionInitFull()
@see tr_sessionGetRPCPort */
void tr_sessionSetRPCPort( tr_handle *, int port );
/** @brief Get which port to listen for RPC requests on.
@see tr_sessionInitFull()
@see tr_sessionSetRPCPort */
int tr_sessionGetRPCPort( const tr_handle * );
/**
@ -197,9 +301,15 @@ int tr_sessionGetRPCPort( const tr_handle * );
* Client applications need to validate user input, or better yet
* generate it from a higher-level interface that doesn't allow user error,
* before calling this function.
*
* @see tr_sessionInitFull
* @see tr_sessionGetRPCACL
*/
void tr_sessionSetRPCACL( tr_handle *, const char * acl );
/** Returns the Access Control List for allowing/denying RPC requests.
@see tr_sessionInitFull
@see tr_sessionSetRPCACL */
const char* tr_sessionGetRPCACL( const tr_handle * );
typedef enum
@ -231,9 +341,9 @@ void tr_sessionSetRPCCallback( tr_handle * handle,
typedef struct tr_session_stats
{
float ratio; /* TR_RATIO_INF, TR_RATIO_NA, or total up/down */
uint64_t uploadedBytes; /* total up */
uint64_t downloadedBytes; /* total down */
double ratio; /* TR_RATIO_INF, TR_RATIO_NA, or total up/down */
uint64_t filesAdded; /* number of files added */
uint64_t sessionCount; /* program started N times */
uint64_t secondsActive; /* how long Transmisson's been running */