Re: git svn import failure : write .git/Git_svn_hash_BmjclS: Bad file descriptor

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



All,

I applied Kyle's latest patch

> diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm
> index 622535e2..96888228 100644
> --- a/perl/Git/SVN/Ra.pm
> +++ b/perl/Git/SVN/Ra.pm
> @@ -391,6 +391,7 @@ sub longest_common_path {
> sub gs_fetch_loop_common {
>         my ($self, $base, $head, $gsv, $globs) = @_;
>         return if ($base > $head);
> +       $::_repository->_open_cat_blob_if_needed;
>         my $gpool = SVN::Pool->new_default;
>         my $ra_url = $self->url;
>         my $reload_ra = sub {

alone and this fixes the bug for me. Thanks a lot, Kyle!

Cheers,
Nico

On Thu, Feb 26, 2015 at 12:37 AM, Nico Schlömer
<nico.schloemer@xxxxxxxxx> wrote:
> Kyle,
>
> you are absolutely correct, I used the wrong Git installation in my last
> email. With both your and Eric's patches applied, I'm getting
> ```
> [...]
> r100 = e2a9b5baa2cebb18591ecb04ff350410d52f36de (refs/remotes/git-svn)
> Unexpected result returned from git cat-file at
> /home/nschloe/share/perl/5.18.2/Git/SVN/Fetcher.pm line 344.
> Failed to read object 619f9d1d857fb287d06a70c9dac6b8b534d0de6a at
> /home/nschloe/share/perl/5.18.2/Git/SVN/Fetcher.pm line 345, <GEN16> line
> 757.
>
> error closing pipe: Bad file descriptor at
> /home/nschloe/libexec/git-core/git-svn line 0.
> error closing pipe: Bad file descriptor at
> /home/nschloe/libexec/git-core/git-svn line 0.
> ```
> where line 344 is
> ```
> $size = $::_repository->cat_blob($fb->{blob}, $base);
> ```
> Adding the line in `perl/Git/SVN/Ra.pm` as per your suggestion does not
> change this.
>
> Cheers,
> Nico
>
>
> On Wed, Feb 25, 2015 at 9:34 PM Kyle J. McKay <mackyle@xxxxxxxxx> wrote:
>>
>> On Feb 25, 2015, at 07:07, Nico Schlömer wrote:
>>
>> > Thanks Kyle for the patch! I applied it and ran
>> > ```
>> > git svn clone https://geuz.org/svn/gmsh/trunk
>> > ```
>> > Unfortunately, I'm still getting
>> > ```
>> > [...]
>> > r100 = e2a9b5baa2cebb18591ecb04ff350410d52f36de (refs/remotes/git-svn)
>> > error closing pipe: Bad file descriptor at /usr/share/perl5/Git/SVN/
>> > Fetcher.pm line 335.
>> > error closing pipe: Bad file descriptor at /usr/share/perl5/Git/SVN/
>> > Fetcher.pm line 335.
>> > out pipe went bad at /usr/share/perl5/Git.pm line 955.
>> > ```
>>
>> Are you certain you're running with the patch?  I ask because earlier
>> you sent this:
>>
>> On Jan 31, 2015, at 04:51, Nico Schlömer wrote:
>>
>> > I tried the patch and I still get
>> > ```
>> > [...]
>> > r100 = e2a9b5baa2cebb18591ecb04ff350410d52f36de (refs/remotes/git-svn)
>> > Unexpected result returned from git cat-file at
>> > /home/nschloe/share/perl/5.18.2/Git/SVN/Fetcher.pm line 335.
>> > Failed to read object 619f9d1d857fb287d06a70c9dac6b8b534d0de6a at
>> > /home/nschloe/share/perl/5.18.2/Git/SVN/Fetcher.pm line 336, <GEN16>
>> > line 757.
>> >
>> > error closing pipe: Bad file descriptor at
>> > /home/nschloe/libexec/git-core/git-svn line 0.
>> > error closing pipe: Bad file descriptor at
>> > /home/nschloe/libexec/git-core/git-svn line 0.
>> > ```
>> > when
>> > ```
>> > git svn clone https://geuz.org/svn/gmsh/trunk
>> > ```
>>
>> And as the patch below applies to Fetcher.pm at line 322 and inserts 8
>> lines, I do not see how you could be getting the same error message at
>> line 335 if the patch was present.  Even if you manually applied it by
>> only inserting the two lines of code, the line numbers would be at
>> least 337, not 335 as reported above.  I also notice the path to
>> Fetcher.pm is different from your earlier report.
>>
>> That said, the fact that it happens right after r100 (which is when
>> SVN::Pool::clear is getting called) suggests there's another file
>> handle getting caught up in the SVN::Pool somehow.  (When I try to
>> clone gmsh, I got to r4885 before a server disconnection.)
>>
>> It could be as simple as the open2 call FileHandle result in later
>> perl versions ends up in the SVN::Pool whereas in earlier Perl and/or
>> svn versions it does not.
>>
>> What happens if you add this change on top of the Fetcher.pm change:
>>
>> diff --git a/perl/Git/SVN/Ra.pm b/perl/Git/SVN/Ra.pm
>> index 622535e2..96888228 100644
>> --- a/perl/Git/SVN/Ra.pm
>> +++ b/perl/Git/SVN/Ra.pm
>> @@ -391,6 +391,7 @@ sub longest_common_path {
>>   sub gs_fetch_loop_common {
>>         my ($self, $base, $head, $gsv, $globs) = @_;
>>         return if ($base > $head);
>> +       $::_repository->_open_cat_blob_if_needed;
>>         my $gpool = SVN::Pool->new_default;
>>         my $ra_url = $self->url;
>>         my $reload_ra = sub {
>>
>> -Kyle
>>
>> > Cheers,
>> > Nico
>> >
>> > On Wed, Feb 25, 2015 at 11:20 AM Kyle J. McKay <mackyle@xxxxxxxxx>
>> > wrote:
>> > I believe I have been able to track down this problem and implement a
>> > fix.  Please report back if this patch fixes the problem for you.
>> >
>> > -Kyle
>> >
>> > -- 8< --
>> > Subject: [PATCH] Git::SVN::Fetcher: avoid premature 'svn_hash' temp
>> > file closure
>> >
>> > Since b19138b (git-svn: Make it incrementally faster by minimizing
>> > temp
>> > files, v1.6.0), git-svn has been using the Git.pm temp_acquire and
>> > temp_release mechanism to avoid unnecessary temp file churn and
>> > provide
>> > a speed boost.
>> >
>> > However, that change introduced a call to temp_acquire inside the
>> > Git::SVN::Fetcher::close_file function for an 'svn_hash' temp file.
>> > Because an SVN::Pool is active at the time this function is called, if
>> > the Git::temp_acquire function ends up actually creating a new
>> > FileHandle for the temp file (which it will the first time it's called
>> > with the name 'svn_hash') that FileHandle will end up in the SVN::Pool
>> > and should that pool have SVN::Pool::clear called on it that
>> > FileHandle
>> > will be closed out from under Git::temp_acquire.
>> >
>> > Since the only call site to Git::temp_acquire with the name 'svn_hash'
>> > is inside the close_file function, if an 'svn_hash' temp file is ever
>> > created its FileHandle is guaranteed to be created in the active
>> > SVN::Pool.
>> >
>> > This has not been a problem in the past because the SVN::Pool was not
>> > being cleared.  However, since dfa72fdb (git-svn: reload RA every
>> > log-window-size, v2.2.0) the pool has been getting cleared
>> > periodically
>> > at which point the FileHandle for the 'svn_hash' temp file gets
>> > closed.
>> > Any subsequent calls to Git::temp_acquire for 'svn_hash', however,
>> > succeed without creating/opening a new temporary file since it still
>> > has
>> > the now invalid FileHandle in its cache.  Callers that then attempt to
>> > use that FileHandle fail with an error.
>> >
>> > We avoid this problem by making sure the 'svn_hash' temp file is
>> > created
>> > in the same place the 'svn_delta_...' and 'git_blob_...' temp files
>> > are
>> > (and then temp_release'd) so that it can be safely used inside the
>> > close_file function without having its FileHandle end up in an
>> > SVN::Pool
>> > that gets cleared.
>> >
>> > Signed-off-by: Kyle J. McKay <mackyle@xxxxxxxxx>
>> > ---
>> >  perl/Git/SVN/Fetcher.pm | 8 ++++++++
>> >  1 file changed, 8 insertions(+)
>> >
>> > diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm
>> > index 10edb277..613055a3 100644
>> > --- a/perl/Git/SVN/Fetcher.pm
>> > +++ b/perl/Git/SVN/Fetcher.pm
>> > @@ -322,6 +322,14 @@ sub apply_textdelta {
>> >         # (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_${$}_
>> > $suffix");
>> > +       # close_file may call temp_acquire on 'svn_hash', but
>> > because of the
>> > +       # call chain, if the temp_acquire call from close_file ends
>> > up being the
>> > +       # call that first creates the 'svn_hash' temp file, then the
>> > FileHandle
>> > +       # that's created as a result will end up in an SVN::Pool
>> > that we clear
>> > +       # in SVN::Ra::gs_fetch_loop_common.  Avoid that by making
>> > sure the
>> > +       # 'svn_hash' FileHandle is already created before close_file
>> > is called.
>> > +       my $tmp_fh = $::_repository->temp_acquire('svn_hash');
>> > +       $::_repository->temp_release($tmp_fh, 1);
>> >
>> >         if ($fb->{blob}) {
>> >                 my ($base_is_link, $size);
>> > --
>>
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]