summaryrefslogtreecommitdiffstats
path: root/src/server/altservers.c
diff options
context:
space:
mode:
authorSimon Rettberg2017-10-18 16:03:20 +0200
committerSimon Rettberg2017-10-18 16:03:20 +0200
commit61459be9556bac62b300bf96d2d16c33f9e7dd5d (patch)
tree7425f894df0356684dc60e93c44e52b7018435bc /src/server/altservers.c
parent[SERVER] Don't try to load metadata files as images; fix clang-analyzer false... (diff)
downloaddnbd3-61459be9556bac62b300bf96d2d16c33f9e7dd5d.tar.gz
dnbd3-61459be9556bac62b300bf96d2d16c33f9e7dd5d.tar.xz
dnbd3-61459be9556bac62b300bf96d2d16c33f9e7dd5d.zip
[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
Diffstat (limited to 'src/server/altservers.c')
-rw-r--r--src/server/altservers.c13
1 files 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