From 61459be9556bac62b300bf96d2d16c33f9e7dd5d Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 18 Oct 2017 16:03:20 +0200 Subject: [SERVER] More tweaks to alt-server selection wrt proxy cycles This needs an overhaul; status needs to be moved from global alt-servers list to individual uplinks --- src/server/altservers.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/server/altservers.c b/src/server/altservers.c index 04d93e5..3a9eda5 100644 --- a/src/server/altservers.c +++ b/src/server/altservers.c @@ -460,12 +460,17 @@ static void *altservers_main(void *data UNUSED) } clock_gettime( CLOCK_MONOTONIC, &end ); // Measurement done - everything fine so far - const unsigned int rtt = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000; // µs - unsigned int avg = altservers_updateRtt( &servers[itAlt], rtt ); spin_lock( &uplink->rttLock ); const bool isCurrent = isSameAddressPort( &servers[itAlt], &uplink->currentServer ); - // If a cycle was detected, or we lost connection to the current (last) server, penaltize it - if ( ( uplink->cycleDetected || uplink->fd == -1 ) && isCurrent ) avg = (avg * 2) + 100000; + // Penaltize rtt if this was a cycle; this will treat this server with lower priority + // in the near future too, so we prevent alternating between two servers that are both + // part of a cycle and have the lowest latency. + const unsigned int rtt = (end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_nsec - start.tv_nsec) / 1000 + + ( (isCurrent && uplink->cycleDetected) ? 1000000 : 0 ); // µs + unsigned int avg = altservers_updateRtt( &servers[itAlt], rtt ); + // If a cycle was detected, or we lost connection to the current (last) server, penaltize it one time + if ( ( uplink->cycleDetected || uplink->fd == -1 ) && isCurrent ) avg = (avg * 2) + 50000; spin_unlock( &uplink->rttLock ); if ( uplink->fd != -1 && isCurrent ) { // Was measuring current server -- cgit v1.2.3-55-g7522