rhuij...@apache.org wrote: > URL: http://svn.apache.org/viewvc?rev=1345158&view=rev > Log: > Avoid creating another ra session in most code paths in the merge code. At the > same time fix accidentally opening the ra session with a non read-only working > copy. > > This patch relies on the ra.c fix in r1345143, as before this patch we > sometimes opened a working copy that would try to update the dav cache. > > * subversion/libsvn_client/merge.c > (svn_client_open_ra_session): Use svn_client_open_ra_session() as we only
Should say "(ensure_ra_session_url):". > use the standard options. > (do_merge): Accept a ra_session to help avoiding creating another session. Please update the doc string! > (merge_cousins_and_supplement_mergeinfo, > merge_locked): Pass session. > (merge_peg_locked): Pass session. Use session pool as scratch pool for local > work. > (do_symmetric_merge_locked): Pass NULL for session. We can make this simpler by requiring a non-null session parameter, and simply creating one in this caller. (This caller already creates a session in the other branch of the 'if', so we can just move that outside the 'if'.) - Julian > 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=1345158&r1=1345157&r2=1345158&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_client/merge.c (original) > +++ subversion/trunk/subversion/libsvn_client/merge.c Fri Jun 1 13:16:03 2012 > @@ -8856,7 +8856,7 @@ do_directory_merge(svn_mergeinfo_catalog > * repository, or by allocating a new *RA_SESSION in POOL. > * (RA_SESSION itself cannot be null, of course.) > * > - * CTX is used as for svn_client__open_ra_session_internal(). > + * CTX is used as for svn_client_open_ra_session(). > */ > static svn_error_t * > ensure_ra_session_url(svn_ra_session_t **ra_session, > @@ -8876,8 +8876,7 @@ ensure_ra_session_url(svn_ra_session_t * > if (! *ra_session || (err && err->apr_err == > SVN_ERR_RA_ILLEGAL_URL)) > { > svn_error_clear(err); > - err = svn_client__open_ra_session_internal(ra_session, NULL, url, NULL, > - NULL, FALSE, TRUE, ctx, > pool); > + err = svn_client_open_ra_session(ra_session, url, ctx, pool); > } > SVN_ERR(err); > > @@ -8944,6 +8943,7 @@ do_merge(apr_hash_t **modified_subtrees, > svn_mergeinfo_catalog_t result_catalog, > const apr_array_header_t *merge_sources, > const merge_target_t *target, > + svn_ra_session_t *src_session, > svn_boolean_t sources_related, > svn_boolean_t same_repos, > svn_boolean_t ignore_ancestry, > @@ -8967,6 +8967,7 @@ do_merge(apr_hash_t **modified_subtrees, > int i; > svn_boolean_t checked_mergeinfo_capability = FALSE; > svn_ra_session_t *ra_session1 = NULL, *ra_session2 = NULL; > + const char *old_src_session_url = NULL; > apr_pool_t *iterpool; > > SVN_ERR_ASSERT(svn_dirent_is_absolute(target->abspath)); > @@ -9059,6 +9060,13 @@ do_merge(apr_hash_t **modified_subtrees, > notify_baton.merge_b = &merge_cmd_baton; > notify_baton.pool = result_pool; > > + if (src_session) > + { > + SVN_ERR(svn_ra_get_session_url(src_session, &old_src_session_url, > + scratch_pool)); > + ra_session1 = src_session; > + } > + > for (i = 0; i < merge_sources->nelts; i++) > { > merge_source_t *source = > @@ -9162,6 +9170,9 @@ do_merge(apr_hash_t **modified_subtrees, > /* Let everyone know we're finished here. */ > notify_merge_completed(target->abspath, ctx, iterpool); > > + if (src_session) > + SVN_ERR(svn_ra_reparent(src_session, old_src_session_url, iterpool)); > + > svn_pool_destroy(iterpool); > return SVN_NO_ERROR; > } > @@ -9233,7 +9244,7 @@ merge_cousins_and_supplement_mergeinfo(c > modified_subtrees = apr_hash_make(scratch_pool); > APR_ARRAY_PUSH(faux_sources, const merge_source_t *) = source; > SVN_ERR(do_merge(&modified_subtrees, NULL, faux_sources, target, > - TRUE, same_repos, > + URL1_ra_session, TRUE, same_repos, > ignore_ancestry, force, dry_run, FALSE, NULL, TRUE, > FALSE, depth, merge_options, use_sleep, ctx, > scratch_pool, subpool)); > @@ -9265,14 +9276,14 @@ merge_cousins_and_supplement_mergeinfo(c > notify_mergeinfo_recording(target->abspath, NULL, ctx, scratch_pool); > svn_pool_clear(subpool); > SVN_ERR(do_merge(NULL, add_result_catalog, add_sources, target, > - TRUE, same_repos, > + URL1_ra_session, TRUE, same_repos, > ignore_ancestry, force, dry_run, TRUE, > modified_subtrees, TRUE, > TRUE, depth, merge_options, use_sleep, ctx, > scratch_pool, subpool)); > svn_pool_clear(subpool); > SVN_ERR(do_merge(NULL, remove_result_catalog, remove_sources, target, > - TRUE, same_repos, > + URL1_ra_session, TRUE, same_repos, > ignore_ancestry, force, dry_run, TRUE, > modified_subtrees, TRUE, > TRUE, depth, merge_options, use_sleep, ctx, > @@ -9641,7 +9652,7 @@ merge_locked(const char *source1, > } > > err = do_merge(NULL, NULL, merge_sources, target, > - related, same_repos, > + ra_session1, related, same_repos, > ignore_ancestry, force, dry_run, > record_only, NULL, FALSE, FALSE, depth, merge_options, > &use_sleep, ctx, scratch_pool, scratch_pool); > @@ -10730,10 +10741,9 @@ open_reintegrate_source_and_target(svn_r > SVN_ERR(open_target_wc(&target, target_abspath, > FALSE, FALSE, FALSE, > ctx, scratch_pool, scratch_pool)); > - SVN_ERR(svn_client__open_ra_session_internal(target_ra_session_p, NULL, > - target->loc.url, > - NULL, NULL, FALSE, FALSE, > - ctx, scratch_pool)); > + SVN_ERR(svn_client_open_ra_session(target_ra_session_p, > + target->loc.url, > + ctx, scratch_pool)); > if (! target->loc.url) > return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL, > _("Can't reintegrate into '%s' > because it is " > @@ -10926,42 +10936,41 @@ merge_peg_locked(const char *source_path > > SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath)); > > + /* Create a short lived session pool */ > + sesspool = svn_pool_create(scratch_pool); > + > SVN_ERR(open_target_wc(&target, target_abspath, > allow_mixed_rev, TRUE, TRUE, > - ctx, scratch_pool, scratch_pool)); > + ctx, sesspool, sesspool)); > > /* Open an RA session to our source URL, and determine its root URL. */ > - sesspool = svn_pool_create(scratch_pool); > SVN_ERR(open_source_session(&source_loc, &ra_session, > source_path_or_url, source_peg_revision, > - ctx, sesspool, scratch_pool)); > + ctx, sesspool, sesspool)); > > /* Normalize our merge sources. */ > SVN_ERR(normalize_merge_sources(&merge_sources, source_path_or_url, > source_loc, > ranges_to_merge, ra_session, ctx, > - scratch_pool, scratch_pool)); > + sesspool, sesspool)); > > /* Check for same_repos. */ > same_repos = is_same_repos(&target->loc, source_loc, TRUE /* > strict_urls */); > > - /* We're done with our little RA session. */ > - svn_pool_destroy(sesspool); > - > /* Do the real merge! (We say with confidence that our merge > sources are both ancestral and related.) */ > - err = do_merge(NULL, NULL, merge_sources, target, > + err = do_merge(NULL, NULL, merge_sources, target, ra_session, > TRUE, same_repos, ignore_ancestry, force, dry_run, > record_only, NULL, FALSE, FALSE, depth, merge_options, > - &use_sleep, ctx, scratch_pool, scratch_pool); > + &use_sleep, ctx, sesspool, sesspool); > > if (use_sleep) > - svn_io_sleep_for_timestamps(target_abspath, scratch_pool); > + svn_io_sleep_for_timestamps(target_abspath, sesspool); > > - if (err) > - return svn_error_trace(err); > + /* We're done with our RA session. */ > + svn_pool_destroy(sesspool); > > - return SVN_NO_ERROR; > + return svn_error_trace(err); > } > > svn_error_t * > @@ -11596,7 +11605,7 @@ do_symmetric_merge_locked(const svn_clie > merge_sources = apr_array_make(scratch_pool, 1, sizeof(merge_source_t > *)); > APR_ARRAY_PUSH(merge_sources, const merge_source_t *) = &source; > > - err = do_merge(NULL, NULL, merge_sources, target, > + err = do_merge(NULL, NULL, merge_sources, target, NULL, > TRUE /*related*/, > TRUE /*same_repos*/, ignore_ancestry, force, dry_run, > record_only, NULL, FALSE, FALSE, depth, merge_options, >