43992c84d62162bfb48d817eed3745307101610b
[rsync-patches.git] / slow-down.diff
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 based-on: 9a06b2edb0ea1a226bcc642682c07bacd2ea47d3
18 diff --git a/flist.c b/flist.c
19 --- a/flist.c
20 +++ b/flist.c
21 @@ -74,6 +74,7 @@ extern int output_needs_newline;
22  extern int sender_keeps_checksum;
23  extern int trust_sender_filter;
24  extern int unsort_ndx;
25 +extern unsigned long sleep_asec;
26  extern uid_t our_uid;
27  extern struct stats stats;
28  extern char *filesfrom_host;
29 @@ -1879,6 +1880,9 @@ static void send_directory(int f, struct file_list *flist, char *fbuf, int len,
30                 }
31  
32                 send_file_name(f, flist, fbuf, NULL, flags, filter_level);
33 +               /* Sleep for a bit, to avoid hammering the disk. */
34 +               if (sleep_asec)
35 +                       usleep(sleep_asec);
36         }
37  
38         fbuf[len] = '\0';
39 diff --git a/options.c b/options.c
40 --- a/options.c
41 +++ b/options.c
42 @@ -122,6 +122,7 @@ int size_only = 0;
43  int daemon_bwlimit = 0;
44  int bwlimit = 0;
45  int fuzzy_basis = 0;
46 +unsigned long sleep_asec = 0;
47  size_t bwlimit_writemax = 0;
48  int ignore_existing = 0;
49  int ignore_non_existing = 0;
50 @@ -774,6 +775,7 @@ static struct poptOption long_options[] = {
51    {"itemize-changes", 'i', POPT_ARG_NONE,   0, 'i', 0, 0 },
52    {"no-itemize-changes",0, POPT_ARG_VAL,    &itemize_changes, 0, 0, 0 },
53    {"no-i",             0,  POPT_ARG_VAL,    &itemize_changes, 0, 0, 0 },
54 +  {"slow-down",        0,  POPT_ARG_LONG,   &sleep_asec, 0, 0, 0 },
55    {"bwlimit",          0,  POPT_ARG_STRING, &bwlimit_arg, OPT_BWLIMIT, 0, 0 },
56    {"no-bwlimit",       0,  POPT_ARG_VAL,    &bwlimit, 0, 0, 0 },
57    {"backup",          'b', POPT_ARG_VAL,    &make_backups, 1, 0, 0 },
58 diff --git a/rsync.1.md b/rsync.1.md
59 --- a/rsync.1.md
60 +++ b/rsync.1.md
61 @@ -547,6 +547,7 @@ has its own detailed description later in this manpage.
62  --early-input=FILE       use FILE for daemon's early exec input
63  --list-only              list the files instead of copying them
64  --bwlimit=RATE           limit socket I/O bandwidth
65 +--slow-down=USECs        sleep N usec while creating the filelist
66  --stop-after=MINS        Stop rsync after MINS minutes have elapsed
67  --stop-at=y-m-dTh:m      Stop rsync at the specified point in time
68  --fsync                  fsync every written file