[tahoe-dev] [tahoe-lafs] #1106: review #1037 (SFTP)

tahoe-lafs trac at tahoe-lafs.org
Thu Jul 8 14:14:24 UTC 2010


#1106: review #1037 (SFTP)
------------------------+---------------------------------------------------
     Reporter:  zooko   |       Owner:  zooko        
         Type:  defect  |      Status:  assigned     
     Priority:  major   |   Milestone:  1.7.1        
    Component:  code    |     Version:  1.7.0        
   Resolution:          |    Keywords:  review-needed
Launchpad Bug:          |  
------------------------+---------------------------------------------------

Comment (by zooko):

 Review notes (the review is not complete)

 David-Sarah: overall this is excellent work! It is readable and correct,
 with a few but not many parts that are un-idiomatic.

 Things that need to be responded to:
 * Hey look {{{sftpd.noisy}}} is {{{True}}}. Is that intentional?
 * Maybe document this with "assert" (and check it, too, when asserts are
 compiled in): {{{# invariant: self.download_size <= self.current_size}}}
 * Is it our job to unregister any extant producer before
 {{{self.producer=p in registerProducer()}}}?
 * !! Is that a busy eventually loop in _iterate() ? Bad!
 * add doc for self.async. I guess it means download is finished.
 * add doc for _convert_error()
 * data[offset:min(offset+length, len(data))] is the same as
 data[offset:offset+length]
 * Why do we need this catch-all-exceptions? Because err.value is not
 always an exception? This is noisy to the reader of source code.
 {{{
     try:
         if noisy: logmsg(traceback.format_exc(err.value), level=NOISY)
     except:  # pragma: no cover
         pass
 }}}
 * "The message argument to SFTPError must not reveal information that
 might compromise anonymity." Huh? Who's anonymity might be revealed to
 whom?
 * The following TODO can be removed based on testing in the 1.7.0
 development cycle (and feedback from 1.7.0 release) {{{TODO: check that
 clients are okay with this being a "?". (They should be because the
 longname is intended for human consumption.)}}}


 Ideas that don't necessarily need to be responded to:
 * class !OverwriteableFileConsumer could use unit tests
 * I think ".finish()" means the download is finished but local writes can
 proceed apace; docstring needed; Oh! I guess (based on the name) that it
 is defined by IFinishableConsumer. Maybe docstring that fact.
 * {{{# TODO: use download interface described in #993 when implemented.}}}
 I don't like "TODO" in comments in source code. They aren't usually
 noticed by the people who need to be reminded, and they often become stale
 (the thing no longer needs to be done, but nobody thinks to find the TODO
 and remove it.) I prefer issue tickets. This "TODO" should probably be
 deleted or moved to an issue ticket or maybe do the thing that it says to
 do. :-)
 * I find "eventually_callback(d)(expr)" harder to understand than
 "eventually(d.callback, expr)". (They do mean the same thing, right?) On
 the other hand I find self.async.addCallbacks(..., eventually_errback(d))
 to be mor easily read than any alternative.
 * idea: encourage users to experiment with hacking their SIZE_THRESHOLD,
 or perhaps even better do some more systematic measurements of how long it
 takes to download an entire file vs. to read parts out of a larger file in
 order to choose a more optimized SIZE_THRESHOLD.

-- 
Ticket URL: <http://tahoe-lafs.org/trac/tahoe-lafs/ticket/1106#comment:2>
tahoe-lafs <http://tahoe-lafs.org>
secure decentralized file storage grid


More information about the tahoe-dev mailing list