mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
timeout estimation code.
git-svn-id: file:///svn/unbound/trunk@317 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
09420fde81
commit
f060064e38
5 changed files with 209 additions and 1 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
14 May 2007: Wouter
|
14 May 2007: Wouter
|
||||||
- Port to OS/X and Dec Alpha. Printf format and alignment fixes.
|
- Port to OS/X and Dec Alpha. Printf format and alignment fixes.
|
||||||
- extensive lock debug report on join timeout.
|
- extensive lock debug report on join timeout.
|
||||||
|
- proper RTT calculation, in utility code.
|
||||||
|
|
||||||
11 May 2007: Wouter
|
11 May 2007: Wouter
|
||||||
- iterator/iterator.c module.
|
- iterator/iterator.c module.
|
||||||
|
|
|
||||||
|
|
@ -756,7 +756,8 @@ thread_debug_info(struct thr_check* thr)
|
||||||
(thr->arg?*(int*)thr->arg:0));
|
(thr->arg?*(int*)thr->arg:0));
|
||||||
log_info("thread num is %d", thr->num);
|
log_info("thread num is %d", thr->num);
|
||||||
log_info("locks created %d", thr->locks_created);
|
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);
|
fflush(thr->order_info);
|
||||||
w = thr->waiting;
|
w = thr->waiting;
|
||||||
f = thr->holding_first;
|
f = thr->holding_first;
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,30 @@ net_test()
|
||||||
unit_assert( !is_pow2(259) );
|
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.
|
* Main unit test program. Setup, teardown and report errors.
|
||||||
* @param argc: arg count.
|
* @param argc: arg count.
|
||||||
|
|
@ -137,6 +161,7 @@ main(int argc, char* argv[])
|
||||||
checklock_start();
|
checklock_start();
|
||||||
net_test();
|
net_test();
|
||||||
dname_test();
|
dname_test();
|
||||||
|
rtt_test();
|
||||||
alloc_test();
|
alloc_test();
|
||||||
lruhash_test();
|
lruhash_test();
|
||||||
slabhash_test();
|
slabhash_test();
|
||||||
|
|
|
||||||
92
util/rtt.c
Normal file
92
util/rtt.c
Normal 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
89
util/rtt.h
Normal 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 */
|
||||||
Loading…
Reference in a new issue