patch: timeout problem solved

Stefan Nehlsen sn at ParlaNet.de
Tue Apr 23 02:23:02 EST 2002


hi,

I made some changes to generator.c :

 - reading data, calculating checksums and sending it to the sender now
   happens in one loop.

 - the code has become shorter

 - it uses less memory

 - 2 malloc's less that may fail

 - the line will be used all the time

 - it should be a bit faster

It seems to work for me, please have a look at it.

You should run "make proto" after applying the patch.


cu, Stefan
-- 
Stefan Nehlsen | ParlaNet Administration | sn at parlanet.de | +49 431 988-1260
-------------- next part --------------
--- rsync-2.5.5/generator.c	Mon Mar 25 06:54:31 2002
+++ rsync-2.5.5-gen/generator.c	Tue Apr 23 01:51:32 2002
@@ -102,28 +102,12 @@
 /*
   send a sums struct down a fd
   */
-static void send_sums(struct sum_struct *s, int f_out)
+static void send_null_sums(int f_out)
 {
-	if (s) {
-		size_t i;
-
-		/* tell the other guy how many we are going to be
-		   doing and how many bytes there are in the last
-		   chunk */
-		write_int(f_out, s->count);
-		write_int(f_out, s->n);
-		write_int(f_out, s->remainder);
-
-		for (i = 0; i < s->count; i++) {
-			write_int(f_out, s->sums[i].sum1);
-			write_buf(f_out, s->sums[i].sum2, csum_length);
-		}
-	} else {
-		/* we don't have checksums */
-		write_int(f_out, 0);
-		write_int(f_out, block_size);
-		write_int(f_out, 0);
-	}
+	/* we don't have checksums */
+	write_int(f_out, 0);
+	write_int(f_out, block_size);
+	write_int(f_out, 0);
 }
 
 
@@ -162,57 +146,43 @@
 
   generate approximately one checksum every n bytes
   */
-static struct sum_struct *generate_sums(struct map_struct *buf,OFF_T len,int n)
+void generate_and_send_sums(struct map_struct *buf,OFF_T len,int block_len, int f_out)
 {
-	int i;
-	struct sum_struct *s;
-	int count;
-	int block_len = n;
-	int remainder = (len%block_len);
+	size_t i;
+	struct sum_struct sum;
 	OFF_T offset = 0;
 
-	count = (len+(block_len-1))/block_len;
-
-	s = (struct sum_struct *)malloc(sizeof(*s));
-	if (!s) out_of_memory("generate_sums");
-
-	s->count = count;
-	s->remainder = remainder;
-	s->n = n;
-	s->flength = len;
-
-	if (count==0) {
-		s->sums = NULL;
-		return s;
-	}
+	sum.count = (len+(block_len-1))/block_len;
+	sum.remainder = (len%block_len);
+	sum.n = block_len;
+	sum.flength = len;
+	/* not needed here  sum.sums = NULL; */
 
-	if (verbose > 3)
+	if (sum.count && verbose > 3)
 		rprintf(FINFO,"count=%d rem=%d n=%d flength=%.0f\n",
-			s->count,s->remainder,s->n,(double)s->flength);
+			sum.count,sum.remainder,sum.n,(double)sum.flength);
 
-	s->sums = (struct sum_buf *)malloc(sizeof(s->sums[0])*s->count);
-	if (!s->sums) out_of_memory("generate_sums");
-  
-	for (i=0;i<count;i++) {
-		int n1 = MIN(len,n);
-		char *map = map_ptr(buf,offset,n1);
+	write_int(f_out, sum.count);
+	write_int(f_out, sum.n);
+	write_int(f_out, sum.remainder);
 
-		s->sums[i].sum1 = get_checksum1(map,n1);
-		get_checksum2(map,n1,s->sums[i].sum2);
+	for (i=0;i<sum.count;i++) {
+		int n1 = MIN(len,block_len);
+		char *map = map_ptr(buf,offset,n1);
+		uint32 sum1 = get_checksum1(map,n1);
+		char sum2[SUM_LENGTH];
 
-		s->sums[i].offset = offset;
-		s->sums[i].len = n1;
-		s->sums[i].i = i;
+		get_checksum2(map,n1,&sum2[0]);
 
 		if (verbose > 3)
 			rprintf(FINFO,"chunk[%d] offset=%.0f len=%d sum1=%08x\n",
-				i,(double)s->sums[i].offset,s->sums[i].len,s->sums[i].sum1);
+				i,(double)offset,n1,sum1);
 
+		write_int(f_out, sum1);
+		write_buf(f_out, &sum2[0], csum_length);
 		len -= n1;
 		offset += n1;
 	}
-
-	return s;
 }
 
 
@@ -230,7 +200,6 @@
 	int fd;
 	STRUCT_STAT st;
 	struct map_struct *buf;
-	struct sum_struct *s;
 	int statret;
 	struct file_struct *file = flist->files[i];
 	char *fnamecmp;
@@ -389,7 +358,7 @@
 	if (statret == -1) {
 		if (errno == ENOENT) {
 			write_int(f_out,i);
-			if (!dry_run) send_sums(NULL,f_out);
+			if (!dry_run) send_null_sums(f_out);
 		} else {
 			if (verbose > 1)
 				rprintf(FERROR, RSYNC_NAME
@@ -406,7 +375,7 @@
 
 		/* now pretend the file didn't exist */
 		write_int(f_out,i);
-		if (!dry_run) send_sums(NULL,f_out);    
+		if (!dry_run) send_null_sums(f_out);    
 		return;
 	}
 
@@ -435,7 +404,7 @@
 
 	if (disable_deltas_p()) {
 		write_int(f_out,i);
-		send_sums(NULL,f_out);    
+		send_null_sums(f_out);    
 		return;
 	}
 
@@ -446,7 +415,7 @@
 		rprintf(FERROR,RSYNC_NAME": failed to open \"%s\", continuing : %s\n",fnamecmp,strerror(errno));
 		/* pretend the file didn't exist */
 		write_int(f_out,i);
-		send_sums(NULL,f_out);
+		send_null_sums(f_out);
 		return;
 	}
 
@@ -456,21 +425,17 @@
 		buf = NULL;
 	}
 
+	write_int(f_out,i); /* send file number */
 	if (verbose > 3)
 		rprintf(FINFO,"gen mapped %s of size %.0f\n",fnamecmp,(double)st.st_size);
 
-	s = generate_sums(buf,st.st_size,adapt_block_size(file, block_size));
-
 	if (verbose > 2)
-		rprintf(FINFO,"sending sums for %d\n",i);
+		rprintf(FINFO,"generating and sending sums for %d\n",i);
 
-	write_int(f_out,i);
-	send_sums(s,f_out);
+	generate_and_send_sums(buf,st.st_size,adapt_block_size(file, block_size),f_out);
 
 	close(fd);
 	if (buf) unmap_file(buf);
-
-	free_sums(s);
 }
 
 


More information about the rsync mailing list