summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
authorFrederic Robra2019-07-17 17:13:17 +0200
committerFrederic Robra2019-07-17 17:13:17 +0200
commitfd4c68d75b5e06868c8dfd1b1078694460a1ad41 (patch)
tree524126d177f3e01ce8bf26e01916cc5165ba3789 /src/kernel/net.c
parentfixed various bugs (diff)
downloaddnbd3-ng-fd4c68d75b5e06868c8dfd1b1078694460a1ad41.tar.gz
dnbd3-ng-fd4c68d75b5e06868c8dfd1b1078694460a1ad41.tar.xz
dnbd3-ng-fd4c68d75b5e06868c8dfd1b1078694460a1ad41.zip
added some comments and macros
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r--src/kernel/net.c31
1 files changed, 29 insertions, 2 deletions
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;