[SCM] The rsync repository. - branch master updated
Rsync CVS commit messages
rsync-cvs at lists.samba.org
Sun Apr 5 22:09:15 UTC 2020
The branch, master has been updated
via 15fa9ab0 Add progress output via SIGINFO and SIGVTALRM
from 7e70e484 No need to forward --write-devices to a remote sender.
https://git.samba.org/?p=rsync.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 15fa9ab06d42965346b7a3941c0fd31cb0b5aec6
Author: Wayne Davison <wayned at samba.org>
Date: Sun Apr 5 14:52:32 2020 -0700
Add progress output via SIGINFO and SIGVTALRM
On BSD-ish systems you can type Ctrl+T to see the current file and
the progress output (in --info=progress2 format). On hosts w/o
SIGINFO, use something like "killall -VTALRM rsync" or a more
targetted "kill -VTALRM PID ..." call (as needed).
-----------------------------------------------------------------------
Summary of changes:
main.c | 13 +++++++++++++
progress.c | 24 +++++++++++++++++++++++-
receiver.c | 12 +++++++++---
rsync.yo | 11 +++++++++++
sender.c | 12 +++++++++---
5 files changed, 65 insertions(+), 7 deletions(-)
Changeset truncated at 500 lines:
diff --git a/main.c b/main.c
index eda8d624..b594ab82 100644
--- a/main.c
+++ b/main.c
@@ -76,6 +76,7 @@ extern pid_t cleanup_child_pid;
extern size_t bwlimit_writemax;
extern unsigned int module_dirlen;
extern BOOL flist_receiving_enabled;
+extern BOOL want_progress_now;
extern BOOL shutting_down;
extern int backup_dir_len;
extern int basis_dir_cnt;
@@ -1551,6 +1552,12 @@ static void sigusr2_handler(UNUSED(int val))
_exit(0);
}
+static void siginfo_handler(UNUSED(int val))
+{
+ if (!am_server && !INFO_GTE(PROGRESS, 1))
+ want_progress_now = True;
+}
+
void remember_children(UNUSED(int val))
{
#ifdef WNOHANG
@@ -1648,6 +1655,12 @@ int main(int argc,char *argv[])
SIGACTMASK(SIGABRT, rsync_panic_handler);
SIGACTMASK(SIGBUS, rsync_panic_handler);
#endif
+#ifdef SIGINFO
+ SIGACTMASK(SIGINFO, siginfo_handler);
+#endif
+#ifdef SIGVTALRM
+ SIGACTMASK(SIGVTALRM, siginfo_handler);
+#endif
starttime = time(NULL);
our_uid = MY_UID();
diff --git a/progress.c b/progress.c
index 6676126c..d1cf8caa 100644
--- a/progress.c
+++ b/progress.c
@@ -28,9 +28,12 @@ extern int flist_eof;
extern int quiet;
extern int need_unsorted_flist;
extern int output_needs_newline;
+extern int stdout_format_has_i;
extern struct stats stats;
extern struct file_list *cur_flist;
+BOOL want_progress_now = False;
+
#define PROGRESS_HISTORY_SECS 5
#ifdef GETPGRP_VOID
@@ -134,6 +137,16 @@ static void rprint_progress(OFF_T ofs, OFF_T size, struct timeval *now,
}
}
+void progress_init(void)
+{
+ if (!am_server && !INFO_GTE(PROGRESS, 1)) {
+ struct timeval now;
+ gettimeofday(&now, NULL);
+ ph_start.time.tv_sec = now.tv_sec;
+ ph_start.time.tv_usec = now.tv_usec;
+ }
+}
+
void set_current_file_index(struct file_struct *file, int ndx)
{
if (!file)
@@ -145,12 +158,21 @@ void set_current_file_index(struct file_struct *file, int ndx)
current_file_index -= cur_flist->flist_num;
}
+void instant_progress(const char *fname)
+{
+ /* We only get here if want_progress_now is True */
+ if (!stdout_format_has_i && !INFO_GTE(NAME, 1))
+ rprintf(FINFO, "%s\n", fname);
+ end_progress(0);
+ want_progress_now = False;
+}
+
void end_progress(OFF_T size)
{
if (!am_server) {
struct timeval now;
gettimeofday(&now, NULL);
- if (INFO_GTE(PROGRESS, 2)) {
+ if (INFO_GTE(PROGRESS, 2) || want_progress_now) {
rprint_progress(stats.total_transferred_size,
stats.total_size, &now, True);
} else {
diff --git a/receiver.c b/receiver.c
index e7441f4d..adfa8047 100644
--- a/receiver.c
+++ b/receiver.c
@@ -55,6 +55,7 @@ extern int inplace;
extern int allowed_lull;
extern int delay_updates;
extern int xfersum_type;
+extern BOOL want_progress_now;
extern mode_t orig_umask;
extern struct stats stats;
extern char *tmpdir;
@@ -537,6 +538,8 @@ int recv_files(int f_in, int f_out, char *local_name)
if (delay_updates)
delayed_bits = bitbag_create(cur_flist->used + 1);
+ progress_init();
+
while (1) {
cleanup_disable();
@@ -544,9 +547,10 @@ int recv_files(int f_in, int f_out, char *local_name)
ndx = read_ndx_and_attrs(f_in, f_out, &iflags, &fnamecmp_type,
xname, &xlen);
if (ndx == NDX_DONE) {
- if (!am_server && INFO_GTE(PROGRESS, 2) && cur_flist) {
+ if (!am_server && cur_flist) {
set_current_file_index(NULL, 0);
- end_progress(0);
+ if (INFO_GTE(PROGRESS, 2))
+ end_progress(0);
}
if (inc_recurse && first_flist) {
if (read_batch) {
@@ -646,7 +650,7 @@ int recv_files(int f_in, int f_out, char *local_name)
stats.created_files++;
}
- if (!am_server && INFO_GTE(PROGRESS, 1))
+ if (!am_server)
set_current_file_index(file, ndx);
stats.xferred_files++;
stats.total_transferred_size += F_LENGTH(file);
@@ -859,6 +863,8 @@ int recv_files(int f_in, int f_out, char *local_name)
recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size, fname, fd2, file);
log_item(log_code, file, iflags, NULL);
+ if (want_progress_now)
+ instant_progress(fname);
if (fd1 != -1)
close(fd1);
diff --git a/rsync.yo b/rsync.yo
index 40b3fe7e..71378614 100644
--- a/rsync.yo
+++ b/rsync.yo
@@ -2581,6 +2581,17 @@ want to see how the transfer is doing without scrolling the screen with a
lot of names. (You don't need to specify the bf(--progress) option in
order to use bf(--info=progress2).)
+Finally, you can get an instant progress report by sending rsync a signal of
+either SIGINFO or SIGVTALRM On BSD systems a SIGINFO is often generated just by
+typing a Ctrl+T (Linux doesn't currently support a SIGINFO signal). When the
+client-side process receives one of those signals, it will output a single
+progress report when the current file being transferred finishes (so it may
+take a little time if a big file is being handled when the signal arrives).
+A filename is output (if needed) followed by the --info=progress2 format of
+progress info. You can send the SIGVTALRM signal to all of the rsync processes
+but just the client-side process will respond. Be careful not to send that
+signal to an older rsync, though, or it will die.
+
dit(bf(--password-file=FILE)) This option allows you to provide a password for
accessing an rsync daemon via a file or via standard input if bf(FILE) is
bf(-). The file should contain just the password on the first line (all other
diff --git a/sender.c b/sender.c
index 13113803..27c511ef 100644
--- a/sender.c
+++ b/sender.c
@@ -45,6 +45,7 @@ extern int inplace;
extern int batch_fd;
extern int write_batch;
extern int file_old_total;
+extern BOOL want_progress_now;
extern struct stats stats;
extern struct file_list *cur_flist, *first_flist, *dir_flist;
@@ -206,6 +207,8 @@ void send_files(int f_in, int f_out)
if (DEBUG_GTE(SEND, 1))
rprintf(FINFO, "send_files starting\n");
+ progress_init();
+
while (1) {
if (inc_recurse) {
send_extra_file_list(f_out, MIN_FILECNT_LOOKAHEAD);
@@ -218,9 +221,10 @@ void send_files(int f_in, int f_out)
extra_flist_sending_enabled = False;
if (ndx == NDX_DONE) {
- if (!am_server && INFO_GTE(PROGRESS, 2) && cur_flist) {
+ if (!am_server && cur_flist) {
set_current_file_index(NULL, 0);
- end_progress(0);
+ if (INFO_GTE(PROGRESS, 2))
+ end_progress(0);
}
if (inc_recurse && first_flist) {
file_old_total -= first_flist->used;
@@ -315,7 +319,7 @@ void send_files(int f_in, int f_out)
updating_basis_file = inplace && (protocol_version >= 29
? fnamecmp_type == FNAMECMP_FNAME : make_backups <= 0);
- if (!am_server && INFO_GTE(PROGRESS, 1))
+ if (!am_server)
set_current_file_index(file, ndx);
stats.xferred_files++;
stats.total_transferred_size += F_LENGTH(file);
@@ -393,6 +397,8 @@ void send_files(int f_in, int f_out)
match_sums(f_xfer, s, mbuf, st.st_size);
if (INFO_GTE(PROGRESS, 1))
end_progress(st.st_size);
+ else if (want_progress_now)
+ instant_progress(fname);
log_item(log_code, file, iflags, NULL);
--
The rsync repository.
More information about the rsync-cvs
mailing list