sftp reget/reput

Damien Miller djm at mindrot.org
Thu Sep 18 08:12:12 EST 2003


On Wed, 2003-09-17 at 19:18, Markus Friedl wrote:
> we could modify the protocol and implement
> rolling checksums like Niels Provos suggests:
> 
> 	MD5_CTX ctx1, ctx2;
> 
> 	MD5_Init(&ctx1);
> 
> 	while new page in data
> 	  MD5_Update(&ctx1, newpage, pagesize)
> 	  ctx2 = ctx1;
> 	  MD5_Final(digest, &ctx2)
> 	  if (compare with remote not equal)
> 	     break;
> 	end while
> 
> 	continue data transfer.

That is a nice idea. Poor man's rsync :)

-d

> On Wed, Sep 17, 2003 at 11:12:36AM +0800, Dmitry Lohansky wrote:
> > Hello openssh@
> > 
> > I thought about sftp's reget/reput commands.
> > 
> > Several days ago, Damien Miller write to tech at openbsd.org (it was
> > reply for my letter):
> > 
> > > Herein lies a problem which is not easy to detect or solve. For
> > > performance reasons, the sftp client does pipelined reads/writes when
> > > transferring files. The protocol spec allows for a server to process
> > > these requests out of order. For example:
> > 
> > > client                     server
> > > ------                     ------
> > > open file                  your file handle is "blah"
> > > gimme bytes 0-8191
> > > gimme bytes 8192-16383
> > > gimme bytes 16384-24575
> > > gimme bytes 24576-32767    here are bytes 24576-32767
> > > close file                 here are bytes 16384-24575
> > >                            here are bytes 8192-16383
> > >                            here are bytes 0-8191
> > >                            close successful
> > 
> > > If the client writes the bytes our in the order they are received (which
> > > it probably should, to avoid buffering large amounts of data) then an
> > > interruption will leave a full-length, but "holey" file on disk. There
> > > is no general way to determine how to do resume such a transfer.
> > 
> > > The best the client can do to make transfers resumable is ftruncate()
> > > the file at the highest contiguous byte received. This will stop the
> > > potential corruption on resume.
> > 
> > This is good method, but if client crash, we also may get a "hole".
> > What your think about next way?
> > 
> > Storing extra-data at the end of file, for example:
> > 
> > <---orig-part-><-extra->
> > [*][ ][*][ ][*][*******]
> > <---------file--------->
> > 
> > where [*] - already loaded data, [ ] - not yet
> > 
> > In extra part, we may store which block was already loaded and it
> > offset and size. After download, extra part will be removed.
> > 
> > Comments?
> > -- 
> >  Dmitry Lohansky




More information about the openssh-unix-dev mailing list