You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pb...@apache.org on 2011/07/21 17:37:22 UTC
svn commit: r1149228 - /subversion/trunk/subversion/libsvn_client/merge.c
Author: pburba
Date: Thu Jul 21 15:37:21 2011
New Revision: 1149228
URL: http://svn.apache.org/viewvc?rev=1149228&view=rev
Log:
Stop creating invalid "backwards" rangelists; the svn_rangelist_* APIs
require rangelists ordered oldest to youngest.
Follow-up to fix for issue #3966 'log_noop_revs is far too slow' in r1149105.
* subversion/libsvn_client/merge.c
(rangelist_merge_revision): Add some more explanation for the purpose of
this peculiar helper. Tweak to expect incoming revision that is younger
than any in the list, rather than older, thus creating a valid rangelist.
(remove_noop_subtree_ranges): Make svn_ra_get_log2 request revs from
oldest to youngest so the svn_log_entry_receiver_t callback log_noop_revs
and its helper rangelist_merge_revision get the revisions in that order.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1149228&r1=1149227&r2=1149228&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jul 21 15:37:21 2011
@@ -7876,10 +7876,16 @@ typedef struct log_noop_baton_t
apr_pool_t *pool;
} log_noop_baton_t;
-/* Helper for log_noop_revs, this is not a general purpose rangelist
- merge. Merge the single revision range REVISION-1 to REVISION into
- RANGELIST. The existing ranges in RANGELIST must be ordered from
- highest/youngest to lowest/oldest. */
+/* Helper for log_noop_revs: Merge a svn_merge_range_t representation of
+ REVISION into RANGELIST. New elements added to rangelist are allocated
+ in RESULT_POOL.
+
+ This is *not* a general purpose rangelist merge but a special replacement
+ for svn_rangelist_merge when REVISION is guaranteed to be younger than any
+ element in RANGELIST. svn_rangelist_merge is O(n) worst-case (i.e. when
+ all the ranges in output rangelist are older than the incoming changes).
+ This turns the special case of a single incoming younger range into O(1).
+ */
static svn_error_t *
rangelist_merge_revision(apr_array_header_t *rangelist,
svn_revnum_t revision,
@@ -7890,9 +7896,11 @@ rangelist_merge_revision(apr_array_heade
{
svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, rangelist->nelts - 1,
svn_merge_range_t *);
- if (range->start == revision)
+ if (range->end == revision - 1)
{
- range->start = revision - 1;
+ /* REVISION is adjacent to the youngest range in RANGELIST
+ so we can simply expand that range to encompass REVISION. */
+ range->end = revision;
return SVN_NO_ERROR;
}
}
@@ -8155,8 +8163,8 @@ remove_noop_subtree_ranges(const char *u
APR_ARRAY_PUSH(log_targets, const char *) = "";
- SVN_ERR(svn_ra_get_log2(ra_session, log_targets, youngest_gap_rev->end,
- oldest_gap_rev->start + 1, 0, TRUE, TRUE, FALSE,
+ SVN_ERR(svn_ra_get_log2(ra_session, log_targets, oldest_gap_rev->start + 1,
+ youngest_gap_rev->end, 0, TRUE, TRUE, FALSE,
apr_array_make(scratch_pool, 0,
sizeof(const char *)),
log_noop_revs, &log_gap_baton, scratch_pool));
Re: svn commit: r1149228 - /subversion/trunk/subversion/libsvn_client/merge.c
Posted by Paul Burba <pt...@gmail.com>.
On Thu, Jul 21, 2011 at 5:04 PM, Greg Stein <gs...@gmail.com> wrote:
> On Thu, Jul 21, 2011 at 11:37, <pb...@apache.org> wrote:
>>...
>> +++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jul 21 15:37:21 2011
>>...
>> @@ -8155,8 +8163,8 @@ remove_noop_subtree_ranges(const char *u
>>
>> APR_ARRAY_PUSH(log_targets, const char *) = "";
>>
>> - SVN_ERR(svn_ra_get_log2(ra_session, log_targets, youngest_gap_rev->end,
>> - oldest_gap_rev->start + 1, 0, TRUE, TRUE, FALSE,
>> + SVN_ERR(svn_ra_get_log2(ra_session, log_targets, oldest_gap_rev->start + 1,
>> + youngest_gap_rev->end, 0, TRUE, TRUE, FALSE,
>> apr_array_make(scratch_pool, 0,
>> sizeof(const char *)),
>> log_noop_revs, &log_gap_baton, scratch_pool));
>
> Given the sensitivity of the overall algorithm to ordering, I think
> that call deserves an explanatory comment about why the logs are
> ordered that way.
Quite right. Done r1149626.
Paul
> Cheers,
> -g
>
Re: svn commit: r1149228 - /subversion/trunk/subversion/libsvn_client/merge.c
Posted by Greg Stein <gs...@gmail.com>.
On Thu, Jul 21, 2011 at 11:37, <pb...@apache.org> wrote:
>...
> +++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jul 21 15:37:21 2011
>...
> @@ -8155,8 +8163,8 @@ remove_noop_subtree_ranges(const char *u
>
> APR_ARRAY_PUSH(log_targets, const char *) = "";
>
> - SVN_ERR(svn_ra_get_log2(ra_session, log_targets, youngest_gap_rev->end,
> - oldest_gap_rev->start + 1, 0, TRUE, TRUE, FALSE,
> + SVN_ERR(svn_ra_get_log2(ra_session, log_targets, oldest_gap_rev->start + 1,
> + youngest_gap_rev->end, 0, TRUE, TRUE, FALSE,
> apr_array_make(scratch_pool, 0,
> sizeof(const char *)),
> log_noop_revs, &log_gap_baton, scratch_pool));
Given the sensitivity of the overall algorithm to ordering, I think
that call deserves an explanatory comment about why the logs are
ordered that way.
Cheers,
-g