incorporate the new fcp command (and code) into replica to facilitate faster pulls from slower connections. this setup has been running on plan9.ucalgary.ca and a couple of other places for the past week without any significant issues. Reference: /n/sources/patch/applied/replica-fcp Date: Mon Mar 14 17:41:13 CET 2005 --- /sys/src/cmd/replica/applylog.c Mon Mar 14 17:39:59 2005 +++ /sys/src/cmd/replica/applylog.c Mon Mar 14 17:39:56 2005 @@ -1,11 +1,20 @@ #include "all.h" +#define Nwork 16 + int localdirstat(char*, Dir*); int ismatch(char*); void conflict(char*, char*, ...); void error(char*, ...); int isdir(char*); +void worker(int fdf, int fdt, char *from, char *to); +vlong nextoff(void); +void failure(void *, char *note); + +QLock lk; +vlong off; + int errors; int nconf; int donothing; @@ -615,32 +624,94 @@ static int copy1(int fdf, int fdt, char *from, char *to) { - char buf[DEFB]; - long n, n1, rcount; - int rv; - char err[ERRMAX]; - - /* clear any residual error */ - err[0] = '\0'; - errstr(err, ERRMAX); - rv = 0; - for(rcount=0;; rcount++) { - n = read(fdf, buf, DEFB); - if(n <= 0) + int i, n, rv, pid[Nwork]; + Waitmsg *w; + + n = 0; + off = 0; + for(i=0; imsg[0]){ + rv = -1; + for(i=0; i 0) + postnote(PNPROC, pid[i], "failure"); + } + free(w); } return rv; } + +void +worker(int fdf, int fdt, char *from, char *to) +{ + char buf[DEFB], *bp; + long len, n; + vlong o; + + len = sizeof(buf); + bp = buf; + o = nextoff(); + + while(n = pread(fdf, bp, len, o)){ + if(n < 0){ + fprint(2, "reading %s: %r\n", from); + _exits("bad"); + } + if(pwrite(fdt, buf, n, o) != n){ + fprint(2, "writing %s: %r\n", to); + _exits("bad"); + } + bp += n; + o += n; + len -= n; + if(len == 0){ + len = sizeof buf; + bp = buf; + o = nextoff(); + } + } + _exits(nil); +} + +vlong +nextoff(void) +{ + vlong o; + + qlock(&lk); + o = off; + off += DEFB; + qunlock(&lk); + + return o; +} + +void +failure(void*, char *note) +{ + if(strcmp(note, "failure") == 0) + _exits(nil); + noted(NDFLT); +} + static int opentemp(char *template) --- /rc/bin/replica/pull Mon Mar 14 17:40:11 2005 +++ /rc/bin/replica/pull Mon Mar 14 17:40:08 2005 @@ -21,7 +21,7 @@ s=`{ls -l $serverlog >[2]/dev/null |awk '{print $6}'} if(~ $n 0 || ~ $#n 0 || test $s -lt $n){ if(test -e $clientlog) must rm $clientlog - must cp $serverlog $clientlog + must fcp $serverlog $clientlog } if not{ m=`{echo $n-1024 | hoc} @@ -34,7 +34,7 @@ must tail +^$n^c $serverlog >>$clientlog case *': differ' must rm $clientlog - must cp $serverlog $clientlog + must fcp $serverlog $clientlog case '' ; case *