Ticket #71: r555_ticket71.patch

File r555_ticket71.patch, 3.0 KB (added by brent, 16 years ago)

(4th try) same as above, but fixes bug where tc->interval is never changed from default

  • libtransmission/tracker.c

     
    3535    char           stopped;
    3636
    3737    int            interval;
     38    int            min_interval;
    3839    int            seeders;
    3940    int            leechers;
    4041    int            hasManyPeers;
     
    8081    tc->started  = 1;
    8182
    8283    tc->interval = 300;
     84    tc->min_interval = 0;
    8385    tc->seeders  = -1;
    8486    tc->leechers = -1;
    8587
     
    133135       the tracker a bit until we get a decent number of peers */
    134136    if( tc->hasManyPeers )
    135137    {
    136         if( tc->tor->peerCount < 5 && now > tc->dateOk + 10000 )
    137         {
    138             return 1;
     138        /* If there is a min interval specified, respect it */
     139        if( tc->min_interval > 0 ){
     140                        if( tc->tor->peerCount < 30 && now > tc->dateOk + 1000 * tc->min_interval )
     141                        {
     142                                return 1;
     143                        }
     144        }
     145        /* Gentle hammering */
     146        else {
     147                        if( tc->tor->peerCount < 10 && now > tc->dateOk + 60000 )
     148                        {
     149                                return 1;
     150                        }
     151                        if( tc->tor->peerCount < 20 && now > tc->dateOk + 120000 )
     152                        {
     153                                return 1;
     154                        }                       
    139155        }
    140         if( tc->tor->peerCount < 10 && now > tc->dateOk + 20000 )
    141         {
    142             return 1;
    143         }
    144         if( tc->tor->peerCount < 15 && now > tc->dateOk + 30000 )
    145         {
    146             return 1;
    147         }
    148156    }
    149157
    150158    return 0;
     
    481489    tor->error &= ~TR_ETRACKER;
    482490    tc->lastAttempt = TC_ATTEMPT_OK;
    483491
    484     if( !tc->interval )
    485     {
    486         /* Get the tracker interval, ignore it if it is not between
    487            10 sec and 5 mins */
    488         if( !( beFoo = tr_bencDictFind( &beAll, "interval" ) ) ||
    489             !( beFoo->type & TYPE_INT ) )
    490         {
    491             tr_err( "Tracker: no 'interval' field" );
    492             goto cleanup;
    493         }
    494492
    495         tc->interval = beFoo->val.i;
    496         tc->interval = MIN( tc->interval, 300 );
    497         tc->interval = MAX( 10, tc->interval );
     493        /* Get the tracker interval, ignore it if it is under
     494           10 sec */
     495        if( !( beFoo = tr_bencDictFind( &beAll, "interval" ) ) ||
     496                !( beFoo->type & TYPE_INT ) )
     497        {
     498                tr_err( "Tracker: no 'interval' field" );
     499                goto cleanup;
     500        }
    498501
    499         tr_inf( "Tracker: interval = %d seconds", tc->interval );
    500     }
     502        tc->interval = beFoo->val.i;
     503        tc->interval = MAX( 10, tc->interval );
    501504
     505        tr_inf( "Tracker: interval = %d seconds", tc->interval );
     506
     507
     508        /* Get min interval */
     509        if( ( beFoo = tr_bencDictFind( &beAll, "min interval" ) ) &&
     510                ( beFoo->type & TYPE_INT ) )
     511        {
     512                 tc->min_interval = beFoo->val.i;
     513                 tr_inf( "Tracker: minimum interval = %d seconds", tc->min_interval );
     514                 //interval should not be less than min_interval
     515                 if( tc->interval < tc->min_interval )
     516                 {
     517                        tc->interval = tc->min_interval;
     518                        tr_inf( "Tracker: interval = %d seconds, adjusted by minimum interval", tc->interval );
     519                 }
     520        }           
     521
    502522    if( ( beFoo = tr_bencDictFind( &beAll, "complete" ) ) &&
    503523        ( beFoo->type & TYPE_INT ) )
    504524    {