On Fri, Sep 04, 2009 at 10:26:43AM -0700, Greg Siekas wrote:
> Is it possible to disable checksumming?  I'm using rsync with -W,
> whole file, so if a file has changed I don't want to just transfer
> the changes.

There is not currently a way to do that.  I whipped up the appended
patch that makes -WW disable full-file checksum computation and makes
that the default for a local transfer.  When comparing -W vs -WW in some
local-transfer testing, it didn't result in any perceivable difference
in transfer speed or runtime.  You can verify that it is enabled by
using --out-format='%i %C %n%L' and noting that all the checksums turn
into all-bits-on values (the checksum bytes are still transmitted so
that a read-error on the sending side can be indicated to the receiver).

..wayne..
index 6655acd..d8b228d 100644
--- a/compat.c
+++ b/compat.c
@@ -34,6 +34,7 @@ extern int use_qsort;
 extern int allow_inc_recurse;
 extern int append_mode;
 extern int fuzzy_basis;
+extern int whole_file;
 extern int read_batch;
 extern int delay_updates;
 extern int checksum_seed;
@@ -286,6 +287,8 @@ void setup_protocol(int f_out,int f_in)
 		receiver_symlink_times = 1;
 #endif
 	}
+	if (whole_file > 1 && protocol_version < 31)
+		whole_file = 1;
 
 	if (need_unsorted_flist && (!am_sender || inc_recurse))
 		unsort_ndx = ++file_extra_cnt;
index 407568d..72636eb 100644
--- a/main.c
+++ b/main.c
@@ -519,7 +519,7 @@ static pid_t do_cmd(char *cmd, char *machine, char *user, char **remote_argv, in
 		/* If the user didn't request --[no-]whole-file, force
 		 * it on, but only if we're not batch processing. */
 		if (whole_file < 0 && !write_batch)
-			whole_file = 1;
+			whole_file = 2;
 		set_allow_inc_recurse();
 		pid = local_child(argc, args, f_in_p, f_out_p, child_main);
 #ifdef ICONV_CONST
index 611035f..2c356e3 100644
--- a/match.c
+++ b/match.c
@@ -25,6 +25,7 @@
 extern int checksum_seed;
 extern int append_mode;
 extern int checksum_len;
+extern int whole_file;
 
 int updating_basis_file;
 char sender_file_sum[MAX_DIGEST_LEN];
@@ -124,9 +125,11 @@ static void matched(int f, struct sum_struct *s, struct map_struct *buf,
 		n += s->sums[i].len;
 	}
 
-	for (j = 0; j < n; j += CHUNK_SIZE) {
-		int32 n1 = MIN(CHUNK_SIZE, n - j);
-		sum_update(map_ptr(buf, last_match + j, n1), n1);
+	if (whole_file < 2) {
+		for (j = 0; j < n; j += CHUNK_SIZE) {
+			int32 n1 = MIN(CHUNK_SIZE, n - j);
+			sum_update(map_ptr(buf, last_match + j, n1), n1);
+		}
 	}
 
 	if (i >= 0)
@@ -336,7 +339,10 @@ void match_sums(int f, struct sum_struct *s, struct map_struct *buf, OFF_T len)
 	matches = 0;
 	data_transfer = 0;
 
-	sum_init(checksum_seed);
+	if (whole_file < 2)
+		sum_init(checksum_seed);
+	else
+		memset(sender_file_sum, 0xFF, checksum_len);
 
 	if (append_mode > 0) {
 		if (append_mode == 2) {
@@ -377,7 +383,7 @@ void match_sums(int f, struct sum_struct *s, struct map_struct *buf, OFF_T len)
 		matched(f, s, buf, len, -1);
 	}
 
-	if (sum_end(sender_file_sum) != checksum_len)
+	if (whole_file < 2 && sum_end(sender_file_sum) != checksum_len)
 		overflow_exit("checksum_len"); /* Impossible... */
 
 	/* If we had a read error, send a bad checksum.  We use all bits
index 66820b5..f9b1939 100644
--- a/options.c
+++ b/options.c
@@ -34,14 +34,9 @@ extern filter_rule_list daemon_filter_list;
 
 int make_backups = 0;
 
-/**
- * If 1, send the whole file as literal data rather than trying to
- * create an incremental diff.
- *
- * If -1, then look at whether we're local or remote and go by that.
- *
- * @sa disable_deltas_p()
- **/
+/* If 1, send the whole file as literal data rather than trying to
+ * create an incremental diff.  If > 1, disable full-file checksumming.
+ * If -1, then look at whether we're local or remote and go by that. */
 int whole_file = -1;
 
 int append_mode = 0;
@@ -928,7 +923,7 @@ static struct poptOption long_options[] = {
   {"exclude-from",     0,  POPT_ARG_STRING, 0, OPT_EXCLUDE_FROM, 0, 0 },
   {"include-from",     0,  POPT_ARG_STRING, 0, OPT_INCLUDE_FROM, 0, 0 },
   {"cvs-exclude",     'C', POPT_ARG_NONE,   &cvs_exclude, 0, 0, 0 },
-  {"whole-file",      'W', POPT_ARG_VAL,    &whole_file, 1, 0, 0 },
+  {"whole-file",      'W', POPT_ARG_NONE,   0, 'W', 0, 0 },
   {"no-whole-file",    0,  POPT_ARG_VAL,    &whole_file, 0, 0, 0 },
   {"no-W",             0,  POPT_ARG_VAL,    &whole_file, 0, 0, 0 },
   {"checksum",        'c', POPT_ARG_VAL,    &always_checksum, 1, 0, 0 },
@@ -1499,6 +1494,12 @@ int parse_arguments(int *argc_p, const char ***argv_p)
 			}
 			break;
 
+		case 'W':
+			if (whole_file < 0)
+				whole_file = 0;
+			whole_file++;
+			break;
+
 		case 'P':
 			if (refused_partial || refused_progress) {
 				create_refuse_error(refused_partial
@@ -2288,11 +2289,14 @@ void server_options(char **args, int *argc_p)
 			argstr[x++] = 'k';
 	}
 
-	if (whole_file > 0)
-		argstr[x++] = 'W';
 	/* We don't need to send --no-whole-file, because it's the
 	 * default for remote transfers, and in any case old versions
 	 * of rsync will not understand it. */
+	if (whole_file > 0) {
+		argstr[x++] = 'W';
+		if (whole_file > 1)
+			argstr[x++] = 'W';
+	}
 
 	if (preserve_hard_links) {
 		argstr[x++] = 'H';
index 1738dca..1761075 100644
--- a/receiver.c
+++ b/receiver.c
@@ -30,6 +30,7 @@ extern int log_before_transfer;
 extern int stdout_format_has_i;
 extern int logfile_format_has_i;
 extern int csum_length;
+extern int whole_file;
 extern int read_batch;
 extern int write_batch;
 extern int batch_gen_fd;
@@ -220,7 +221,10 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
 	} else
 		mapbuf = NULL;
 
-	sum_init(checksum_seed);
+	if (whole_file < 2)
+		sum_init(checksum_seed);
+	else
+		memset(file_sum1, 0xFF, checksum_len);
 
 	if (append_mode > 0) {
 		OFF_T j;
@@ -263,7 +267,8 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
 			stats.literal_data += i;
 			cleanup_got_literal = 1;
 
-			sum_update(data, i);
+			if (whole_file < 2)
+				sum_update(data, i);
 
 			if (fd != -1 && write_file(fd,data,i) != i)
 				goto report_write_error;
@@ -289,7 +294,8 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
 			map = map_ptr(mapbuf,offset2,len);
 
 			see_token(map, len);
-			sum_update(map, len);
+			if (whole_file < 2)
+				sum_update(map, len);
 		}
 
 		if (updating_basis_or_equiv) {
@@ -334,7 +340,7 @@ static int receive_data(int f_in, char *fname_r, int fd_r, OFF_T size_r,
 		exit_cleanup(RERR_FILEIO);
 	}
 
-	if (sum_end(file_sum1) != checksum_len)
+	if (whole_file < 2 && sum_end(file_sum1) != checksum_len)
 		overflow_exit("checksum_len"); /* Impossible... */
 
 	if (mapbuf)
index 9283425..dfe8bb9 100644
--- a/rsync.yo
+++ b/rsync.yo
@@ -1146,9 +1146,12 @@ dit(bf(-W, --whole-file)) With this option rsync's delta-transfer algorithm
 is not used and the whole file is sent as-is instead.  The transfer may be
 faster if this option is used when the bandwidth between the source and
 destination machines is higher than the bandwidth to disk (especially when the
-"disk" is actually a networked filesystem).  This is the default when both
+"disk" is actually a networked filesystem).  If the bf(--whole-file) option is
+repeated, rsync will also disable the computation of the full-file checksum.
+Both sides must be speaking at least protocol 31 to support this (first
+supported in 3.1.0).  A default of bf(-WW) is assume when both
 the source and destination are specified as local paths, but only if no
-batch-writing option is in effect.
+bf(-W), bf(--no-W), or batch-writing option was specified.
 
 dit(bf(-x, --one-file-system)) This tells rsync to avoid crossing a
 filesystem boundary when recursing.  This does not limit the user's ability
-- 
Please use reply-all for most replies to avoid omitting the mailing list.
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html

Reply via email to