mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-03-13 20:06:22 -04:00
if we get EWOULDBLOCK on a write then reduce the amount of data we are
trying to write. This guarantees that the maximum amount of data that can be written at any one time is written.
This commit is contained in:
10
io.c
10
io.c
@@ -319,6 +319,7 @@ static void writefd_unbuffered(int fd,char *buf,int len)
|
||||
int fd_count, count;
|
||||
struct timeval tv;
|
||||
int reading;
|
||||
int blocked=0;
|
||||
|
||||
no_flush++;
|
||||
|
||||
@@ -350,7 +351,8 @@ static void writefd_unbuffered(int fd,char *buf,int len)
|
||||
}
|
||||
|
||||
if (FD_ISSET(fd, &w_fds)) {
|
||||
int ret = write(fd,buf+total,len-total);
|
||||
int n = (len-total)>>blocked;
|
||||
int ret = write(fd,buf+total,n?n:1);
|
||||
|
||||
if (ret == -1 && errno == EINTR) {
|
||||
continue;
|
||||
@@ -358,10 +360,7 @@ static void writefd_unbuffered(int fd,char *buf,int len)
|
||||
|
||||
if (ret == -1 &&
|
||||
(errno == EAGAIN || errno == EWOULDBLOCK)) {
|
||||
/* this shouldn't happen, if it does then
|
||||
sleep for a short time to prevent us
|
||||
chewing too much CPU */
|
||||
u_sleep(100);
|
||||
blocked++;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -370,6 +369,7 @@ static void writefd_unbuffered(int fd,char *buf,int len)
|
||||
exit_cleanup(1);
|
||||
}
|
||||
|
||||
blocked = 0;
|
||||
total += ret;
|
||||
stats.total_written += ret;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user