summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2013-10-24 15:37:26 +0200
committerSimon Rettberg2013-10-24 15:37:26 +0200
commit897a3127e05a3841abc30edbb354d92b54e60b8d (patch)
tree452553ce4c17b9523e8d65fe1aa474ad2a142b07
parent[SERVER] Refactoring, more debug output, try to check for cyclic proxying (diff)
downloaddnbd3-897a3127e05a3841abc30edbb354d92b54e60b8d.tar.gz
dnbd3-897a3127e05a3841abc30edbb354d92b54e60b8d.tar.xz
dnbd3-897a3127e05a3841abc30edbb354d92b54e60b8d.zip
[KERNEL] Detect stale state and change server
-rw-r--r--src/kernel/net.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index bb41ce3..b3e08df 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -438,9 +438,11 @@ int dnbd3_net_discover(void *data)
unsigned long irqflags;
int i, best_server, current_server;
int turn = 0;
- int ready = 0;
+ int ready = 0, do_change;
int mlen;
+ struct request *last_request = (struct request *)123, *cur_request = (struct request *)456;
+
struct timeval timeout;
timeout.tv_sec = SOCKET_TIMEOUT_CLIENT_DISCOVERY;
timeout.tv_usec = 0;
@@ -739,9 +741,28 @@ int dnbd3_net_discover(void *data)
continue;
}
+ do_change = !dev->is_server && ready && best_server != current_server && (jiffies & 3) != 0
+ && RTT_THRESHOLD_FACTOR(dev->cur_rtt) > best_rtt;
+
+ if (ready && !do_change) {
+ spin_lock_irqsave(&dev->blk_lock, irqflags);
+ if (!list_empty(&dev->request_queue_send))
+ {
+ cur_request = list_entry(dev->request_queue_send.next, struct request, queuelist);
+ do_change = (cur_request == last_request);
+ if (do_change)
+ printk("WARNING: Hung request on %s\n", dev->disk->disk_name);
+ }
+ else
+ {
+ cur_request = (struct request *)123;
+ }
+ last_request = cur_request;
+ spin_unlock_irqrestore(&dev->blk_lock, irqflags);
+ }
+
// take server with lowest rtt (only if in client mode)
- if (!dev->is_server && ready && best_server != current_server && (jiffies & 3) != 0
- && RTT_THRESHOLD_FACTOR(dev->cur_rtt) > best_rtt)
+ if (do_change)
{
printk("INFO: Server %d on %s is faster (%lluµs vs. %lluµs)\n", best_server, dev->disk->disk_name,
(unsigned long long)best_rtt, (unsigned long long)dev->cur_rtt);