mirror of https://github.com/xemu-project/xemu.git
nbd/client-connection: shutdown connection on release
Now, when a thread can do negotiation and retry, it may run relatively long. We need a mechanism to stop it, when the user is not interested in a result any more. So, on nbd_client_connection_release() let's shutdown the socket, and do not retry connection if thread is detached. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Message-Id: <20210610100802.5888-22-vsementsov@virtuozzo.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
e0e67cbe58
commit
f58b2dfe3e
|
@ -168,9 +168,13 @@ static void *connect_thread_func(void *opaque)
|
||||||
uint64_t timeout = 1;
|
uint64_t timeout = 1;
|
||||||
uint64_t max_timeout = 16;
|
uint64_t max_timeout = 16;
|
||||||
|
|
||||||
while (true) {
|
qemu_mutex_lock(&conn->mutex);
|
||||||
|
while (!conn->detached) {
|
||||||
|
assert(!conn->sioc);
|
||||||
conn->sioc = qio_channel_socket_new();
|
conn->sioc = qio_channel_socket_new();
|
||||||
|
|
||||||
|
qemu_mutex_unlock(&conn->mutex);
|
||||||
|
|
||||||
error_free(conn->err);
|
error_free(conn->err);
|
||||||
conn->err = NULL;
|
conn->err = NULL;
|
||||||
conn->updated_info = conn->initial_info;
|
conn->updated_info = conn->initial_info;
|
||||||
|
@ -188,14 +192,20 @@ static void *connect_thread_func(void *opaque)
|
||||||
conn->updated_info.x_dirty_bitmap = NULL;
|
conn->updated_info.x_dirty_bitmap = NULL;
|
||||||
conn->updated_info.name = NULL;
|
conn->updated_info.name = NULL;
|
||||||
|
|
||||||
|
qemu_mutex_lock(&conn->mutex);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
object_unref(OBJECT(conn->sioc));
|
object_unref(OBJECT(conn->sioc));
|
||||||
conn->sioc = NULL;
|
conn->sioc = NULL;
|
||||||
if (conn->do_retry) {
|
if (conn->do_retry && !conn->detached) {
|
||||||
|
qemu_mutex_unlock(&conn->mutex);
|
||||||
|
|
||||||
sleep(timeout);
|
sleep(timeout);
|
||||||
if (timeout < max_timeout) {
|
if (timeout < max_timeout) {
|
||||||
timeout *= 2;
|
timeout *= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qemu_mutex_lock(&conn->mutex);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,7 +213,7 @@ static void *connect_thread_func(void *opaque)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_mutex_lock(&conn->mutex);
|
/* mutex is locked */
|
||||||
|
|
||||||
assert(conn->running);
|
assert(conn->running);
|
||||||
conn->running = false;
|
conn->running = false;
|
||||||
|
@ -237,6 +247,10 @@ void nbd_client_connection_release(NBDClientConnection *conn)
|
||||||
} else {
|
} else {
|
||||||
do_free = true;
|
do_free = true;
|
||||||
}
|
}
|
||||||
|
if (conn->sioc) {
|
||||||
|
qio_channel_shutdown(QIO_CHANNEL(conn->sioc),
|
||||||
|
QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (do_free) {
|
if (do_free) {
|
||||||
|
|
Loading…
Reference in New Issue