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,