[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