summaryrefslogtreecommitdiffstats
path: root/src/kernel/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/net.c')
-rw-r--r--src/kernel/net.c58
1 files changed, 17 insertions, 41 deletions
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 061deb1..8f71b5a 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -291,32 +291,6 @@ static int dnbd3_compare_plan(const void *lhs, const void *rhs)
return l - r;
}
-static void dnbd3_lock_all_socks(struct dnbd3_device *dev)
-{
- int i;
- for (i = 0; i < dev->number_connections; i++) {
- mutex_lock(&dev->socks[i].tx_lock);
- }
-}
-
-static void dnbd3_unlock_all_socks(struct dnbd3_device *dev)
-{
- int i;
- for (i = 0; i < dev->number_connections; i++) {
- mutex_unlock(&dev->socks[i].tx_lock);
- }
-}
-
-static void dnbd3_print_conenction_plan(struct dnbd3_device *dev,
- struct dnbd3_server **plan)
-{
- int i;
- debug_dev(dev, "connection plan:");
- for (i = 0; i < dev->number_connections; i++) {
- debug_server(dev, plan[i], "server %d with avg rtt %llu:",
- i, plan[i]->avg_rtt);
- }
-}
/**
* dnbd3_adjust_connections - create a connection plan and connect
@@ -361,9 +335,17 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) {
sort(plan, dev->number_connections, sizeof(struct dnbd3_server *),
&dnbd3_compare_plan, NULL);
- dnbd3_print_conenction_plan(dev, plan);
- dnbd3_lock_all_socks(dev);
+ /* lock all mutex at once, so nothing can be send */
+ debug_dev(dev, "connection plan:");
+ for (i = 0; i < dev->number_connections; i++) {
+ debug_server(dev, plan[i],
+ "server %d with avg rtt %llu:",
+ i, plan[i]->avg_rtt);
+
+ mutex_lock(&dev->socks[i].tx_lock);
+ }
+
alive = 0;
for (i = 0; i < dev->number_connections; i++) {
if (plan[i] != dev->socks[i].server ||
@@ -379,8 +361,9 @@ static int dnbd3_adjust_connections(struct dnbd3_device *dev) {
} else {
alive++;
}
+ mutex_unlock(&dev->socks[i].tx_lock);
}
- dnbd3_unlock_all_socks(dev);
+
if (alive == 0) {
return -EIO;
}
@@ -540,10 +523,8 @@ static void dnbd3_merge_new_server(struct dnbd3_device *dev,
dnbd3_server_entry_t *new_server)
{
int i;
- struct dnbd3_server *existing_server, *free_server, *failed_server;
- existing_server = NULL;
- free_server = NULL;
- failed_server = NULL;
+ struct dnbd3_server *existing_server = NULL;
+ struct dnbd3_server *free_server = NULL;
/* find servers in alternative servers */
for (i = 0; i < NUMBER_SERVERS; i++) {
@@ -557,8 +538,6 @@ static void dnbd3_merge_new_server(struct dnbd3_device *dev,
existing_server = &dev->alt_servers[i];
} else if (dev->alt_servers[i].host.type == 0) {
free_server = &dev->alt_servers[i];
- } else if (dev->alt_servers[i].failures > 20) {
- failed_server = &dev->alt_servers[i];
}
}
@@ -566,19 +545,16 @@ static void dnbd3_merge_new_server(struct dnbd3_device *dev,
if (new_server->failures == 1) { /* remove is requested */
info_server(dev, new_server,
"remove server is requested");
- // adjust connection will remove it later
+ /* adjust connection will remove it later */
existing_server->host.type = 0;
dnbd3_set_rtt_unreachable(existing_server);
}
-// existing_server->failures = 0; // reset failure count
return;
} else if (free_server) {
- //TODO disconnect the server if it is connected
free_server->host = new_server->host;
- } else if (failed_server) {
- failed_server->host = new_server->host;
- free_server = failed_server;
} else {
+ warn_dev(dev, "reached the maximum of %d servers",
+ NUMBER_SERVERS);
/* no server found to replace */
return;
}