From 3a7891e26aec9e5d15d21a78cb317926d96f51e9 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 26 Mar 2021 13:44:47 +0100 Subject: [KERNEL] Implement best_count logic for load balancing Similar logic already exists in the fuse client: Count how many times in a row a server was fastest when measuring RTTs, and lower the switching threshold more the higher the count gets. --- src/kernel/blk.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'src/kernel/blk.c') diff --git a/src/kernel/blk.c b/src/kernel/blk.c index c313d63..96a330c 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -201,7 +201,10 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int /* specified server is known, so try to switch to it */ new_addr = alt_server->host; mutex_unlock(&dev->alt_servers_lock); - if (!is_same_server(&dev->cur_server.host, &new_addr)) { + if (is_same_server(&dev->cur_server.host, &new_addr)) { + /* specified server is current server, so do not switch */ + result = 0; + } else { struct sockaddr_storage old_server; dev_info(dnbd3_device_to_dev(dev), "manual server switch to %pISpc\n", @@ -240,13 +243,12 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int /* switch succeeded, fake very low RTT so we don't switch away again soon */ mutex_lock(&dev->alt_servers_lock); if (is_same_server(&alt_server->host, &new_addr)) { - alt_server->rtts[0] = alt_server->rtts[1] = alt_server->rtts[2] = alt_server->rtts[3] = 4; + alt_server->rtts[0] = alt_server->rtts[1] = alt_server->rtts[2] + = alt_server->rtts[3] = 4; + alt_server->best_count = 100; } mutex_unlock(&dev->alt_servers_lock); } - } else { - /* specified server is already working, so do not switch */ - result = 0; } } } @@ -273,20 +275,18 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int if (cmd == IOCTL_ADD_SRV) { result = dnbd3_add_server(dev, host); - if (result == -EEXIST) { + if (result == -EEXIST) dev_info(dnbd3_device_to_dev(dev), "alt server %pISpc already exists\n", &addr); - } else if (result == -ENOSPC) { + else if (result == -ENOSPC) dev_info(dnbd3_device_to_dev(dev), "cannot add %pISpc; no free slot\n", &addr); - } else { + else dev_info(dnbd3_device_to_dev(dev), "added alt server %pISpc\n", &addr); - } } else { // IOCTL_REM_SRV result = dnbd3_rem_server(dev, host); - if (result == -ENOENT) { + if (result == -ENOENT) dev_info(dnbd3_device_to_dev(dev), "alt server %pISpc not found\n", &addr); - } else { + else dev_info(dnbd3_device_to_dev(dev), "removed alt server %pISpc\n", &addr); - } } break; } -- cgit v1.2.3-55-g7522