(libT) slightly more accurate reporting of piece data vs. raw data
This commit is contained in:
parent
ff651209c8
commit
9de7ccf7da
|
@ -241,7 +241,7 @@ tr_bandwidthIsLimited( const tr_bandwidth * b,
|
|||
}
|
||||
|
||||
#if 0
|
||||
#define DEBUG_DIRECTION TR_DOWN
|
||||
#define DEBUG_DIRECTION TR_UP
|
||||
#endif
|
||||
|
||||
void
|
||||
|
@ -249,38 +249,47 @@ tr_bandwidthAllocate( tr_bandwidth * b,
|
|||
tr_direction dir,
|
||||
int period_msec )
|
||||
{
|
||||
const double currentSpeed = tr_bandwidthGetPieceSpeed( b, dir ); /* KiB/s */
|
||||
const double desiredSpeed = b->band[dir].desiredSpeed; /* KiB/s */
|
||||
const double seconds_per_pulse = period_msec / 1000.0;
|
||||
const double current_bytes_per_pulse = currentSpeed * 1024.0 * seconds_per_pulse;
|
||||
const double desired_bytes_per_pulse = desiredSpeed * 1024.0 * seconds_per_pulse;
|
||||
const double pulses_per_history = (double)HISTORY_MSEC / period_msec;
|
||||
const double min = desired_bytes_per_pulse * 0.90;
|
||||
const double max = desired_bytes_per_pulse * 1.20;
|
||||
const double next_pulse_bytes = desired_bytes_per_pulse * ( pulses_per_history + 1 )
|
||||
- ( current_bytes_per_pulse * pulses_per_history );
|
||||
double clamped;
|
||||
double clamped = 0;
|
||||
|
||||
/* clamp the return value to lessen oscillation */
|
||||
clamped = next_pulse_bytes;
|
||||
clamped = MAX( clamped, min );
|
||||
clamped = MIN( clamped, max );
|
||||
b->band[dir].bytesLeft = clamped;
|
||||
assert( isBandwidth( b ) );
|
||||
assert( isDirection( dir ) );
|
||||
|
||||
if( b->band[dir].isLimited )
|
||||
{
|
||||
const double currentSpeed = tr_bandwidthGetPieceSpeed( b, dir ); /* KiB/s */
|
||||
const double desiredSpeed = b->band[dir].desiredSpeed; /* KiB/s */
|
||||
const double seconds_per_pulse = period_msec / 1000.0;
|
||||
const double current_bytes_per_pulse = currentSpeed * 1024.0 * seconds_per_pulse;
|
||||
const double desired_bytes_per_pulse = desiredSpeed * 1024.0 * seconds_per_pulse;
|
||||
const double pulses_per_history = (double)HISTORY_MSEC / period_msec;
|
||||
const double min = desired_bytes_per_pulse * 0.85;
|
||||
const double max = desired_bytes_per_pulse * 1.15;
|
||||
const double next_pulse_bytes = desired_bytes_per_pulse * ( pulses_per_history + 1 )
|
||||
- ( current_bytes_per_pulse * pulses_per_history );
|
||||
|
||||
/* clamp the return value to lessen oscillation */
|
||||
clamped = next_pulse_bytes;
|
||||
clamped = MAX( clamped, min );
|
||||
clamped = MIN( clamped, max );
|
||||
|
||||
b->band[dir].bytesLeft = clamped;
|
||||
|
||||
#ifdef DEBUG_DIRECTION
|
||||
if( dir == DEBUG_DIRECTION )
|
||||
fprintf( stderr, "bandwidth %p currentSpeed(%5.2f) desiredSpeed(%5.2f), allocating %5.2f (unclamped: %5.2f)\n",
|
||||
b, currentSpeed, desiredSpeed,
|
||||
clamped/1024.0, next_pulse_bytes/1024.0 );
|
||||
if( dir == DEBUG_DIRECTION )
|
||||
fprintf( stderr, "bandwidth %p currentPieceSpeed(%5.2f of %5.2f) desiredSpeed(%5.2f), allocating %5.2f (unclamped: %5.2f)\n",
|
||||
b, currentSpeed, tr_bandwidthGetRawSpeed( b, dir ), desiredSpeed,
|
||||
clamped/1024.0, next_pulse_bytes/1024.0 );
|
||||
#endif
|
||||
}
|
||||
|
||||
/* notify the io buffers that there's more bandwidth available */
|
||||
if( !b->band[dir].isLimited || ( clamped > 0 ) ) {
|
||||
if( !b->band[dir].isLimited || ( clamped > 0.001 ) )
|
||||
{
|
||||
int i, n=0;
|
||||
short what = dir==TR_UP ? EV_WRITE : EV_READ;
|
||||
struct tr_iobuf ** iobufs = (struct tr_iobuf**) tr_ptrArrayPeek( b->iobufs, &n );
|
||||
#ifdef DEBUG_DIRECTION
|
||||
if( dir == DEBUG_DIRECTION )
|
||||
if( ( dir == DEBUG_DIRECTION ) && ( n > 1 ) )
|
||||
fprintf( stderr, "bandwidth %p has %d iobufs\n", b, n );
|
||||
#endif
|
||||
for( i=0; i<n; ++i )
|
||||
|
@ -369,18 +378,22 @@ tr_bandwidthUsed( tr_bandwidth * b,
|
|||
int isPieceData )
|
||||
{
|
||||
struct tr_band * band;
|
||||
size_t oldBytesLeft;
|
||||
|
||||
assert( isBandwidth( b ) );
|
||||
assert( isDirection( dir ) );
|
||||
|
||||
band = &b->band[dir];
|
||||
|
||||
oldBytesLeft = band->bytesLeft;
|
||||
|
||||
if( band->isLimited && isPieceData )
|
||||
band->bytesLeft -= MIN( band->bytesLeft, byteCount );
|
||||
|
||||
#ifdef DEBUG_DIRECTION
|
||||
if( ( dir == DEBUG_DIRECTION ) && band->isLimited && isPieceData )
|
||||
fprintf( stderr, "%p consumed %zu bytes of piece data... %zu left\n", b, byteCount, band->bytesLeft );
|
||||
if( ( dir == DEBUG_DIRECTION ) && ( band->isLimited ) )
|
||||
fprintf( stderr, "%p consumed %5zu bytes of %5s data... was %6zu, now %6zu left\n",
|
||||
b, byteCount, (isPieceData?"piece":"raw"), oldBytesLeft, band->bytesLeft );
|
||||
#endif
|
||||
|
||||
bytesUsed( &band->raw, byteCount );
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#define IO_TIMEOUT_SECS 8
|
||||
|
||||
static size_t
|
||||
addPacketOverhead( size_t d )
|
||||
getPacketOverhead( size_t d )
|
||||
{
|
||||
/**
|
||||
* http://sd.wareonearth.com/~phil/net/overhead/
|
||||
|
@ -59,7 +59,7 @@ addPacketOverhead( size_t d )
|
|||
*/
|
||||
static const double assumed_payload_data_rate = 94.0;
|
||||
|
||||
return (size_t)( d * ( 100.0 / assumed_payload_data_rate ) );
|
||||
return (size_t)( d * ( 100.0 / assumed_payload_data_rate ) - d );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -127,16 +127,19 @@ didWriteWrapper( struct tr_iobuf * iobuf,
|
|||
while( bytes_transferred )
|
||||
{
|
||||
struct tr_datatype * next = io->output_datatypes->data;
|
||||
const size_t chunk_length = MIN( next->length, bytes_transferred );
|
||||
const size_t n = addPacketOverhead( chunk_length );
|
||||
const size_t payload = MIN( next->length, bytes_transferred );
|
||||
const size_t overhead = getPacketOverhead( payload );
|
||||
|
||||
tr_bandwidthUsed( io->bandwidth, TR_UP, n, next->isPieceData );
|
||||
tr_bandwidthUsed( io->bandwidth, TR_UP, payload, next->isPieceData );
|
||||
|
||||
if( overhead > 0 )
|
||||
tr_bandwidthUsed( io->bandwidth, TR_UP, overhead, FALSE );
|
||||
|
||||
if( io->didWrite )
|
||||
io->didWrite( io, n, next->isPieceData, io->userData );
|
||||
io->didWrite( io, payload, next->isPieceData, io->userData );
|
||||
|
||||
bytes_transferred -= chunk_length;
|
||||
next->length -= chunk_length;
|
||||
bytes_transferred -= payload;
|
||||
next->length -= payload;
|
||||
if( !next->length )
|
||||
tr_free( tr_list_pop_front( &io->output_datatypes ) );
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ enum
|
|||
RECONNECT_PERIOD_MSEC = ( 2 * 1000 ),
|
||||
|
||||
/* how frequently to reallocate bandwidth */
|
||||
BANDWIDTH_PERIOD_MSEC = 200,
|
||||
BANDWIDTH_PERIOD_MSEC = 250,
|
||||
|
||||
/* max # of peers to ask fer per torrent per reconnect pulse */
|
||||
MAX_RECONNECTIONS_PER_PULSE = 4,
|
||||
|
|
Loading…
Reference in New Issue