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