* [PATCH 2/2] git-svn: allow git-svn fetching to work using serf @ 2013-07-06 3:44 Kyle McKay 2013-07-07 0:24 ` Jonathan Nieder 0 siblings, 1 reply; 8+ messages in thread From: Kyle McKay @ 2013-07-06 3:44 UTC (permalink / raw) To: git; +Cc: David Rothenberger, Petr Baudis, Jonathan Nieder, Daniel Shahaf When attempting to git-svn fetch files from an svn https?: url using the serf library (the only choice starting with svn 1.8) the following errors can occur: 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 <daveroth@acm.org> 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: 1. open_root 2. open_directory 3. add_file 4. apply_textdelta 5. add_file 6. apply_textdelta This change causes a new temp file moniker to be generated if the one that would otherwise have been used is currently locked. Signed-off-by: Kyle J. McKay <mackyle@gmail.com> --- perl/Git/SVN/Fetcher.pm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm index bd17418..10edb27 100644 --- 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"); if ($fb->{blob}) { my ($base_is_link, $size); -- 1.8.3 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-06 3:44 [PATCH 2/2] git-svn: allow git-svn fetching to work using serf Kyle McKay @ 2013-07-07 0:24 ` Jonathan Nieder 2013-07-07 2:13 ` Kyle McKay 0 siblings, 1 reply; 8+ messages in thread From: Jonathan Nieder @ 2013-07-07 0:24 UTC (permalink / raw) To: Kyle McKay; +Cc: git, David Rothenberger, Petr Baudis, Daniel Shahaf, Eric Wong (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 <daveroth@acm.org> 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? Puzzled, Jonathan ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-07 0:24 ` Jonathan Nieder @ 2013-07-07 2:13 ` Kyle McKay 2013-07-07 2:23 ` Jonathan Nieder 0 siblings, 1 reply; 8+ messages in thread From: Kyle McKay @ 2013-07-07 2:13 UTC (permalink / raw) To: Jonathan Nieder Cc: git, David Rothenberger, Petr Baudis, Daniel Shahaf, Eric Wong 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 <daveroth@acm.org> 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-07 2:13 ` Kyle McKay @ 2013-07-07 2:23 ` Jonathan Nieder 2013-07-07 2:46 ` Kyle McKay 0 siblings, 1 reply; 8+ messages in thread From: Jonathan Nieder @ 2013-07-07 2:23 UTC (permalink / raw) To: Kyle McKay; +Cc: git, David Rothenberger, Petr Baudis, Daniel Shahaf, Eric Wong Kyle McKay wrote: > 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. You mean "Unless bulk updates are enabled" and "without an intervening close_file", right? Unlike the non-depth-first thing, that sounds basically broken --- what would be stopping subversion from calling the editor's close method when done with each file? I can't see much reason unless it is calling apply_textdelta multiple times in parallel --- is it doing that, and if so is git-svn able to cope with that? This sounds like something that should be fixed in ra_serf. But if the number of overlapping open text nodes is bounded by a low number, the workaround of using multiple temp files sounds ok as a way of dealing with unfixed versions of Subversion. Jonathan ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-07 2:23 ` Jonathan Nieder @ 2013-07-07 2:46 ` Kyle McKay 2013-07-07 13:39 ` Daniel Shahaf 0 siblings, 1 reply; 8+ messages in thread From: Kyle McKay @ 2013-07-07 2:46 UTC (permalink / raw) To: Jonathan Nieder Cc: git, David Rothenberger, Petr Baudis, Daniel Shahaf, Eric Wong On Jul 6, 2013, at 19:23, Jonathan Nieder wrote: > Kyle McKay wrote: > >> 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. > > You mean "Unless bulk updates are enabled" and "without an intervening > close_file", right? The problem seems to be skelta mode although it may just be the fact that ra_serf has multiple connections outstanding and since ra_neon only ever has one it can't happen over ra_neon. If the server disables bulk updates (SVNAllowBulkUpdates Off) all clients are forced to use skelta mode, even ra_neon clients. > This sounds like something that should be fixed in ra_serf. Yes, but apparently it will not be. > But if the number of overlapping open text nodes is bounded by a low > number, the workaround of using multiple temp files sounds ok as a way > of dealing with unfixed versions of Subversion. I believe it will never exceed twice ('svn_delta...' and 'git_blob...') the maximum number of serf connections allowed. Four by default (hard-coded prior to svn 1.8). Limited to between 1 and 8 on svn 1.8. Actually it looks like from my testing that it won't ever exceed twice the (max number of serf connections - 1). Kyle ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-07 2:46 ` Kyle McKay @ 2013-07-07 13:39 ` Daniel Shahaf 2013-07-07 16:18 ` David Rothenberger 2013-07-07 18:27 ` Kyle McKay 0 siblings, 2 replies; 8+ messages in thread From: Daniel Shahaf @ 2013-07-07 13:39 UTC (permalink / raw) To: Kyle McKay Cc: Jonathan Nieder, git, David Rothenberger, Petr Baudis, Eric Wong Kyle McKay wrote on Sat, Jul 06, 2013 at 19:46:40 -0700: > On Jul 6, 2013, at 19:23, Jonathan Nieder wrote: >> Kyle McKay wrote: >> >>> 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. >> >> You mean "Unless bulk updates are enabled" and "without an intervening >> close_file", right? > > The problem seems to be skelta mode although it may just be the fact > that ra_serf has multiple connections outstanding and since ra_neon only > ever has one it can't happen over ra_neon. > > If the server disables bulk updates (SVNAllowBulkUpdates Off) all > clients are forced to use skelta mode, even ra_neon clients. As Brane and I have pointed out, git-svn can instruct libsvn_* to use bulk updates regardless of the server version, by setting SVN_CONFIG_OPTION_HTTP_BULK_UPDATES (new in 1.8). If you have questions about that, though, please address them to users@subversion.apache.org (the proper list for API usage questions), not to me personally. Cheers, Daniel ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-07 13:39 ` Daniel Shahaf @ 2013-07-07 16:18 ` David Rothenberger 2013-07-07 18:27 ` Kyle McKay 1 sibling, 0 replies; 8+ messages in thread From: David Rothenberger @ 2013-07-07 16:18 UTC (permalink / raw) To: users; +Cc: Kyle McKay, Jonathan Nieder, git, Petr Baudis, Eric Wong On 7/7/2013 6:39 AM, Daniel Shahaf wrote: > Kyle McKay wrote on Sat, Jul 06, 2013 at 19:46:40 -0700: >> On Jul 6, 2013, at 19:23, Jonathan Nieder wrote: >>> Kyle McKay wrote: >>> >>>> 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. >>> >>> You mean "Unless bulk updates are enabled" and "without an intervening >>> close_file", right? >> >> The problem seems to be skelta mode although it may just be the fact >> that ra_serf has multiple connections outstanding and since ra_neon only >> ever has one it can't happen over ra_neon. >> >> If the server disables bulk updates (SVNAllowBulkUpdates Off) all >> clients are forced to use skelta mode, even ra_neon clients. > > As Brane and I have pointed out, git-svn can instruct libsvn_* to use > bulk updates regardless of the server version, by setting > SVN_CONFIG_OPTION_HTTP_BULK_UPDATES (new in 1.8). According to the table in the release notes [1], Skelta mode will be used if the 1.7 or 1.8 server sets SVNAllowBulkUpdates to Off, regardless of what the client sets in the configuration. Is that not true? [1] https://subversion.apache.org/docs/release-notes/1.8.html#neon-deleted -- David Rothenberger ---- daveroth@acm.org ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf 2013-07-07 13:39 ` Daniel Shahaf 2013-07-07 16:18 ` David Rothenberger @ 2013-07-07 18:27 ` Kyle McKay 1 sibling, 0 replies; 8+ messages in thread From: Kyle McKay @ 2013-07-07 18:27 UTC (permalink / raw) To: git; +Cc: Jonathan Nieder, David Rothenberger, Petr Baudis, Eric Wong I forwarded the "SVNAllowBulkUpdates Off" question to the users@subversion.apache.org list and here's the reply: On Jul 7, 2013, at 11:11, Lieven Govaerts wrote: > On Sun, Jul 7, 2013 at 4:48 PM, Kyle McKay <mackyle@gmail.com> wrote: >> On Jul 7, 2013, at 06:39, Daniel Shahaf wrote: >>> >>> Kyle McKay wrote on Sat, Jul 06, 2013 at 19:46:40 -0700: >>>> >>>> On Jul 6, 2013, at 19:23, Jonathan Nieder wrote: >>>>> >>>>> Kyle McKay wrote: >>>>> >>>>>> 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. >>>>> >>>>> >>>>> You mean "Unless bulk updates are enabled" and "without an >>>>> intervening >>>>> close_file", right? >>>> >>>> >>>> The problem seems to be skelta mode although it may just be the >>>> fact >>>> that ra_serf has multiple connections outstanding and since >>>> ra_neon only >>>> ever has one it can't happen over ra_neon. >>>> >>>> If the server disables bulk updates (SVNAllowBulkUpdates Off) all >>>> clients are forced to use skelta mode, even ra_neon clients. >>> >>> >>> As Brane and I have pointed out, git-svn can instruct libsvn_* to >>> use >>> bulk updates regardless of the server version, by setting >>> SVN_CONFIG_OPTION_HTTP_BULK_UPDATES (new in 1.8). >>> >>> If you have questions about that, though, please address them to >>> users@subversion.apache.org (the proper list for API usage >>> questions), >>> not to me personally. >> >> >> According to the table at >> <http://subversion.apache.org/docs/release-notes/1.8.html#serf-skelta-default >> >, >> if the server sets SVNAllowBulkUpdates Off, the client will be >> forced to use >> skelta no matter what the client setting is. > > Indeed, the server admin has the final say in which mode is actually > used. SVNAllowBulkUpdates Off is only advised if the server admin > wants a log line per accessed resource. I doubt it's used a lot, but > the option is there. > >> >> Is that table incorrect? > > No, that table is correct. > > Lieven So the final say so on whether or not bulk updates are allowed is on the server side which means git-svn really needs to handle skelta mode on the client side properly when using ra-serf to guarantee functionality with all subversion server configurations. Kyle ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-07-07 18:27 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-07-06 3:44 [PATCH 2/2] git-svn: allow git-svn fetching to work using serf Kyle McKay 2013-07-07 0:24 ` Jonathan Nieder 2013-07-07 2:13 ` Kyle McKay 2013-07-07 2:23 ` Jonathan Nieder 2013-07-07 2:46 ` Kyle McKay 2013-07-07 13:39 ` Daniel Shahaf 2013-07-07 16:18 ` David Rothenberger 2013-07-07 18:27 ` Kyle McKay
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).