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 <way...@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 <way...@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.
_______________________________________________
rsync-cvs mailing list
rsync-cvs@lists.samba.org
https://lists.samba.org/mailman/listinfo/rsync-cvs

Reply via email to