diff options
author | Simon Rettberg | 2017-10-18 16:03:20 +0200 |
---|---|---|
committer | Simon Rettberg | 2017-10-18 16:03:20 +0200 |
commit | 61459be9556bac62b300bf96d2d16c33f9e7dd5d (patch) | |
tree | 7425f894df0356684dc60e93c44e52b7018435bc /src/server/altservers.c | |
parent | [SERVER] Don't try to load metadata files as images; fix clang-analyzer false... (diff) | |
download | dnbd3-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.c | 13 |
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 |