summaryrefslogtreecommitdiffstats
path: root/src/server/net.c
diff options
context:
space:
mode:
authorSimon Rettberg2014-12-22 15:51:30 +0100
committerSimon Rettberg2014-12-22 15:51:30 +0100
commitcce7cf2c1428d174dd49177358dc52b234e97e5c (patch)
treedb0fa8c046e5c694bde7ff5afdff96c773ad6d64 /src/server/net.c
parentget-version.sh will always work in the directory it's placed in (diff)
downloaddnbd3-cce7cf2c1428d174dd49177358dc52b234e97e5c.tar.gz
dnbd3-cce7cf2c1428d174dd49177358dc52b234e97e5c.tar.xz
dnbd3-cce7cf2c1428d174dd49177358dc52b234e97e5c.zip
[SERVER] Configurable client timeout, adaptive replication speed (to be tested against varying bw/latency), retry sendfile call if ret <= len
Diffstat (limited to 'src/server/net.c')
-rw-r--r--src/server/net.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/server/net.c b/src/server/net.c
index b40413f..5ea2e36 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -301,11 +301,15 @@ void *net_client_handler(void *dnbd3_client)
if ( request.size != 0 ) {
// Send payload if request length > 0
- const ssize_t ret = sendfile( client->sock, image_file, (off_t *)&request.offset, request.size );
- if ( ret != request.size ) {
- pthread_mutex_unlock( &client->sendMutex );
- printf( "[ERROR] sendfile failed (image to net %d/%d)\n", (int)ret, (int)request.size );
- goto exit_client_cleanup;
+ size_t done = 0;
+ while ( done < request.size ) {
+ const ssize_t ret = sendfile( client->sock, image_file, (off_t *)&request.offset, request.size );
+ if ( ret <= 0 ) {
+ pthread_mutex_unlock( &client->sendMutex );
+ printf( "[ERROR] sendfile failed (image to net. ret=%d, sent %d/%d, errno=%d)\n", (int)ret, (int)done, (int)request.size, (int)errno );
+ goto exit_client_cleanup;
+ }
+ done += ret;
}
}
pthread_mutex_unlock( &client->sendMutex );