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