rhuij...@apache.org wrote: > URL: http://svn.apache.org/viewvc?rev=1344833&view=rev > Log: > Reuse an existing ra session when fetching the common ancestor of two urls > from the merge and switch handling. > > * subversion/libsvn_client/client.h > (svn_client__get_youngest_common_ancestor): Allow passing a session.
Nice improvement. We should go one step further and *require* passing a pool ... > * subversion/libsvn_client/merge.c > (merge_locked, > calculate_left_hand_side, > find_reintegrate_merge, > find_symmetric_merge): Pass existing sessions. > > * subversion/libsvn_client/ra.c > (svn_client__get_youngest_common_ancestor): Only open a session if the user > didn't pass one. > (svn_client__youngest_common_ancestor): Update caller. > > * subversion/libsvn_client/switch.c > (switch_internal): Pass session. > > * subversion/tests/libsvn_client/client-test.c > (test_youngest_common_ancestor): Pass NULL for session. ... because the only caller that doesn't now pass a pool is this test (and it's better if a test uses the same code path as the real code). - Julian > Modified: > subversion/trunk/subversion/libsvn_client/client.h > subversion/trunk/subversion/libsvn_client/merge.c > subversion/trunk/subversion/libsvn_client/ra.c > subversion/trunk/subversion/libsvn_client/switch.c > subversion/trunk/subversion/tests/libsvn_client/client-test.c > > Modified: subversion/trunk/subversion/libsvn_client/client.h > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/client.h?rev=1344833&r1=1344832&r2=1344833&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_client/client.h (original) > +++ subversion/trunk/subversion/libsvn_client/client.h Thu May 31 17:52:24 > 2012 > @@ -198,6 +198,9 @@ svn_client__repos_location_segments(apr_ > LOC1 and LOC2. If the locations have no common ancestor (including if > they don't have the same repository root URL), set *ANCESTOR_P to NULL. > > + If SESSION is not NULL, use it for retrieving the common ancestor instead > + of creating a new session. > + > Use the authentication baton cached in CTX to authenticate against > the repository. Use POOL for all allocations. > > @@ -207,6 +210,7 @@ svn_error_t * > svn_client__get_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p, > const svn_client__pathrev_t *loc1, > const svn_client__pathrev_t *loc2, > + svn_ra_session_t *session, > svn_client_ctx_t *ctx, > apr_pool_t *result_pool, > apr_pool_t *scratch_pool); > > Modified: subversion/trunk/subversion/libsvn_client/merge.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1344833&r1=1344832&r2=1344833&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_client/merge.c (original) > +++ subversion/trunk/subversion/libsvn_client/merge.c Thu May 31 17:52:24 2012 > @@ -9550,7 +9550,8 @@ merge_locked(const char *source1, > /* Unless we're ignoring ancestry, see if the two sources are related. > */ > if (! ignore_ancestry) > SVN_ERR(svn_client__get_youngest_common_ancestor( > - &yca, source1_loc, source2_loc, ctx, scratch_pool, > scratch_pool)); > + &yca, source1_loc, source2_loc, ra_session1, ctx, > + scratch_pool, scratch_pool)); > > /* Check for a youngest common ancestor. If we have one, we'll be > doing merge tracking. > @@ -10468,7 +10469,8 @@ calculate_left_hand_side(svn_client__pat > actually related, we can't reintegrate if they are not. Also > get an initial value for the YCA revision number. */ > SVN_ERR(svn_client__get_youngest_common_ancestor( > - &yc_ancestor, source_loc, &target->loc, ctx, iterpool, > iterpool)); > + &yc_ancestor, source_loc, &target->loc, > target_ra_session, ctx, > + iterpool, iterpool)); > if (! yc_ancestor) > return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL, > _("'%s@%ld' must be ancestrally > related to " > @@ -10633,7 +10635,7 @@ find_reintegrate_merge(merge_source_t ** > SVN_ERR(svn_ra_reparent(target_ra_session, source.loc1->url, > scratch_pool)); > > SVN_ERR(svn_client__get_youngest_common_ancestor( > - &yc_ancestor, source.loc2, source.loc1, > + &yc_ancestor, source.loc2, source.loc1, target_ra_session, > ctx, scratch_pool, scratch_pool)); > > /* The source side of a reintegrate merge is not 'ancestral', except > in > @@ -11443,7 +11445,7 @@ find_symmetric_merge(svn_client__pathrev > s_t->target_ra_session, ctx, scratch_pool)); > > SVN_ERR(svn_client__get_youngest_common_ancestor( > - &s_t->yca, s_t->source, &s_t->target->loc, > + &s_t->yca, s_t->source, &s_t->target->loc, > s_t->source_ra_session, > ctx, result_pool, result_pool)); > > /* Find the latest revision of A synced to B and the latest > > Modified: subversion/trunk/subversion/libsvn_client/ra.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/ra.c?rev=1344833&r1=1344832&r2=1344833&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_client/ra.c (original) > +++ subversion/trunk/subversion/libsvn_client/ra.c Thu May 31 17:52:24 2012 > @@ -843,12 +843,12 @@ svn_error_t * > svn_client__get_youngest_common_ancestor(svn_client__pathrev_t **ancestor_p, > const svn_client__pathrev_t *loc1, > const svn_client__pathrev_t *loc2, > + svn_ra_session_t *session, > svn_client_ctx_t *ctx, > apr_pool_t *result_pool, > apr_pool_t *scratch_pool) > { > - apr_pool_t *sesspool = svn_pool_create(scratch_pool); > - svn_ra_session_t *session; > + apr_pool_t *sesspool = NULL; > apr_hash_t *history1, *history2; > apr_hash_index_t *hi; > svn_revnum_t yc_revision = SVN_INVALID_REVNUM; > @@ -863,7 +863,11 @@ svn_client__get_youngest_common_ancestor > } > > /* Open an RA session for the two locations. */ > - SVN_ERR(svn_client_open_ra_session(&session, loc1->url, ctx, > sesspool)); > + if (session == NULL) > + { > + sesspool = svn_pool_create(scratch_pool); > + SVN_ERR(svn_client_open_ra_session(&session, loc1->url, ctx, > sesspool)); > + } > > /* We're going to cheat and use history-as-mergeinfo because it > saves us a bunch of annoying custom data comparisons and such. */ > @@ -879,8 +883,9 @@ svn_client__get_youngest_common_ancestor > SVN_INVALID_REVNUM, > SVN_INVALID_REVNUM, > session, ctx, scratch_pool)); > - /* Close the source and target sessions. */ > - svn_pool_destroy(sesspool); > + /* Close the ra session if we opened one. */ > + if (sesspool) > + svn_pool_destroy(sesspool); > > /* Loop through the first location's history, check for overlapping > paths and ranges in the second location's history, and > @@ -959,7 +964,7 @@ svn_client__youngest_common_ancestor(con > ctx, scratch_pool)); > > SVN_ERR(svn_client__get_youngest_common_ancestor( > - &ancestor, loc1, loc2, ctx, result_pool, scratch_pool)); > + &ancestor, loc1, loc2, session, ctx, result_pool, > scratch_pool)); > > if (ancestor) > { > > Modified: subversion/trunk/subversion/libsvn_client/switch.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/switch.c?rev=1344833&r1=1344832&r2=1344833&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_client/switch.c (original) > +++ subversion/trunk/subversion/libsvn_client/switch.c Thu May 31 17:52:24 > 2012 > @@ -208,7 +208,8 @@ switch_internal(svn_revnum_t *result_rev > /* ### It would be nice if this function could reuse the existing > ra session instead of opening two for its own use. */ > SVN_ERR(svn_client__get_youngest_common_ancestor( > - &yca, switch_loc, target_base_loc, ctx, pool, pool)); > + &yca, switch_loc, target_base_loc, ra_session, ctx, > + pool, pool)); > } > if (! yca) > return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL, > > Modified: subversion/trunk/subversion/tests/libsvn_client/client-test.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/client-test.c?rev=1344833&r1=1344832&r2=1344833&view=diff > ============================================================================== > --- subversion/trunk/subversion/tests/libsvn_client/client-test.c (original) > +++ subversion/trunk/subversion/tests/libsvn_client/client-test.c Thu May 31 > 17:52:24 2012 > @@ -689,7 +689,7 @@ test_youngest_common_ancestor(const svn_ > repos_url, repos_uuid, 2, "iota", pool), > svn_client__pathrev_create_with_relpath( > repos_url, repos_uuid, 2, "A/iota", pool), > - ctx, pool, pool)); > + NULL, ctx, pool, pool)); > SVN_TEST_STRING_ASSERT(svn_client__pathrev_relpath(yc_ancestor, pool), > "iota"); > SVN_TEST_ASSERT(yc_ancestor->rev == 1); > @@ -713,7 +713,7 @@ test_youngest_common_ancestor(const svn_ > repos_url, repos_uuid, 0, "", pool), > svn_client__pathrev_create_with_relpath( > repos_url, repos_uuid, 3, "A/ROOT", pool), > - ctx, pool, pool)); > + NULL, ctx, pool, pool)); > SVN_TEST_STRING_ASSERT(svn_client__pathrev_relpath(yc_ancestor, pool), > ""); > SVN_TEST_ASSERT(yc_ancestor->rev == 0); >