[SCM] The rsync repository. - branch master updated

Rsync CVS commit messages rsync-cvs at lists.samba.org
Fri Nov 19 18:15:51 MST 2010


The branch, master has been updated
       via  51b2ff0 Optimize --inplace chunck search to avoid a non-aligned search.
      from  96e051c Use ftruncate() at the end of a --sparse file. Fixes bug 7337.

;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 51b2ff03b3f45b360b75109148cd0606621089bc
Author: Wayne Davison <wayned at samba.org>
Date:   Mon Nov 8 23:22:33 2010 -0800

    Optimize --inplace chunck search to avoid a non-aligned search.

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

Summary of changes:
 match.c |   40 +++++++++++++++++++++-------------------
 1 files changed, 21 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/match.c b/match.c
index 611035f..229c9dd 100644
--- a/match.c
+++ b/match.c
@@ -142,7 +142,7 @@ static void matched(int f, struct sum_struct *s, struct map_struct *buf,
 static void hash_search(int f,struct sum_struct *s,
 			struct map_struct *buf, OFF_T len)
 {
-	OFF_T offset, end;
+	OFF_T offset, aligned_offset, end;
 	int32 k, want_i, backup;
 	char sum2[SUM_LENGTH];
 	uint32 s1, s2, sum;
@@ -168,7 +168,7 @@ static void hash_search(int f,struct sum_struct *s,
 	if (DEBUG_GTE(DELTASUM, 3))
 		rprintf(FINFO, "sum=%.8x k=%ld\n", sum, (long)k);
 
-	offset = 0;
+	offset = aligned_offset = 0;
 
 	end = len + 1 - s->sums[s->count-1].len;
 
@@ -233,24 +233,27 @@ static void hash_search(int f,struct sum_struct *s,
 
 			/* When updating in-place, the best possible match is
 			 * one with an identical offset, so we prefer that over
-			 * the following want_i optimization. */
+			 * the adjacent want_i optimization. */
 			if (updating_basis_file) {
-				int32 i2;
-				for (i2 = i; i2 >= 0; i2 = s->sums[i2].chain) {
-					if (s->sums[i2].offset != offset)
-						continue;
-					if (i2 != i) {
-						if (sum != s->sums[i2].sum1)
-							break;
-						if (memcmp(sum2, s->sums[i2].sum2,
-							   s->s2length) != 0)
-							break;
-						i = i2;
+				/* All the sender's chunks start at blength boundaries. */
+				while (aligned_offset < offset)
+					aligned_offset += s->blength;
+				if (offset == aligned_offset) {
+					int32 i2;
+					for (i2 = i; i2 >= 0; i2 = s->sums[i2].chain) {
+						if (s->sums[i2].offset != offset)
+							continue;
+						if (i2 != i) {
+							if (sum != s->sums[i2].sum1
+							 || memcmp(sum2, s->sums[i2].sum2, s->s2length) != 0)
+								break;
+							i = i2;
+						}
+						/* This chunk was at the same offset on
+						 * both the sender and the receiver. */
+						s->sums[i].flags |= SUMFLG_SAME_OFFSET;
+						want_i = i;
 					}
-					/* This chunk was at the same offset on
-					 * both the sender and the receiver. */
-					s->sums[i].flags |= SUMFLG_SAME_OFFSET;
-					goto set_want_i;
 				}
 			}
 
@@ -265,7 +268,6 @@ static void hash_search(int f,struct sum_struct *s,
 				 * will be happy */
 				i = want_i;
 			}
-		    set_want_i:
 			want_i = i + 1;
 
 			matched(f,s,buf,offset,i);


-- 
The rsync repository.


More information about the rsync-cvs mailing list