@matheusbsbs / matheus-bagliano / commits / 29c70e0b3e
Fork 0

git-svn: avoid filling up the disk with temp files.

Commit ffe256f9bac8a40ff751a9341a5869d98f72c285 ("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>

Avery Pennarun committed Jun 28, 2008 at 19:33 UTC 29c70e0b3e3183f86f93500882177d0c74069988
1 file changed +4 -1
git-svn.perl
+4 -1
@@ -3243,7 +3243,9 @@ sub close_file {
3243 my ($tmp_fh, $tmp_filename) = File::Temp::tempfile(UNLINK => 1);
3244 my $result;
3245 while ($result = sysread($fh, my $string, 1024)) {
3246 - syswrite($tmp_fh, $string, $result);
3246 + my $wrote = syswrite($tmp_fh, $string, $result);
3247 + defined($wrote) && $wrote == $result
3248 + or croak("write $tmp_filename: $!\n");
3249 }
3250 defined $result or croak $!;
3251 close $tmp_fh or croak $!;
@@ -3251,6 +3253,7 @@ sub close_file {
3253 close $fh or croak $!;
3254
3255 $hash = $::_repository->hash_and_insert_object($tmp_filename);
3256 + unlink($tmp_filename);
3257 $hash =~ /^[a-f\d]{40}$/ or die "not a sha1: $hash\n";
3258 close $fb->{base} or croak $!;
3259 } else {