git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/3] Support for partial HTTP transfers

From
NHNick Hengeveld <nickh@reactrix.com>
Date
Sep 27, 2005, 00:09 UTC
Message-ID
<20050927000931.GA15615@reactrix.com>
In-Reply-To
<7vd5mvedcs.fsf@assigned-by-dhcp.cox.net>
On Mon, Sep 26, 2005 at 02:19:31PM -0700, Junio C Hamano wrote:
Show 6 quoted lines
> If rename() succeeds then tmpfile is no more.  If rename() fails
> because there were no tmpfile to begin with, it is not an error
> (i.e. you are not recovering) and that case there would not be
> tmpfile either.  Otherwise, if tmpfile still remains to unlink()
> because rename() failed for any other reason, wouldn't you
> rather report it as an error and abort?

I didn't see that as a fatal condition since the transfer would still take place, albeit a full transfer rather than a partial one. It does seem worth at least reporting it as a warning though. If a previous tmpfile exists and both the rename and unlink fail, the subsequent tmpfile open will also fail - unlikely but probably also worth detecting and reporting.

Show 10 quoted lines
> I wonder what happens if by mistake or intentionally we run two
> http-fetch instances simultaneously.  IIRC, the current code is
> safe -- the resulting object database will have the object file
> fetched by one of the instance, and the updating of ref is done
> via write_ref_sha1(), so it also is safe.  But your change may
> introduce an interesting case where one creates a tmpfile, the
> other one moves it to prevfile and starts using its partial
> contents, and possibly gets confused -- it will probabaly fail
> at the end detecting inconsistent object so it is probably not a
> big loss.

How about using mkstemp on the prev file to keep multiple instances from stepping on each other? Since O_CREAT | O_EXCL is used to open the tmpfile, only one instance will be able to succeed and continue.

Show 7 quoted lines
> > +	/* Reset inflate/SHA1 if there was an error reading the previous temp
> > +	   file; also rewind to the beginning of the local file. */
> 
> Maybe not just rewind but truncate as well?  It probably does
> not matter in practice much, but previous representation your
> fetch was interrupted in the middle could have been much larger
> than the representation you are slurping right now.
Good point, I'll update the patch.
Show 12 quoted lines
> There was a discussion about an object file of the same SHA1 and
> the same contents can have different compressed representations
> (we hash then compress so the resulting filesize depends on the
> compression level without affecting the contents of the object).
> In a "doctor, it hurts when I do this -- don't do it, then" kind
> of corner case, a DNS rotated pair of webservers could be
> serving the same object in different representations and you may
> get interrupted while fetching from one, and restart the
> transfer from the other.  The SHA1 check at the end hopefully
> would catch this kind of situation, and that round of http-fetch
> would fail -- the user needs to re-run the fetch so it is not a
> big loss, but it is something to keep in mind.

That's an annoying case, all right... Would it be worth including a full retry if a partial failed the SHA1 check?

-- 
For a successful technology, reality must take precedence over public
relations, for nature cannot be fooled.
Previous: Junio C HamanoNext: Junio C Hamano
Message 3 of 10 in “Support for partial HTTP transfers”
  1. 2/3 Support for partial HTTP transfersNick Hengeveld, Sep 26, 2005
  2. Junio C HamanoSep 26, 2005
  3. Nick HengeveldSep 27, 2005
  4. Junio C HamanoSep 27, 2005
  5. Nick HengeveldSep 27, 2005
  6. Junio C HamanoSep 27, 2005
  7. Nick HengeveldSep 27, 2005
  8. Junio C HamanoSep 27, 2005
  9. Daniel BarkalowSep 26, 2005
  10. sfSep 27, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.