From: Junio C Hamano <junkio@cox.net>
To: Nick Hengeveld <nickh@reactrix.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/3] Support for partial HTTP transfers
Date: Mon, 26 Sep 2005 14:19:31 -0700 [thread overview]
Message-ID: <7vd5mvedcs.fsf@assigned-by-dhcp.cox.net> (raw)
In-Reply-To: <20050926175204.GC9410@reactrix.com> (Nick Hengeveld's message of "Mon, 26 Sep 2005 10:52:04 -0700")
Nick Hengeveld <nickh@reactrix.com> writes:
> + unlink(prevfile);
> + rename(tmpfile, prevfile);
> + unlink(tmpfile);
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 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.
Personally, I do not think people would mind much if we
introduce the BKL at the beginning of git-fetch.sh to prevent
multiple fetches stomping on each other, if somebody cared
enough (hint, hint).
> - snprintf(tmpfile, sizeof(tmpfile), "%s/obj_XXXXXX",
> - get_object_directory());
> + local = open(tmpfile, O_WRONLY | O_CREAT | O_EXCL, 0666);
> - local = mkstemp(tmpfile);
I introduced this mkstemp() part recently to mimic the local
object creation where newly created object files are built in
the same directory, hoping that they would be allocated close to
each other when more than one are created in sequence. I do not
know it matters much in practice -- has anybody measured, and
does anybody care?
> + /* 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.
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.
next prev parent reply other threads:[~2005-09-26 21:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-26 17:52 [PATCH 2/3] Support for partial HTTP transfers Nick Hengeveld
2005-09-26 21:19 ` Junio C Hamano [this message]
2005-09-27 0:09 ` Nick Hengeveld
2005-09-27 5:46 ` Junio C Hamano
2005-09-27 15:36 ` Nick Hengeveld
2005-09-27 17:09 ` Junio C Hamano
2005-09-27 17:19 ` Nick Hengeveld
2005-09-27 22:24 ` Junio C Hamano
2005-09-26 22:23 ` Daniel Barkalow
2005-09-27 10:35 ` sf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7vd5mvedcs.fsf@assigned-by-dhcp.cox.net \
--to=junkio@cox.net \
--cc=git@vger.kernel.org \
--cc=nickh@reactrix.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).