lib/nfs/Connection: simplify error handling in OnSocketReady()

This commit is contained in:
Max Kellermann 2024-05-06 18:24:53 +02:00
parent e6b1cf540b
commit 56bb1dddd7

View File

@ -473,6 +473,7 @@ NfsConnection::OnSocketReady(unsigned flags) noexcept
assert(GetEventLoop().IsInside());
assert(deferred_close.empty());
assert(mount_state >= MountState::WAITING);
assert(!postponed_mount_error);
const bool was_mounted = mount_state >= MountState::FINISHED;
if (!was_mounted || (flags & SocketEvent::HANGUP) != 0)
@ -492,36 +493,33 @@ NfsConnection::OnSocketReady(unsigned flags) noexcept
deferred_close.pop_front();
}
if (!was_mounted && mount_state >= MountState::FINISHED) {
if (postponed_mount_error) {
PrepareDestroyContext();
BroadcastMountError(std::move(postponed_mount_error));
return;
} else if (result == 0)
BroadcastMountSuccess();
} else if (result < 0) {
/* the connection has failed */
try {
if (postponed_mount_error)
std::rethrow_exception(postponed_mount_error);
auto e = NfsClientError(context, "NFS connection has failed");
BroadcastError(std::make_exception_ptr(e));
PrepareDestroyContext();
return;
} else if (nfs_get_fd(context) < 0) {
/* this happens when rpc_reconnect_requeue() is called
after the connection broke, but autoreconnect was
disabled - nfs_service() returns 0 */
auto e = NfsClientError(context, "NFS socket disappeared");
BroadcastError(std::make_exception_ptr(e));
if (result < 0)
throw NfsClientError(context, "NFS connection has failed");
if (nfs_get_fd(context) < 0)
/* this happens when rpc_reconnect_requeue()
is called after the connection broke, but
autoreconnect was disabled - nfs_service()
returns 0 */
throw NfsClientError(context, "NFS socket disappeared");
} catch (...) {
PrepareDestroyContext();
if (was_mounted)
BroadcastError(std::current_exception());
else
BroadcastMountError(std::current_exception());
return;
}
assert(nfs_get_fd(context) >= 0);
if (!was_mounted && mount_state >= MountState::FINISHED)
BroadcastMountSuccess();
#ifndef NDEBUG
assert(in_event);
in_event = false;