| 1 | This patch adds a --slow-down=USECs option that causes the sender to scan |
| 2 | the filelist more slowly, and the generator to scan for deletions more |
| 3 | slowly. It doesn't do anything to make anyone slow down during the normal |
| 4 | transfer processing, though. |
| 5 | |
| 6 | The idea is to lessen rsync's impact on disk I/O. Unfortunately, there |
| 7 | should really be a way to affect more of rsync's processing, perhaps by |
| 8 | specifying a maximum disk I/O rate (and have that affect a maximum stat() |
| 9 | rate or something like that). |
| 10 | |
| 11 | To use this patch, run these commands for a successful build: |
| 12 | |
| 13 | patch -p1 <patches/slow-down.diff |
| 14 | ./configure (optional if already run) |
| 15 | make |
| 16 | |
| 17 | --- old/flist.c |
| 18 | +++ new/flist.c |
| 19 | @@ -58,6 +58,7 @@ extern int copy_links; |
| 20 | extern int copy_unsafe_links; |
| 21 | extern int protocol_version; |
| 22 | extern int sanitize_paths; |
| 23 | +extern unsigned long sleep_asec; |
| 24 | extern struct stats stats; |
| 25 | |
| 26 | extern char curr_dir[MAXPATHLEN]; |
| 27 | @@ -1246,6 +1247,9 @@ static void send_directory(int f, struct |
| 28 | } |
| 29 | |
| 30 | send_file_name(f, flist, fbuf, NULL, flags, filter_flags); |
| 31 | + /* Sleep for a bit, to avoid hammering the disk. */ |
| 32 | + if (sleep_asec) |
| 33 | + usleep(sleep_asec); |
| 34 | } |
| 35 | |
| 36 | fbuf[len] = '\0'; |
| 37 | --- old/options.c |
| 38 | +++ new/options.c |
| 39 | @@ -102,6 +102,7 @@ int size_only = 0; |
| 40 | int daemon_bwlimit = 0; |
| 41 | int bwlimit = 0; |
| 42 | int fuzzy_basis = 0; |
| 43 | +unsigned long sleep_asec = 0; |
| 44 | size_t bwlimit_writemax = 0; |
| 45 | int ignore_existing = 0; |
| 46 | int ignore_non_existing = 0; |
| 47 | @@ -374,6 +375,7 @@ void usage(enum logcode F) |
| 48 | rprintf(F," --password-file=FILE read daemon-access password from FILE\n"); |
| 49 | rprintf(F," --list-only list the files instead of copying them\n"); |
| 50 | rprintf(F," --bwlimit=KBPS limit I/O bandwidth; KBytes per second\n"); |
| 51 | + rprintf(F," --slow-down=USECs sleep N usec while creating the filelist\n"); |
| 52 | rprintf(F," --write-batch=FILE write a batched update to FILE\n"); |
| 53 | rprintf(F," --only-write-batch=FILE like --write-batch but w/o updating destination\n"); |
| 54 | rprintf(F," --read-batch=FILE read a batched update from FILE\n"); |
| 55 | @@ -514,6 +516,7 @@ static struct poptOption long_options[] |
| 56 | {"log-format", 0, POPT_ARG_STRING, &stdout_format, 0, 0, 0 }, /* DEPRECATED */ |
| 57 | {"itemize-changes", 'i', POPT_ARG_NONE, 0, 'i', 0, 0 }, |
| 58 | {"bwlimit", 0, POPT_ARG_INT, &bwlimit, 0, 0, 0 }, |
| 59 | + {"slow-down", 0, POPT_ARG_LONG, &sleep_asec, 0, 0, 0 }, |
| 60 | {"backup", 'b', POPT_ARG_NONE, &make_backups, 0, 0, 0 }, |
| 61 | {"backup-dir", 0, POPT_ARG_STRING, &backup_dir, 0, 0, 0 }, |
| 62 | {"suffix", 0, POPT_ARG_STRING, &backup_suffix, 0, 0, 0 }, |