mirror of
https://github.com/git/git
synced 2024-08-26 19:19:18 +00:00
git-svn: avoid filling up the disk with temp files.
Commit ffe256f9ba
("git-svn: Speed up fetch")
introduced changes that create a temporary file for each object fetched by
svn. These files should be deleted automatically, but perl apparently
doesn't do this until the process exits (or perhaps when its garbage
collector runs).
This means that on a large fetch, especially with lots of branches, we
sometimes fill up /tmp completely, which prevents the next temp file from
being written completely. This is aggravated by the fact that a new temp
file is created for each updated file, even if that update produces a file
identical to one already in git. Thus, it can happen even if there's lots
of disk space to store the finished repository.
We weren't adequately checking for write errors, so this would result in an
invalid file getting committed, which caused git-svn to fail later with an
invalid checksum.
This patch adds a check to syswrite() so similar problems don't lead to
corruption in the future. It also unlink()'s each temp file explicitly
when we're done with it, so the disk doesn't need to fill up.
Signed-off-by: Avery Pennarun <apenwarr@gmail.com>
Tested-by: Björn Steinbrink <B.Steinbrink@gmx.de>
Acked-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
5b8a94b1db
commit
29c70e0b3e
|
@ -3243,7 +3243,9 @@ sub close_file {
|
|||
my ($tmp_fh, $tmp_filename) = File::Temp::tempfile(UNLINK => 1);
|
||||
my $result;
|
||||
while ($result = sysread($fh, my $string, 1024)) {
|
||||
syswrite($tmp_fh, $string, $result);
|
||||
my $wrote = syswrite($tmp_fh, $string, $result);
|
||||
defined($wrote) && $wrote == $result
|
||||
or croak("write $tmp_filename: $!\n");
|
||||
}
|
||||
defined $result or croak $!;
|
||||
close $tmp_fh or croak $!;
|
||||
|
@ -3251,6 +3253,7 @@ sub close_file {
|
|||
close $fh or croak $!;
|
||||
|
||||
$hash = $::_repository->hash_and_insert_object($tmp_filename);
|
||||
unlink($tmp_filename);
|
||||
$hash =~ /^[a-f\d]{40}$/ or die "not a sha1: $hash\n";
|
||||
close $fb->{base} or croak $!;
|
||||
} else {
|
||||
|
|
Loading…
Reference in a new issue