divide error logic in tracker code into multiple variables, allowing to determine if all errors in connecting were from unreachable trackers

This commit is contained in:
Mitchell Livingston 2006-12-23 21:18:58 +00:00
parent 594d887a36
commit 0aa4d36809
1 changed files with 43 additions and 28 deletions

View File

@ -73,16 +73,13 @@ struct tr_tracker_s
int randOffset;
int completelyUnconnectable;
int allUnreachIfError;
int lastError;
uint64_t dateTry;
uint64_t dateOk;
uint64_t dateScrape;
int lastScrapeFailed;
#define TC_ATTEMPT_NOREACH 1
#define TC_ATTEMPT_ERROR 2
#define TC_ATTEMPT_OK 4
char lastAttempt;
int scrapeNeeded;
tr_http_t * http;
@ -121,7 +118,8 @@ tr_tracker_t * tr_trackerInit( tr_torrent_t * tor )
tc->interval = 300;
tc->scrapeInterval = 600;
tc->lastAttempt = TC_ATTEMPT_NOREACH;
tc->lastError = 1;
tc->allUnreachIfError = 1;
tc->bindPort = *(tor->bindPort);
tc->newPort = -1;
@ -225,21 +223,32 @@ static int shouldConnect( tr_tracker_t * tc )
now = tr_date();
/* Unreachable tracker, wait 10 seconds + random value before trying again */
if( tc->lastAttempt == TC_ATTEMPT_NOREACH &&
now < tc->dateTry + tc->randOffset + 10000 )
/* If last was an error and it should not change trackers, then all must have been errors */
if( tc->lastError )
{
/* Unreachable trackers, wait 10 seconds + random value before trying again */
if( tc->allUnreachIfError )
{
if( now < tc->dateTry + tc->randOffset + 10000 )
{
return 0;
}
}
/* The tracker rejected us (like 4XX code, unauthorized IP...),
don't hammer it - we'll probably get the same answer next time
anyway */
if( tc->lastAttempt == TC_ATTEMPT_ERROR &&
now < tc->dateTry + 1000 * tc->interval + tc->randOffset )
else
{
if( now < tc->dateTry + 1000 * tc->interval + tc->randOffset )
{
return 0;
}
else
{
tc->allUnreachIfError = 1;
}
}
}
/* Do we need to send an event? */
if( tc->started || tc->completed || tc->stopped || 0 < tc->newPort )
@ -428,12 +437,14 @@ void tr_trackerPulse( tr_tracker_t * tc )
tc->dateTry = tr_date();
failureAnnouncing( tc );
tc->lastError = 1;
if ( tc->shouldChangeAnnounce == TC_CHANGE_NEXT )
{
tr_trackerPulse( tc );
return;
}
tc->lastAttempt = TC_ATTEMPT_NOREACH;
break;
@ -640,7 +651,7 @@ static void readAnswer( tr_tracker_t * tc, const char * data, int len )
{
/* We don't have a valid HTTP status line */
tr_inf( "Tracker: invalid HTTP status line" );
tc->lastAttempt = TC_ATTEMPT_NOREACH;
tc->lastError = 1;
failureAnnouncing( tc );
return;
}
@ -667,7 +678,8 @@ static void readAnswer( tr_tracker_t * tc, const char * data, int len )
{
/* we didn't get a 2xx status code */
tr_err( "Tracker: invalid HTTP status code: %i", code );
tc->lastAttempt = TC_ATTEMPT_ERROR;
tc->lastError = 1;
tc->allUnreachIfError = 0;
failureAnnouncing( tc );
return;
}
@ -677,7 +689,7 @@ static void readAnswer( tr_tracker_t * tc, const char * data, int len )
if( NULL == body )
{
tr_err( "Tracker: could not find end of HTTP headers" );
tc->lastAttempt = TC_ATTEMPT_NOREACH;
tc->lastError = 1;
failureAnnouncing( tc );
return;
}
@ -698,11 +710,12 @@ static void readAnswer( tr_tracker_t * tc, const char * data, int len )
{
if( tc->stopped || 0 < tc->newPort )
{
tc->lastAttempt = TC_ATTEMPT_OK;
tc->lastError = 0;
goto nodict;
}
tr_err( "Tracker: no valid dictionary found in answer" );
tc->lastAttempt = TC_ATTEMPT_ERROR;
tc->lastError = 1;
tc->allUnreachIfError = 0;
failureAnnouncing( tc );
return;
}
@ -715,7 +728,8 @@ static void readAnswer( tr_tracker_t * tc, const char * data, int len )
tor->error |= TR_ETRACKER;
snprintf( tor->trackerError, sizeof( tor->trackerError ),
"%s", bePeers->val.s.s );
tc->lastAttempt = TC_ATTEMPT_ERROR;
tc->lastError = 1;
tc->allUnreachIfError = 0;
failureAnnouncing( tc );
goto cleanup;
}
@ -731,7 +745,8 @@ static void readAnswer( tr_tracker_t * tc, const char * data, int len )
}
tor->error &= ~TR_ETRACKER;
tc->lastAttempt = TC_ATTEMPT_OK;
tc->lastError = 0;
tc->allUnreachIfError = 0;
/* Get the tracker interval, force to between
10 sec and 5 mins */