From fd4c68d75b5e06868c8dfd1b1078694460a1ad41 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Wed, 17 Jul 2019 17:13:17 +0200 Subject: added some comments and macros --- src/kernel/net.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'src/kernel/net.c') diff --git a/src/kernel/net.c b/src/kernel/net.c index d493994..2edb422 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -548,7 +548,7 @@ static struct dnbd3_server *dnbd3_find_best_alt_server(struct dnbd3_device *dev) } } - best_rtt = current_best_rtt * 10; // TODO add DEFINE to control this + best_rtt = RTT_THRESOULD_LIMIT(current_best_rtt); debug_dev(dev, "best connected rtt is %llu, searching for rtt better than %llu", current_best_rtt, best_rtt); for (i = 0; i < NUMBER_SERVERS; i++) { @@ -581,7 +581,7 @@ static bool dnbd3_better_rtt(struct dnbd3_server *new_server, struct dnbd3_serve uint64_t new_rtt = (new_server->rtts[0] + new_server->rtts[1] + new_server->rtts[2] + new_server->rtts[3]) / 4; uint64_t existing_rtt = (existing_server->rtts[0] + existing_server->rtts[1] + existing_server->rtts[2] + existing_server->rtts[3]) / 4; - if (new_rtt < ((existing_rtt * 2)/3)) { //TODO add macro to control this + if (new_rtt < RTT_THRESHOLD_FACTOR(existing_rtt)) { return true; } return false; @@ -590,6 +590,8 @@ static bool dnbd3_better_rtt(struct dnbd3_server *new_server, struct dnbd3_serve static void dnbd3_adjust_connections(struct dnbd3_device *dev) { int i; int sock_alive = 0; + uint64_t rtt; + uint64_t best_rtt = RTT_UNREACHABLE; struct dnbd3_server *server, *existing_server; // connect empty sockets @@ -627,6 +629,28 @@ static void dnbd3_adjust_connections(struct dnbd3_device *dev) { } } + // remove a socket if it is much slower than the others + if (sock_alive > 1) { + for (i = 0; i < NUMBER_CONNECTIONS; i++) { + if (dnbd3_is_sock_alive(dev->socks[i])) { + rtt = (dev->socks[i].server->rtts[0] + dev->socks[i].server->rtts[1] + dev->socks[i].server->rtts[2] + dev->socks[i].server->rtts[3]) / 4; + if (rtt <= best_rtt) { + best_rtt = rtt; + } + } + } + for (i = 0; i < NUMBER_CONNECTIONS; i++) { + if (dnbd3_is_sock_alive(dev->socks[i])) { + rtt = (dev->socks[i].server->rtts[0] + dev->socks[i].server->rtts[1] + dev->socks[i].server->rtts[2] + dev->socks[i].server->rtts[3]) / 4; + if (rtt > RTT_THRESOULD_LIMIT(best_rtt)) { + info_sock(&dev->socks[i], "removing connection with rtt %llu", rtt); + dnbd3_socket_disconnect(dev, NULL, &dev->socks[i]); + sock_alive--; + } + } + } + } + debug_dev(dev, "connected to %d/%d sockets", sock_alive, NUMBER_CONNECTIONS); } @@ -972,6 +996,9 @@ error: return result; } +/** + * connect a dnbd3 device to a server + */ static int dnbd3_socket_connect(struct dnbd3_device *dev, struct dnbd3_server *server) { int i; -- cgit v1.2.3-55-g7522