Marc Strapetz wrote:
> For SmartSVN we are optionally displaying merge arrows in the Revision
> Graph. Here is a sample image, how this looks like:
> 
> http://imgur.com/MzrLq00
> 
>> From the JavaHL sources I understand that there is currently only one
>> method to retrieve server-side mergeinfo and this one works on a single
>> revision only:
> 
> Map<String, Mergeinfo> getMergeinfo(Iterable<String> paths,
>                                     long revision,
>                                     Mergeinfo.Inheritance inherit,
>                                     boolean includeDescendants)

Right. This is a wrapper around the core library function 
svn_ra_get_mergeinfo().

> This makes the Merge Arrow feature practically unusable for larger graphs.
> 
> To improve performance, in earlier versions we were using a client-side
> mergeinfo cache (similar as the main log-cache, which TSVN is using as
> well). However, populating this cache (i.e. querying for mergeinfo for
> *every* revision of the repository) often resulted in bringing the
> entire Apache server down, especially if many users were building their
> log cache at the same time.
> 
> To address these problems, it would be great to have a more powerful
> API, which allows either to retrieve all mergeinfo for a *revision
> range* or for a *set of revisions*.

The request for a more powerful API certainly makes sense, but what form of API?

In the Subversion project source code:

  # How many lines/bytes of mergeinfo in trunk, right now?
  $ svn pg -R svn:mergeinfo | wc -lc
    245   24063

  # How many branches and tags?
  $ svn ls ^/subversion/tags/ ^/subversion/branches/ | wc -l
  288

  # Approx. total lines/bytes mergeinfo per revision?
  $ echo $((245 * 289)) $((24063 * 289))
  70805 6954207

So in each revision  there are roughly 70,000 lines of mergeinfo, occupying 7 
MB in plain text representation.

The mergeinfo properties change whenever a merge is done. All other commits 
leave all the mergeinfo unchanged. So mergeinfo is unchanged in, what, 99% of 
revisions?

It doesn't seem logical to simply request all the mergeinfo for each revision 
in turn, and return it all in raw form.

Can we think of a better way to design the API so that it returns the 
interesting data without all the redundancy? Basically I think we want to 
describe changes to mergeinfo, rather than raw mergeinfo.

- Julian



> Querying a set of revisions would be more flexible and would allow to
> generate merge arrows on the fly. On the other hand, to alleviate the
> server, it's desirable to cache retrieved mergeinfo on the client-side
> anyway, hence a range query would be fine as well.
> 
> -Marc
>

Reply via email to