timeout estimation code.

git-svn-id: file:///svn/unbound/trunk@317 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2007-05-14 13:22:02 +00:00
parent 09420fde81
commit f060064e38
5 changed files with 209 additions and 1 deletions

View file

@ -1,6 +1,7 @@
14 May 2007: Wouter
- Port to OS/X and Dec Alpha. Printf format and alignment fixes.
- extensive lock debug report on join timeout.
- proper RTT calculation, in utility code.
11 May 2007: Wouter
- iterator/iterator.c module.

View file

@ -756,7 +756,8 @@ thread_debug_info(struct thr_check* thr)
(thr->arg?*(int*)thr->arg:0));
log_info("thread num is %d", thr->num);
log_info("locks created %d", thr->locks_created);
log_info("FILE for lockinfo: %x. flushing.", (int)thr->order_info);
log_info("open file for lockinfo: %s",
thr->order_info?"yes, flushing":"no");
fflush(thr->order_info);
w = thr->waiting;
f = thr->holding_first;

View file

@ -119,6 +119,30 @@ net_test()
unit_assert( !is_pow2(259) );
}
#include "util/rtt.h"
/** test RTT code */
static void
rtt_test()
{
int i;
struct rtt_info r;
rtt_init(&r);
/* initial value sensible */
unit_assert( rtt_timeout(&r) == 3000 );
rtt_lost(&r);
unit_assert( rtt_timeout(&r) == 6000 );
rtt_lost(&r);
unit_assert( rtt_timeout(&r) == 12000 );
rtt_update(&r, 4000);
unit_assert( rtt_timeout(&r) >= 5000 );
rtt_lost(&r);
for(i=0; i<100; i++) {
rtt_lost(&r);
unit_assert( rtt_timeout(&r) > RTT_MIN_TIMEOUT-1);
unit_assert( rtt_timeout(&r) < RTT_MAX_TIMEOUT+1);
}
}
/**
* Main unit test program. Setup, teardown and report errors.
* @param argc: arg count.
@ -137,6 +161,7 @@ main(int argc, char* argv[])
checklock_start();
net_test();
dname_test();
rtt_test();
alloc_test();
lruhash_test();
slabhash_test();

92
util/rtt.c Normal file
View file

@ -0,0 +1,92 @@
/*
* util/rtt.c - UDP round trip time estimator for resend timeouts.
*
* Copyright (c) 2007, NLnet Labs. All rights reserved.
*
* This software is open source.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the NLNET LABS nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* \file
*
* This file contains a data type and functions to help estimate good
* round trip times for UDP resend timeout values.
*/
#include "config.h"
#include "util/rtt.h"
#include "util/log.h"
/** calculate RTO from rtt information */
static int
calc_rto(const struct rtt_info* rtt)
{
/* From Stevens, Unix Network Programming, p.598 */
int rto = rtt->srtt + 4*rtt->rttvar;
if(rto < RTT_MIN_TIMEOUT)
rto = RTT_MIN_TIMEOUT;
if(rto > RTT_MAX_TIMEOUT)
rto = RTT_MAX_TIMEOUT;
return rto;
}
void
rtt_init(struct rtt_info* rtt)
{
rtt->srtt = 0;
rtt->rttvar = 750;
rtt->rto = calc_rto(rtt);
/* first RTO is 0 + 4*0.75 = 3 seconds */
}
int
rtt_timeout(const struct rtt_info* rtt)
{
return rtt->rto;
}
void
rtt_update(struct rtt_info* rtt, int ms)
{
int delta = ms - rtt->srtt;
rtt->srtt += delta / 8; /* g = 1/8 */
if(delta < 0)
delta = -delta; /* |delta| */
rtt->rttvar += (delta - rtt->rttvar) / 4; /* h = 1/4 */
rtt->rto = calc_rto(rtt);
}
void
rtt_lost(struct rtt_info* rtt)
{
/* exponential backoff */
rtt->rto *= 2;
if(rtt->rto > RTT_MAX_TIMEOUT)
rtt->rto = RTT_MAX_TIMEOUT;
}

89
util/rtt.h Normal file
View file

@ -0,0 +1,89 @@
/*
* util/rtt.h - UDP round trip time estimator for resend timeouts.
*
* Copyright (c) 2007, NLnet Labs. All rights reserved.
*
* This software is open source.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* Neither the name of the NLNET LABS nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* \file
*
* This file contains a data type and functions to help estimate good
* round trip times for UDP resend timeout values.
*/
#ifndef UTIL_RTT_H
#define UTIL_RTT_H
/**
* RTT information. Keeps packet Round Trip Time.
*/
struct rtt_info {
/** smoothed rtt estimator, in milliseconds */
int srtt;
/** smoothed mean deviation, in milliseconds */
int rttvar;
/** current RTO in use, in milliseconds */
int rto;
};
/** min retransmit timeout value, in milliseconds */
#define RTT_MIN_TIMEOUT 2000
/** max retransmit timeout value, in milliseconds */
#define RTT_MAX_TIMEOUT 120000
/**
* Initialize RTT estimators.
* @param rtt: The structure. Caller is responsible for allocation of it.
*/
void rtt_init(struct rtt_info* rtt);
/**
* Get timeout to use for sending a UDP packet.
* @param rtt: round trip statistics structure.
* @return: timeout to use in milliseconds. Relative time value.
*/
int rtt_timeout(const struct rtt_info* rtt);
/**
* Update the statistics with a new roundtrip estimate observation.
* @param rtt: round trip statistics structure.
* @param ms: estimate of roundtrip time in milliseconds.
*/
void rtt_update(struct rtt_info* rtt, int ms);
/**
* Update the statistics with a new timout expired observation.
* @param rtt: round trip statistics structure.
*/
void rtt_lost(struct rtt_info* rtt);
#endif /* UTIL_RTT_H */