On Mon, Feb 6, 2012 at 2:03 PM, Greg Stein <gst...@gmail.com> wrote: > On Mon, Feb 6, 2012 at 14:32, Hyrum K Wright <hyrum.wri...@wandisco.com> > wrote: >> On Mon, Feb 6, 2012 at 1:28 PM, Greg Stein <gst...@gmail.com> wrote: >>> On Mon, Feb 6, 2012 at 12:48, <hwri...@apache.org> wrote: >>>> Author: hwright >>>> Date: Mon Feb 6 17:48:36 2012 >>>> New Revision: 1241097 >>>> >>>> URL: http://svn.apache.org/viewvc?rev=1241097&view=rev >>>> Log: >>>> Ev2 shims: Truthfully report our base checksum as being that of the empty >>>> stream. >>>> >>>> Note: This breaks several assumptions in various delta-editor receivers >>>> about >>>> the validity of this checksum. These have been patched to ignore the >>>> checksum >>>> if it is that of the empty stream. This will not affect correctness, as >>>> the >>>> final checksum, as supplied by close_file() is still used to detect >>>> corruption, >>>> and it hasn't changed. >>> >>> How does this even work? Sure, the checksum isn't checked, but the >>> delta-editor receiver is going to choose the wrong base contents to >>> apply the delta against. >> >> Huh? The delta-editor receiver isn't using this to choose any base >> contents, it's simply using it as some kind of intermediate >> verification step. >> >> Before this change, we just passed a NULL checksum, which was *always* >> ignored, and everything Just Worked. With this change, we started >> being honest, and various pieces of the system didn't appreciate that >> honesty. > > If the shim sends a delta against the empty-stream, then how can the > Ev1 receiver properly apply that? Won't the receiver use some selected > base contents? ie. NOT the empty stream? > > I'm thinking of the delta application to a base. How can that possibly > work, if the shim creates a delta against the empty stream?
The shim uses svn_txdelta_send_stream() to send the contents stream to the receiver's apply_textdelta() handler. svn_txdelta_send_stream() doesn't use a source stream: "This is effectively a 'copy' operation, resulting in delta windows that make the target equivalent to the stream." I haven't looked at the implementation of svn_txdelta_send_stream(), but my guess is that it just feeds delta-window-size chunks of data to the window handler from the source, for which it obviously doesn't need a base. -Hyrum -- uberSVN: Apache Subversion Made Easy http://www.uberSVN.com/