You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2013/07/12 14:44:46 UTC
svn commit: r1502537 -
/subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_ctx.c
Author: ivan
Date: Fri Jul 12 12:44:46 2013
New Revision: 1502537
URL: http://svn.apache.org/r1502537
Log:
On the reuse-ra-session branch: Avoid accessing idle RA sessions before
attaching new callbacks.
* subversion/libsvn_client/ra_ctx.c
(cached_session_t): Add root_url.
(find_session_by_url): Do not reparent RA session here.
(svn_client__ra_ctx_open_session): Reparent RA session after attaching
caller provided callback table and baton. Save repository root URL for
every opened session.
Modified:
subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_ctx.c
Modified: subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_ctx.c
URL: http://svn.apache.org/viewvc/subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_ctx.c?rev=1502537&r1=1502536&r2=1502537&view=diff
==============================================================================
--- subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_ctx.c (original)
+++ subversion/branches/reuse-ra-session/subversion/libsvn_client/ra_ctx.c Fri Jul 12 12:44:46 2013
@@ -48,6 +48,9 @@ typedef struct cached_session_s
/* Current callbacks table. */
void *cb_baton;
+ /* Repository root URL. */
+ const char *root_url;
+
/* ID of RA session. Used only for diagnostics purpose. */
int id;
} cached_session_t;
@@ -265,31 +268,11 @@ find_session_by_url(cached_session_t **c
{
cached_session_t *cache_entry = svn__apr_hash_index_val(hi);
- if (cache_entry->owner_pool == NULL)
+ if (cache_entry->owner_pool == NULL &&
+ svn_uri__is_ancestor(cache_entry->root_url, url))
{
- const char *root_url;
- SVN_ERR(svn_ra_get_repos_root2(cache_entry->session, &root_url,
- scratch_pool));
-
- if (svn_uri__is_ancestor(root_url, url))
- {
- const char *session_url;
- SVN_ERR(svn_ra_get_session_url(cache_entry->session,
- &session_url, scratch_pool));
-
- if (strcmp(session_url, url) != 0)
- {
- RCTX_DBG(("SESSION(%d): Reparent from '%s' to '%s'\n",
- cache_entry->id, session_url, url));
- SVN_ERR(svn_ra_reparent(cache_entry->session, url,
- scratch_pool));
- }
-
- RCTX_DBG(("SESSION(%d): Reused\n", cache_entry->id));
-
- *cache_entry_p = cache_entry;
- return SVN_NO_ERROR;
- }
+ *cache_entry_p = cache_entry;
+ return SVN_NO_ERROR;
}
}
@@ -317,6 +300,21 @@ svn_client__ra_ctx_open_session(svn_ra_s
if (cache_entry)
{
+ const char *session_url;
+
+ /* Attach new callback table and baton. */
+ cache_entry->cb_table = cbtable;
+ cache_entry->cb_baton = callback_baton;
+
+ SVN_ERR(svn_ra_get_session_url(cache_entry->session, &session_url,
+ scratch_pool));
+
+ if (strcmp(session_url, base_url) != 0)
+ {
+ SVN_ERR(svn_ra_reparent(cache_entry->session, base_url,
+ scratch_pool));
+ }
+
/* We found existing applicable session. Check UUID if requested. */
if (uuid)
{
@@ -333,6 +331,8 @@ svn_client__ra_ctx_open_session(svn_ra_s
repository_uuid, uuid);
}
}
+
+ RCTX_DBG(("SESSION(%d): Reused\n", cache_entry->id));
}
else
{
@@ -372,6 +372,9 @@ svn_client__ra_ctx_open_session(svn_ra_s
cache_entry->session = session;
+ SVN_ERR(svn_ra_get_repos_root2(session, &cache_entry->root_url,
+ ctx->pool));
+
RCTX_DBG(("SESSION(%d): Open('%s')\n", cache_entry->id, base_url));
apr_hash_set(ctx->cached_session, &cache_entry->session,