From f0668dc0d5125148ebfda47c9804127c928a2782 Mon Sep 17 00:00:00 2001 From: Johann Latocha Date: Tue, 8 May 2012 19:54:30 +0200 Subject: [KERNEL] rtt measurement improved --- src/config.h | 1 + src/kernel/dnbd3.h | 1 + src/kernel/net.c | 19 ++++++++++++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) (limited to 'src') 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; -- cgit v1.2.3-55-g7522