From: Kyle McKay Date: Sun, 07 Jul 2013 02:13:42 GMT Subject: Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf Message-ID: <8CACBE8F-8672-43AB-882E-4ADA05B4D822@gmail.com> In-Reply-To: <20130707002430.GE30132@google.com> On Jul 6, 2013, at 17:24, Jonathan Nieder wrote: > (cc-ing Eric Wong, who wrote this code) > Hi, > > Kyle McKay wrote: > >> Temp file with moniker 'svn_delta' already in use at Git.pm line 1250 >> Temp file with moniker 'git_blob' already in use at Git.pm line 1250 >> >> David Rothenberger has determined the cause to >> be that ra_serf does not drive the delta editor in a depth-first >> manner [...]. Instead, the calls come in this order: > [...] >> --- a/perl/Git/SVN/Fetcher.pm >> +++ b/perl/Git/SVN/Fetcher.pm >> @@ -315,11 +315,13 @@ sub change_file_prop { >> sub apply_textdelta { >> my ($self, $fb, $exp) = @_; >> return undef if $self->is_path_ignored($fb->{path}); >> - my $fh = $::_repository->temp_acquire('svn_delta'); >> + my $suffix = 0; >> + ++$suffix while $::_repository->temp_is_locked("svn_delta_${$}_ >> $suffix"); >> + my $fh = $::_repository->temp_acquire("svn_delta_${$}_$suffix"); >> # $fh gets auto-closed() by SVN::TxDelta::apply(), >> # (but $base does not,) so dup() it for reading in close_file >> open my $dup, '<&', $fh or croak $!; >> - my $base = $::_repository->temp_acquire('git_blob'); >> + my $base = $::_repository->temp_acquire("git_blob_${$}_$suffix"); > > Thanks for your work tracking this down. > > I'm a bit confused. Are you saying that apply_textdelta gets called > multiple times in a row without an intervening close_file? Unless bulk updates are disabled when using the serf access method (the only one available with svn 1.8) for https?: urls, apply_textdelta does indeed get called multiple times in a row without an intervening temp_release. Two temp files are created for each apply_textdelta ('svn_delta...' and 'git_blob...'). In my tests it seems that most of the time the two temp files are enough, but occasionally as many as six will be open at the same time. I suspect this maximum number is related to the maximum number of simultaneous connections the serf access method will use which defaults to 4. Therefore I would expect to see as many as 8 temp files (4 each for 'svn_delta...' and 'git_blob...'), but I have only been able to trigger creation of 6 temp files so far. Kyle