File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / patches / sparse-block.diff
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 00:32:36 2021 UTC (3 years, 3 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, HEAD
rsync 3.2.3

    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: e94bad1c156fc3910f24e2b3b71a81b0b0bdeb70
   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);
   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: @@ -76,6 +76,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 = SPARSE_WRITE_SIZE;
   50:  int preallocate_files = 0;
   51:  int do_compression = 0;
   52:  int do_compression_level = CLVL_NOT_SPECIFIED;
   53: @@ -692,6 +693,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: @@ -2684,6 +2686,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: @@ -379,6 +379,7 @@ detailed description below for a complete description.
   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:  --write-devices          write to devices as files (implies --inplace)
   84:  --dry-run, -n            perform a trial run with no changes made
   85: @@ -1477,6 +1478,18 @@ your home directory (remove the '=' for that).
   86:      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` (`-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` is used, rsync checks every 1024-bytes chunk to detect if
   96: +    they are actually filled with data or not.  With certain filesystems,
   97: +    optimized to receive data streams for example, enlarging this block size
   98: +    can strongly increase performance.  The option can be used to tune this
   99: +    block size.
  100: +
  101:  0.  `--dry-run`, `-n`
  102:  
  103:      This makes rsync perform a trial run that doesn't make any changes (and
  104: diff -Nurp a/rsync.1 b/rsync.1
  105: --- a/rsync.1
  106: +++ b/rsync.1
  107: @@ -455,6 +455,7 @@ detailed description below for a complet
  108:  --super                  receiver attempts super-user activities
  109:  --fake-super             store/recover privileged attrs using xattrs
  110:  --sparse, -S             turn sequences of nulls into sparse blocks
  111: +--sparse-block=SIZE      set block size used to handle sparse files
  112:  --preallocate            allocate dest files before writing them
  113:  --write-devices          write to devices as files (implies --inplace)
  114:  --dry-run, -n            perform a trial run with no changes made
  115: @@ -1541,6 +1542,16 @@ NTFS, etc.), this option may have no pos
  116:  If combined with \fB\-\-sparse\fP, the file will only have sparse blocks (as
  117:  opposed to allocated sequences of null bytes) if the kernel version and
  118:  filesystem type support creating holes in the allocated data.
  119: +.IP "\fB\-\-sparse-block=SIZE\fP"
  120: +Change the block size used to handle sparse files to SIZE bytes.  This
  121: +option only has an effect if the \fB\-\-sparse\fP (\fB\-S\fP) option was also
  122: +specified.  The default block size used by rsync to detect a file hole is
  123: +1024 bytes; when the receiver writes data to the destination file and
  124: +option \fB\-\-sparse\fP is used, rsync checks every 1024-bytes chunk to detect if
  125: +they are actually filled with data or not.  With certain filesystems,
  126: +optimized to receive data streams for example, enlarging this block size
  127: +can strongly increase performance.  The option can be used to tune this
  128: +block size.
  129:  .IP "\fB\-\-dry-run\fP, \fB\-n\fP"
  130:  This makes rsync perform a trial run that doesn't make any changes (and
  131:  produces mostly the same output as a real run).  It is most commonly used
  132: diff -Nurp a/rsync.1.html b/rsync.1.html
  133: --- a/rsync.1.html
  134: +++ b/rsync.1.html
  135: @@ -370,6 +370,7 @@ detailed description below for a complet
  136:  --super                  receiver attempts super-user activities
  137:  --fake-super             store/recover privileged attrs using xattrs
  138:  --sparse, -S             turn sequences of nulls into sparse blocks
  139: +--sparse-block=SIZE      set block size used to handle sparse files
  140:  --preallocate            allocate dest files before writing them
  141:  --write-devices          write to devices as files (implies --inplace)
  142:  --dry-run, -n            perform a trial run with no changes made
  143: @@ -1420,6 +1421,18 @@ opposed to allocated sequences of null b
  144:  filesystem type support creating holes in the allocated data.</p>
  145:  </dd>
  146:  
  147: +<dt><code>--sparse-block=SIZE</code></dt><dd>
  148: +<p>Change the block size used to handle sparse files to SIZE bytes.  This
  149: +option only has an effect if the <code>--sparse</code> (<code>-S</code>) option was also
  150: +specified.  The default block size used by rsync to detect a file hole is
  151: +1024 bytes; when the receiver writes data to the destination file and
  152: +option <code>--sparse</code> is used, rsync checks every 1024-bytes chunk to detect if
  153: +they are actually filled with data or not.  With certain filesystems,
  154: +optimized to receive data streams for example, enlarging this block size
  155: +can strongly increase performance.  The option can be used to tune this
  156: +block size.</p>
  157: +</dd>
  158: +
  159:  <dt><code>--dry-run</code>, <code>-n</code></dt><dd>
  160:  <p>This makes rsync perform a trial run that doesn't make any changes (and
  161:  produces mostly the same output as a real run).  It is most commonly used

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>