summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorSimon Rettberg2016-01-11 11:59:03 +0100
committerSimon Rettberg2016-01-11 11:59:03 +0100
commitaedf8c534195772f60e7c6409ae045fa20415aef (patch)
treeb987e1d389df2dfe6bec66b5215b94193dfcff6c /src/kernel
parent[FUSE] Handle SIGINT/SIGTERM to abort pending reads (diff)
downloaddnbd3-aedf8c534195772f60e7c6409ae045fa20415aef.tar.gz
dnbd3-aedf8c534195772f60e7c6409ae045fa20415aef.tar.xz
dnbd3-aedf8c534195772f60e7c6409ae045fa20415aef.zip
[KERNEL/CLIENT] Several minor tweaks and changes
- Disable panic timeout that reports errors to block layer by default - Get rid of "is_server" used by old proxy mode, introduce "honor_server_alts" that just controls whether we use alts provided by the server - Allow switching servers when we only have 3 RTT measurements - If using alts provided by server, don't ignore those that come from other servers than the initial one
Diffstat (limited to 'src/kernel')
-rw-r--r--src/kernel/blk.c4
-rw-r--r--src/kernel/dnbd3.h3
-rw-r--r--src/kernel/net.c19
3 files changed, 13 insertions, 13 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c
index e55de25..3e3cdd7 100644
--- a/src/kernel/blk.c
+++ b/src/kernel/blk.c
@@ -169,7 +169,7 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u
memcpy(&dev->initial_server, &dev->cur_server, sizeof(dev->initial_server));
dev->imgname = imgname;
dev->rid = msg->rid;
- dev->is_server = msg->is_server;
+ dev->use_server_provided_alts = msg->use_server_provided_alts;
// Forget all alt servers on explicit connect, set first al server to initial server
memset(dev->alt_servers, 0, sizeof(dev->alt_servers[0])*NUMBER_SERVERS);
memcpy(dev->alt_servers, &dev->initial_server, sizeof(dev->alt_servers[0]));
@@ -266,7 +266,7 @@ void dnbd3_blk_request(struct request_queue *q)
continue;
}
- if (dev->panic_count >= PROBE_COUNT_TIMEOUT)
+ if (PROBE_COUNT_TIMEOUT > 0 && dev->panic_count >= PROBE_COUNT_TIMEOUT)
{
__blk_end_request_all(req, -EIO);
continue;
diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h
index c0c7f4d..f8af69f 100644
--- a/src/kernel/dnbd3.h
+++ b/src/kernel/dnbd3.h
@@ -60,7 +60,8 @@ typedef struct
dnbd3_server_t alt_servers[NUMBER_SERVERS]; // array of alt servers
int new_servers_num; // number of new alt servers that are waiting to be copied to above array
dnbd3_server_entry_t new_servers[NUMBER_SERVERS]; // pending new alt servers
- uint8_t discover, panic, disconnecting, is_server, update_available, panic_count;
+ uint8_t discover, panic, disconnecting, update_available, panic_count;
+ uint8_t use_server_provided_alts;
uint16_t rid;
uint32_t heartbeat_count;
uint64_t reported_size;
diff --git a/src/kernel/net.c b/src/kernel/net.c
index 3392feb..58b4664 100644
--- a/src/kernel/net.c
+++ b/src/kernel/net.c
@@ -210,7 +210,7 @@ int dnbd3_net_connect(dnbd3_device_t *dev)
serializer_put_uint16(&dev->payload_buffer, PROTOCOL_VERSION);
serializer_put_string(&dev->payload_buffer, dev->imgname);
serializer_put_uint16(&dev->payload_buffer, dev->rid);
- serializer_put_uint8(&dev->payload_buffer, dev->is_server);
+ serializer_put_uint8(&dev->payload_buffer, 0); // is_server = false
iov[1].iov_base = &dev->payload_buffer;
dnbd3_request.size = iov[1].iov_len = serializer_get_written_length(&dev->payload_buffer);
fixup_request(dnbd3_request);
@@ -731,7 +731,7 @@ int dnbd3_net_discover(void *data)
if (dev->panic)
{
// After 21 retries, bail out by reporting errors to block layer
- if (dev->panic_count < 255 && ++dev->panic_count == PROBE_COUNT_TIMEOUT + 1)
+ if (PROBE_COUNT_TIMEOUT > 0 && dev->panic_count < 255 && ++dev->panic_count == PROBE_COUNT_TIMEOUT + 1)
dnbd3_blk_fail_all_requests(dev);
}
@@ -745,7 +745,7 @@ int dnbd3_net_discover(void *data)
continue;
}
- do_change = !dev->is_server && ready && best_server != current_server && (start.tv_usec & 3) != 0
+ do_change = ready && best_server != current_server && (start.tv_usec & 3) != 0
&& RTT_THRESHOLD_FACTOR(dev->cur_rtt) > best_rtt + 1500;
if (ready && !do_change) {
@@ -765,7 +765,7 @@ int dnbd3_net_discover(void *data)
spin_unlock_irqrestore(&dev->blk_lock, irqflags);
}
- // take server with lowest rtt (only if in client mode)
+ // take server with lowest rtt
if (do_change)
{
printk("INFO: Server %d on %s is faster (%lluµs vs. %lluµs)\n", best_server, dev->disk->disk_name,
@@ -787,9 +787,9 @@ int dnbd3_net_discover(void *data)
best_sock = NULL;
}
- if (!ready || (start.tv_usec & 7) != 0)
+ if (!ready || (start.tv_usec & 15) != 0)
turn = (turn + 1) % 4;
- if (turn == 3)
+ if (turn == 2) // Set ready when we only have 2 of 4 measurements for quicker load balancing
ready = 1;
}
@@ -1002,11 +1002,10 @@ int dnbd3_net_receive(void *data)
continue;
case CMD_GET_SERVERS:
- if (dev->is_server || !is_same_server(&dev->cur_server, &dev->initial_server))
+ if (!dev->use_server_provided_alts)
{
- // If not connected to initial server, or device is in proxy mode, ignore this message
remaining = dnbd3_reply.size;
- goto clear_remaining_payload;
+ goto consume_payload;
}
spin_lock_irqsave(&dev->blk_lock, irqflags);
dev->new_servers_num = 0;
@@ -1026,7 +1025,7 @@ int dnbd3_net_receive(void *data)
}
// If there were more servers than accepted, remove the remaining data from the socket buffer
remaining = dnbd3_reply.size - (count * sizeof(dnbd3_server_entry_t));
- clear_remaining_payload: while (remaining > 0)
+ consume_payload: while (remaining > 0)
{
count = MIN(sizeof(dnbd3_reply), remaining); // Abuse the reply struct as the receive buffer
iov.iov_base = &dnbd3_reply;