The old algorithm tries to converge to 0, despite it would mean a very
unbalanced situation. We're aiming for an ideal ratio of 1, meaning both
the 'from' and 'to' slave have the same load. Therefore, we only move an
entry if it decreases the load on 'from', and brings us closer to equal
traffic load.
Signed-off-by: Zoltan Kiss <zoltan.kiss@citrix.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
#include <limits.h>
#include <stdint.h>
#include <stdlib.h>
+#include <math.h>
#include "coverage.h"
#include "dynamic-string.h"
delta = e->tx_bytes;
old_ratio = (double)from->tx_bytes / to_tx_bytes;
new_ratio = (double)(from->tx_bytes - delta) / (to_tx_bytes + delta);
- if (old_ratio - new_ratio > 0.1) {
- /* Would decrease the ratio, move it. */
+ if (old_ratio - new_ratio > 0.1
+ && fabs(new_ratio - 1.0) < fabs(old_ratio - 1.0)) {
+ /* We're aiming for an ideal ratio of 1, meaning both the 'from'
+ and 'to' slave have the same load. Therefore, we only move an
+ entry if it decreases the load on 'from', and brings us closer
+ to equal traffic load. */
return e;
}
}