Some minor transfer updates
This commit is contained in:
@@ -63,7 +63,7 @@ void FileClient::add_network_read_event(bool ignore_bandwidth) {
|
||||
std::shared_lock slock{this->state_mutex};
|
||||
|
||||
switch (this->state) {
|
||||
case STATE_DISCONNECTING:
|
||||
case STATE_FLUSHING:
|
||||
case STATE_DISCONNECTED:
|
||||
return;
|
||||
|
||||
@@ -91,7 +91,7 @@ void FileClient::add_network_write_event_nolock(bool ignore_bandwidth) {
|
||||
case STATE_DISCONNECTED:
|
||||
return;
|
||||
|
||||
case STATE_DISCONNECTING:
|
||||
case STATE_FLUSHING:
|
||||
/* flush our write buffer */
|
||||
break;
|
||||
|
||||
@@ -587,7 +587,7 @@ void LocalFileTransfer::callback_transfer_network_read(int fd, short events, voi
|
||||
transfer->handle->invoke_aborted_callback(transfer->shared_from_this(), { TransferError::UNEXPECTED_CLIENT_DISCONNECT, "" });
|
||||
break;
|
||||
}
|
||||
case FileClient::STATE_DISCONNECTING:
|
||||
case FileClient::STATE_FLUSHING:
|
||||
logMessage(LOG_FT, "{} Remote client closed connection. Finalizing disconnect.", transfer->log_prefix());
|
||||
break;
|
||||
|
||||
@@ -625,7 +625,7 @@ void LocalFileTransfer::callback_transfer_network_read(int fd, short events, voi
|
||||
|
||||
transfer->handle->invoke_aborted_callback(transfer->shared_from_this(), { TransferError::NETWORK_IO_ERROR, strerror(errno) });
|
||||
break;
|
||||
case FileClient::STATE_DISCONNECTING:
|
||||
case FileClient::STATE_FLUSHING:
|
||||
case FileClient::STATE_DISCONNECTED:
|
||||
default:
|
||||
break;
|
||||
@@ -654,7 +654,7 @@ void LocalFileTransfer::callback_transfer_network_read(int fd, short events, voi
|
||||
}
|
||||
}
|
||||
|
||||
if(transfer->state == FileClient::STATE_DISCONNECTING || transfer->state == FileClient::STATE_DISCONNECTED)
|
||||
if(transfer->state == FileClient::STATE_FLUSHING || transfer->state == FileClient::STATE_DISCONNECTED)
|
||||
break;
|
||||
|
||||
if(bytes_buffered > TRANSFER_MAX_CACHED_BYTES) {
|
||||
@@ -676,7 +676,7 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
auto transfer = reinterpret_cast<FileClient*>(ptr_transfer);
|
||||
|
||||
if((unsigned) events & (unsigned) EV_TIMEOUT) {
|
||||
if(transfer->state == FileClient::STATE_DISCONNECTING) {
|
||||
if(transfer->state == FileClient::STATE_FLUSHING) {
|
||||
{
|
||||
std::unique_lock nb_lock{transfer->network_buffer.mutex};
|
||||
if(transfer->network_buffer.bytes > 0) {
|
||||
@@ -686,6 +686,13 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!std::exchange(transfer->finished_signal_send, true)) {
|
||||
if(transfer->transfer) {
|
||||
transfer->handle->invoke_aborted_callback(transfer->shared_from_this(), { TransferError::NETWORK_IO_ERROR, "failed to flush outgoing buffer" });
|
||||
}
|
||||
}
|
||||
|
||||
transfer->handle->test_disconnecting_state(transfer->shared_from_this());
|
||||
return;
|
||||
}
|
||||
@@ -701,6 +708,7 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
buffer = transfer->network_buffer.buffer_head;
|
||||
buffer_left_size = transfer->network_buffer.bytes;
|
||||
}
|
||||
|
||||
if(!buffer) {
|
||||
break;
|
||||
}
|
||||
@@ -718,6 +726,7 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
|
||||
if(transfer->state == FileClient::STATE_TRANSFERRING) {
|
||||
assert(transfer->transfer);
|
||||
|
||||
if(written == 0) {
|
||||
/* EOF, how the hell is this event possible?! (Read should already catch it) */
|
||||
logError(LOG_FT, "{} Client disconnected unexpectedly on write. Send {} bytes out of {}.",
|
||||
@@ -728,10 +737,28 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
logError(LOG_FT, "{} Received network write error. Send {} bytes out of {}. Closing transfer.",
|
||||
transfer->log_prefix(), transfer->statistics.file_transferred.total_bytes, transfer->transfer ? transfer->transfer->expected_file_size - transfer->transfer->file_offset : -1);
|
||||
|
||||
transfer->handle->invoke_aborted_callback(transfer->shared_from_this(), { TransferError::NETWORK_IO_ERROR, strerror(errno) });
|
||||
}
|
||||
} else if(transfer->state == FileClient::STATE_FLUSHING && transfer->transfer) {
|
||||
{
|
||||
std::lock_guard block{transfer->network_buffer.mutex};
|
||||
if(transfer->network_buffer.bytes == 0)
|
||||
goto disconnect_client;
|
||||
}
|
||||
|
||||
transfer->flush_network_buffer();
|
||||
if(written == 0) {
|
||||
logError(LOG_FT, "{} Received unexpected client disconnect while flushing the network buffer. Transfer failed.", transfer->log_prefix());
|
||||
transfer->handle->invoke_aborted_callback(transfer->shared_from_this(), { TransferError::UNEXPECTED_CLIENT_DISCONNECT, "" });
|
||||
} else {
|
||||
logError(LOG_FT, "{} Received network write error while flushing the network buffer. Closing transfer.",
|
||||
transfer->log_prefix());
|
||||
|
||||
transfer->handle->invoke_aborted_callback(transfer->shared_from_this(), { TransferError::NETWORK_IO_ERROR, strerror(errno) });
|
||||
}
|
||||
}
|
||||
|
||||
disconnect_client:
|
||||
/* invalidate all network write operations, but still flush the disk IO buffer */
|
||||
if(size_t bytes_dropped{transfer->flush_network_buffer()}; bytes_dropped > 0) {
|
||||
if(transfer->state != FileClient::STATE_TRANSFERRING) {
|
||||
@@ -739,8 +766,10 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
transfer->log_prefix(), bytes_dropped, errno, strerror(errno));
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_lock slock{transfer->state_mutex};
|
||||
transfer->handle->disconnect_client(transfer->shared_from_this(), slock, true);
|
||||
/* no need to flush anything here, write will only be invoked on a client download */
|
||||
transfer->handle->disconnect_client(transfer->shared_from_this(), slock, false);
|
||||
return;
|
||||
} else {
|
||||
buffer->offset += written;
|
||||
@@ -774,7 +803,7 @@ void LocalFileTransfer::callback_transfer_network_write(int fd, short events, vo
|
||||
|
||||
if(buffer_left_size > 0) {
|
||||
transfer->add_network_write_event(false);
|
||||
} else if(transfer->state == FileClient::STATE_DISCONNECTING) {
|
||||
} else if(transfer->state == FileClient::STATE_FLUSHING) {
|
||||
transfer->handle->test_disconnecting_state(transfer->shared_from_this());
|
||||
|
||||
if(!std::exchange(transfer->finished_signal_send, true)) {
|
||||
|
||||
Reference in New Issue
Block a user