summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohann Latocha2012-05-08 19:54:30 +0200
committerJohann Latocha2012-05-08 19:54:30 +0200
commitf0668dc0d5125148ebfda47c9804127c928a2782 (patch)
tree17f2388234633cce86b307d4c3c6fb86e2d0fd33
parent[ALL] Warning warn_unused_result removed (diff)
downloaddnbd3-f0668dc0d5125148ebfda47c9804127c928a2782.tar.gz
dnbd3-f0668dc0d5125148ebfda47c9804127c928a2782.tar.xz
dnbd3-f0668dc0d5125148ebfda47c9804127c928a2782.zip
[KERNEL] rtt measurement improved
-rw-r--r--src/config.h1
-rw-r--r--src/kernel/dnbd3.h1
-rw-r--r--src/kernel/net.c19
3 files changed, 18 insertions, 3 deletions
diff --git a/src/config.h b/src/config.h
index 58ca9fc..b74ceab 100644
--- a/src/config.h
+++ b/src/config.h
@@ -31,6 +31,7 @@
#define TIMER_INTERVAL_HEARTBEAT 10*HZ
#define TIMER_INTERVAL_PANIC 1*HZ
#define NUMBER_SERVERS 8
+#define RTT_THRESHOLD 1000
// block device
#define KERNEL_SECTOR_SIZE 512
diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h
index 038cfb6..0e408dc 100644
--- a/src/kernel/dnbd3.h
+++ b/src/kernel/dnbd3.h
@@ -37,6 +37,7 @@ typedef struct
char host[16];
char port[6];
uint64_t rtt;
+ uint64_t rtts[4];
struct socket *sock;
struct kobject kobj;
} dnbd3_server_t;
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 684ceb6..bc2f510 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -193,6 +193,8 @@ int dnbd3_net_discover(void *data)
struct timeval start, end;
uint64_t t1, t2, best_rtt = 0;
int i, num = 0;
+ int turn = 0;
+ int ready = 0;
struct timeval timeout;
timeout.tv_sec = SOCKET_TIMEOUT_CLIENT_DISCOVERY;
@@ -308,9 +310,16 @@ int dnbd3_net_discover(void *data)
t1 = (start.tv_sec*1000000ull) + start.tv_usec;
t2 = (end.tv_sec*1000000ull) + end.tv_usec;
- dev->alt_servers[i].rtt = t2 -t1;
+ dev->alt_servers[i].rtts[turn] = t2 -t1;
- if ( best_rtt > dev->alt_servers[i].rtt )
+ dev->alt_servers[i].rtt = ( dev->alt_servers[i].rtts[0]
+ +dev->alt_servers[i].rtts[1]
+ +dev->alt_servers[i].rtts[2]
+ +dev->alt_servers[i].rtts[3] ) / 4;
+
+
+
+ if ( best_rtt > dev->alt_servers[i].rtt + RTT_THRESHOLD)
{
best_rtt = dev->alt_servers[i].rtt;
strcpy(best_server, current_server);
@@ -330,7 +339,7 @@ int dnbd3_net_discover(void *data)
continue;
// take server with lowest rtt
- if (num > 1 && strcmp(dev->cur_server.host, best_server) && !kthread_should_stop())
+ if (ready && num > 1 && strcmp(dev->cur_server.host, best_server) && !kthread_should_stop())
{
printk("INFO: Server %s on %s is faster (%lluus)\n", best_server, dev->disk->disk_name, best_rtt);
kfree(buf);
@@ -346,6 +355,10 @@ int dnbd3_net_discover(void *data)
dev->cur_server.rtt = best_rtt;
}
+ turn = (turn +1) % 4;
+ if (turn == 3)
+ ready = 1;
+
}
kfree(buf);
return 0;