On 6 February 2015 at 16:50, Branko Čibej <br...@wandisco.com> wrote:
> On 06.02.2015 14:13, i...@apache.org wrote:
>> Author: ivan
>> Date: Fri Feb  6 13:13:14 2015
>> New Revision: 1657797
>>
>> URL: http://svn.apache.org/r1657797
>> Log:
>> On the reuse-ra-session branch: Avoid svn_ra_reparent() call and network
>> round-trip for svn:// protocol if possible.
>>
>> * subversion/libsvn_client/ra_cache.c
>>   (find_session_by_url): Try to find RA session with exact session URL
>>    match first.
>>
>> Modified:
>>     subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_cache.c
>>
>> Modified: 
>> subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_cache.c
>> URL: 
>> http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_cache.c?rev=1657797&r1=1657796&r2=1657797&view=diff
>> ==============================================================================
>> --- subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_cache.c 
>> (original)
>> +++ subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_cache.c 
>> Fri Feb  6 13:13:14 2015
>> @@ -401,6 +401,24 @@ find_session_by_url(cache_entry_t **cach
>>  {
>>    cache_entry_t *cache_entry;
>>
>> +  /* Try to find RA session with exact session URL match first because
>> +   * the svn_ra_reparent() for svn:// protocol requires network round-trip.
>> +   */
>> +  APR_RING_FOREACH(cache_entry, &ra_cache->freelist,
>> +                   cache_entry_t, freelist)
>> +    {
>> +      const char *session_url;
>> +      SVN_ERR_ASSERT(cache_entry->owner_pool == NULL);
>> +
>> +      SVN_ERR(svn_ra_get_session_url(cache_entry->session, &session_url,
>> +                                     scratch_pool));
>> +      if (strcmp(session_url, url) == 0)
>> +        {
>> +          *cache_entry_p = cache_entry;
>> +          return SVN_NO_ERROR;
>> +        }
>> +    }
>
> I think this is a mistake. We'll have to do a round-trip anyway to
> ensure that the session is in a valid state (no connection expired,
> etc.) before we can safely reuse it. The point of the cache is not to
> avoid nework round-trips but to avoid expensive connection establishment.
>
Please let me disagree with you: we end up with optimizations like we
currently have in merge.c if obtaining RA session will require
additional round-trips comparing to passing some RA sessions around.
Ideally svn_ra_reparent() should not require round trip for svn://,
but I think we could and workaround/optimization at ra_cache layer for
now.

Regarding pinging session before reuse: RA session implementions
should check connection state if it was inactive for a some period
time of time. But this RA protocol specific and ra_serf already has
code to reconnect if needed.

-- 
Ivan Zhakov

Reply via email to