[SCM] The rsync repository. - branch master updated

Rsync CVS commit messages rsync-cvs at lists.samba.org
Fri Jan 14 22:31:47 MST 2011


The branch, master has been updated
       via  580cffd Sender realigns chunks with generator during an --inplace copy when sending a sequence of zeros.
       via  58a1c1a Make sure an alternate --inplace sum has the right length and add missing break in --inplace same-offset loop.
      from  53e6507 Fix a bug in the trailing-slash handling.

;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 580cffdec9e6ef149bc9d2aa79bc46d302f08a73
Author: Wayne Davison <wayned at samba.org>
Date:   Fri Jan 14 21:32:15 2011 -0800

    Sender realigns chunks with generator during an --inplace copy
    when sending a sequence of zeros.

commit 58a1c1a218575ce80f8cd7f59526fa9047d7d0e6
Author: Wayne Davison <wayned at samba.org>
Date:   Fri Jan 14 10:29:54 2011 -0800

    Make sure an alternate --inplace sum has the right length
    and add missing break in --inplace same-offset loop.

-----------------------------------------------------------------------

Summary of changes:
 match.c |   35 +++++++++++++++++++++++++++--------
 1 files changed, 27 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/match.c b/match.c
index 2c7b616..cbb6fe2 100644
--- a/match.c
+++ b/match.c
@@ -91,8 +91,7 @@ static void build_hash_table(struct sum_struct *s)
 static OFF_T last_match;
 
 
-/**
- * Transmit a literal and/or match token.
+/* Transmit a literal and/or match token.
  *
  * This delightfully-named function is called either when we find a
  * match and need to transmit all the unmatched data leading up to it,
@@ -100,9 +99,9 @@ static OFF_T last_match;
  * transmit it.  As a result of this second case, it is called even if
  * we have not matched at all!
  *
- * @param i If >0, the number of a matched token.  If 0, indicates we
- * have only literal data.
- **/
+ * If i >= 0, the number of a matched token.  If < 0, indicates we have
+ * only literal data.  A -1 will send a 0-token-int too, and a -2 sends
+ * only literal data, w/o any token-int. */
 static void matched(int f, struct sum_struct *s, struct map_struct *buf,
 		    OFF_T offset, int32 i)
 {
@@ -238,20 +237,40 @@ static void hash_search(int f,struct sum_struct *s,
 				/* All the generator's chunks start at blength boundaries. */
 				while (aligned_offset < offset)
 					aligned_offset += s->blength;
-				if (offset == aligned_offset) {
+				if (offset == aligned_offset
+				 || (sum == 0 && l == s->blength && aligned_offset + l <= len)) {
 					int32 i2;
 					for (i2 = i; i2 >= 0; i2 = s->sums[i2].chain) {
-						if (s->sums[i2].offset != offset)
+						if (s->sums[i2].offset != aligned_offset)
 							continue;
 						if (i2 != i) {
 							if (sum != s->sums[i2].sum1
+							 || l != s->sums[i2].len
 							 || memcmp(sum2, s->sums[i2].sum2, s->s2length) != 0)
 								break;
 							i = i2;
 						}
+						want_i = i;
+						if (offset != aligned_offset) {
+							/* We've matched some zeros in a spot that is also zeros
+							 * further along in the basis file, if we find zeros ahead
+							 * in the sender's file, we'll output enough literal data
+							 * to re-align with the basis file, and get back to seeking
+							 * instead of writing. */
+							map = (schar *)map_ptr(buf, aligned_offset, l);
+							sum = get_checksum1((char *)map, l);
+							if (sum != s->sums[i2].sum1)
+								break;
+							get_checksum2((char *)map, l, sum2);
+							if (memcmp(sum2, s->sums[i2].sum2, s->s2length) != 0)
+								break;
+							/* OK, we have a re-alignment match.  Bump the offset
+							 * forward to the new match point. */
+							offset = aligned_offset;
+						}
 						/* This chunk remained in the same spot in the old and new file. */
 						s->sums[i].flags |= SUMFLG_SAME_OFFSET;
-						want_i = i;
+						break;
 					}
 				}
 			}


-- 
The rsync repository.


More information about the rsync-cvs mailing list