The patches for 3.2.7.
[rsync.git/patches.git] / sparse-block.diff
1 This patch adds the --sparse-block option.  Andrea Righi writes:
2
3   In some filesystems, typically optimized for large I/O throughputs (like
4   IBM GPFS, IBM SAN FS, or distributed filesystems in general) a lot of
5   lseek() operations can strongly impact on performances. In this cases it
6   can be helpful to enlarge the block size used to handle sparse files
7   directly from a command line parameter.
8
9   For example, using a sparse write size of 32KB, I've been able to
10   increase the transfer rate of an order of magnitude copying the output
11   files of scientific applications from GPFS to GPFS or GPFS to SAN FS.
12
13   -Andrea
14
15 To use this patch, run these commands for a successful build:
16
17     patch -p1 <patches/sparse-block.diff
18     ./configure                               (optional if already run)
19     make
20
21 based-on: 6b5ae825db985e9d1c98576651b50c8e490ddb97
22 diff --git a/fileio.c b/fileio.c
23 --- a/fileio.c
24 +++ b/fileio.c
25 @@ -34,6 +34,7 @@
26  #define ALIGNED_LENGTH(len) ((((len) - 1) | (ALIGN_BOUNDARY-1)) + 1)
27  
28  extern int sparse_files;
29 +extern int sparse_files_block_size;
30  
31  OFF_T preallocated_len = 0;
32  
33 @@ -149,7 +150,7 @@ int write_file(int f, int use_seek, OFF_T offset, const char *buf, int len)
34         while (len > 0) {
35                 int r1;
36                 if (sparse_files > 0) {
37 -                       int len1 = MIN(len, SPARSE_WRITE_SIZE);
38 +                       int len1 = MIN(len, sparse_files_block_size ? sparse_files_block_size : SPARSE_WRITE_SIZE);
39                         r1 = write_sparse(f, use_seek, offset, buf, len1);
40                         offset += r1;
41                 } else {
42 diff --git a/options.c b/options.c
43 --- a/options.c
44 +++ b/options.c
45 @@ -83,6 +83,7 @@ int remove_source_files = 0;
46  int one_file_system = 0;
47  int protocol_version = PROTOCOL_VERSION;
48  int sparse_files = 0;
49 +long sparse_files_block_size = 0;
50  int preallocate_files = 0;
51  int do_compression = 0;
52  int do_compression_level = CLVL_NOT_SPECIFIED;
53 @@ -701,6 +702,7 @@ static struct poptOption long_options[] = {
54    {"sparse",          'S', POPT_ARG_VAL,    &sparse_files, 1, 0, 0 },
55    {"no-sparse",        0,  POPT_ARG_VAL,    &sparse_files, 0, 0, 0 },
56    {"no-S",             0,  POPT_ARG_VAL,    &sparse_files, 0, 0, 0 },
57 +  {"sparse-block",     0,  POPT_ARG_LONG,   &sparse_files_block_size, 0, 0, 0 },
58    {"preallocate",      0,  POPT_ARG_NONE,   &preallocate_files, 0, 0, 0},
59    {"inplace",          0,  POPT_ARG_VAL,    &inplace, 1, 0, 0 },
60    {"no-inplace",       0,  POPT_ARG_VAL,    &inplace, 0, 0, 0 },
61 @@ -2750,6 +2752,12 @@ void server_options(char **args, int *argc_p)
62                 args[ac++] = arg;
63         }
64  
65 +       if (sparse_files_block_size) {
66 +               if (asprintf(&arg, "--sparse-block=%lu", sparse_files_block_size) < 0)
67 +                       goto oom;
68 +               args[ac++] = arg;
69 +       }
70 +
71         if (io_timeout) {
72                 if (asprintf(&arg, "--timeout=%d", io_timeout) < 0)
73                         goto oom;
74 diff --git a/rsync.1.md b/rsync.1.md
75 --- a/rsync.1.md
76 +++ b/rsync.1.md
77 @@ -466,6 +466,7 @@ has its own detailed description later in this manpage.
78  --super                  receiver attempts super-user activities
79  --fake-super             store/recover privileged attrs using xattrs
80  --sparse, -S             turn sequences of nulls into sparse blocks
81 +--sparse-block=SIZE      set block size used to handle sparse files
82  --preallocate            allocate dest files before writing them
83  --dry-run, -n            perform a trial run with no changes made
84  --whole-file, -W         copy files whole (w/o delta-xfer algorithm)
85 @@ -1728,6 +1729,18 @@ expand it.
86      (as opposed to allocated sequences of null bytes) if the kernel version and
87      filesystem type support creating holes in the allocated data.
88  
89 +0.  `--sparse-block=SIZE`
90 +
91 +    Change the block size used to handle sparse files to SIZE bytes.  This
92 +    option only has an effect if the [`--sparse`](#opt) (`-S`) option was also
93 +    specified.  The default block size used by rsync to detect a file hole is
94 +    1024 bytes; when the receiver writes data to the destination file and
95 +    option [`--sparse`](#opt) is used, rsync checks every 1024-bytes chunk to
96 +    detect if they are actually filled with data or not.  With certain
97 +    filesystems, optimized to receive data streams for example, enlarging this
98 +    block size can strongly increase performance.  The option can be used to
99 +    tune this block size.
100 +
101  0.  `--dry-run`, `-n`
102  
103      This makes rsync perform a trial run that doesn't make any changes (and