X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b3bf9b9df95137a3a43248be9599d919b04877af..ce827c3e50cd168027a555ec961b6636e5b63e59:/io.c diff --git a/io.c b/io.c index 12e648d4..c9d990ad 100644 --- a/io.c +++ b/io.c @@ -45,6 +45,8 @@ extern int inc_recurse; extern int io_error; extern int eol_nulls; extern int flist_eof; +extern int file_total; +extern int file_old_total; extern int list_only; extern int read_batch; extern int protect_args; @@ -645,7 +647,12 @@ static int read_timeout(int fd, char *buf, size_t len) maxfd = new_fd; } - tv.tv_sec = select_timeout; + if (am_sender && inc_recurse && !flist_eof && !defer_forwarding_messages && !cnt + && file_total - file_old_total < MAX_FILECNT_LOOKAHEAD + && file_total - file_old_total >= MIN_FILECNT_LOOKAHEAD) + tv.tv_sec = 0; + else + tv.tv_sec = select_timeout; tv.tv_usec = 0; errno = 0; @@ -657,7 +664,10 @@ static int read_timeout(int fd, char *buf, size_t len) defer_forwarding_messages = 0; exit_cleanup(RERR_SOCKETIO); } - check_timeout(); + if (am_sender && tv.tv_sec == 0) + send_extra_file_list(sock_f_out, -1); + else + check_timeout(); continue; } @@ -1049,6 +1059,13 @@ static int readfd_unbuffered(int fd, char *buf, size_t len) send_msg_int(MSG_IO_ERROR, IVAL(line, 0)); io_error |= IVAL(line, 0); break; + case MSG_DEL_STATS: + if (msg_bytes) + goto invalid_msg; + read_del_stats(fd); + if (am_sender && am_server) + write_del_stats(sock_f_out); + break; case MSG_DELETED: if (msg_bytes >= sizeof line) goto overflow; @@ -1416,6 +1433,22 @@ static void sleep_for_bwlimit(int bytes_written) total_written = (sleep_usec - elapsed_usec) * bwlimit / (ONE_SEC/1024); } +static const char *what_fd_is(int fd) +{ + static char buf[20]; + + if (fd == sock_f_out) + return "socket"; + else if (fd == msg_fd_out) + return "message fd"; + else if (fd == batch_fd) + return "batch file"; + else { + snprintf(buf, sizeof buf, "fd %d", fd); + return buf; + } +} + /* Write len bytes to the file descriptor fd, looping as necessary to get * the job done and also (in certain circumstances) reading any data on * msg_fd_in to avoid deadlock. @@ -1494,8 +1527,8 @@ static void writefd_unbuffered(int fd, const char *buf, size_t len) if (am_server && fd == msg_fd_out) exit_cleanup(RERR_STREAMIO); rsyserr(FERROR, errno, - "writefd_unbuffered failed to write %ld bytes [%s]", - (long)len, who_am_i()); + "writefd_unbuffered failed to write %ld bytes to %s [%s]", + (long)len, what_fd_is(fd), who_am_i()); /* If the other side is sending us error messages, try * to grab any messages they sent before they died. */ while (!am_server && fd == sock_f_out && io_multiplexing_in) { @@ -1553,10 +1586,8 @@ static void writefd(int fd, const char *buf, size_t len) if (fd == sock_f_out) stats.total_written += len; - if (fd == write_batch_monitor_out) { - if ((size_t)write(batch_fd, buf, len) != len) - exit_cleanup(RERR_FILEIO); - } + if (fd == write_batch_monitor_out) + writefd_unbuffered(batch_fd, buf, len); if (!iobuf_out || fd != iobuf_f_out) { writefd_unbuffered(fd, buf, len);