Author: brane
Date: Wed Feb  4 17:20:46 2015
New Revision: 1657328

URL: http://svn.apache.org/r1657328
Log:
On the reuse-ra-session branch: Fix a silly thinko in session reuse handling.
Enhance cache diagnostics support to make these easier to find in future.

* subversion/libsvn_client/ra_cache.c
  (RA_CACHE_LOG): Renamed from RA_CACHE_DBG; all uses updated.
  (RA_CACHE_DBG, DBG_PTR_FMT): New diagnostic tools.
  (svn_client__ra_cache_open_session): Always insert the session into
   the active set, regardless of whether it's new or reused.
   Add diagnostics about that.
  (svn_client__ra_cache_release_session): Add diagnostics about
   searching for and removing sessionf from the active set.
  (close_ra_session): Add a diagnostic about removing from the active set.

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=1657328&r1=1657327&r2=1657328&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 
Wed Feb  4 17:20:46 2015
@@ -31,14 +31,33 @@
 #include "ra_cache.h"
 #include "private/svn_debug.h"
 
+/*
+ * Debugging
+ */
+
+#if 0
+#define RA_CACHE_LOG(x) SVN_DBG(x)
+#else
+#define RA_CACHE_LOG(x)
+#endif
+
 #if 0
 #define RA_CACHE_DBG(x) SVN_DBG(x)
 #else
 #define RA_CACHE_DBG(x)
 #endif
 
+#if APR_SIZEOF_VOIDP == 8
+#define DBG_PTR_FMT "16"APR_UINT64_T_HEX_FMT
+#else
+#define DBG_PTR_FMT "8"APR_UINT64_T_HEX_FMT
+#endif
+
+
+/*
+ * The session cache entry.
+ */
 
-/* The session cache entry. */
 typedef struct svn_client__ra_session_t
 {
   /* The free-list link for this session. */
@@ -254,7 +273,7 @@ cleanup_ra_cache(void *data)
                    svn_client__ra_session_t, freelist)
       cache_entry->ra_cache = NULL;
 
-  RA_CACHE_DBG(("RA_CACHE: Cleanup\n"));
+  RA_CACHE_LOG(("RA_CACHE: Cleanup\n"));
 
   return APR_SUCCESS;
 }
@@ -264,7 +283,7 @@ svn_client__ra_cache_init(svn_client__pr
                           apr_hash_t *config,
                           apr_pool_t *pool)
 {
-  RA_CACHE_DBG(("RA_CACHE: Init\n"));
+  RA_CACHE_LOG(("RA_CACHE: Init\n"));
 
   private_ctx->ra_cache.pool = pool;
   private_ctx->ra_cache.config = config;
@@ -294,8 +313,11 @@ close_ra_session(void *data)
       svn_ra_session_t *const session = cache_entry->session;
 
       /* Remove the session from the active table and/or the inactive list. */
-      apr_hash_set(ra_cache->active, &cache_entry->session,
-                   sizeof(cache_entry->session), NULL);
+      apr_hash_set(ra_cache->active, &session, sizeof(session), NULL);
+
+      RA_CACHE_DBG(("close_ra_session: removed from active:         %"
+                    DBG_PTR_FMT"\n", (apr_uint64_t)session));
+
       APR_RING_REMOVE(cache_entry, freelist);
       APR_RING_ELEM_INIT(cache_entry, freelist);
 
@@ -303,14 +325,14 @@ close_ra_session(void *data)
       cache_entry->session = NULL;
       svn_ra__close(session);
 
-      RA_CACHE_DBG(("SESSION(%d): Closed\n", cache_entry->id));
+      RA_CACHE_LOG(("SESSION(%d): Closed\n", cache_entry->id));
     }
   else
     {
       /* The cache is being destroyed; don't do anything, since the
          sessions will have already been closed in the session pool
          cleanup handlers by the time we get here. */
-      RA_CACHE_DBG(("SESSION(%d): Cleanup\n", cache_entry->id));
+      RA_CACHE_LOG(("SESSION(%d): Cleanup\n", cache_entry->id));
     }
 
   return APR_SUCCESS;
@@ -407,7 +429,7 @@ svn_client__ra_cache_open_session(svn_ra
       APR_RING_REMOVE(cache_entry, freelist);
       APR_RING_ELEM_INIT(cache_entry, freelist);
 
-      RA_CACHE_DBG(("SESSION(%d): Reused\n", cache_entry->id));
+      RA_CACHE_LOG(("SESSION(%d): Reused\n", cache_entry->id));
     }
   else
     {
@@ -455,14 +477,19 @@ svn_client__ra_cache_open_session(svn_ra
       SVN_ERR(svn_ra_get_repos_root2(session, &cache_entry->root_url,
                                      ra_cache->pool));
 
-      RA_CACHE_DBG(("SESSION(%d): Open('%s')\n", cache_entry->id, base_url));
+      RA_CACHE_LOG(("SESSION(%d): Open('%s')\n", cache_entry->id, base_url));
 
-      apr_hash_set(ra_cache->active, &cache_entry->session,
-                   sizeof(cache_entry->session), cache_entry);
-      cache_entry->ra_cache = ra_cache;
       ++ra_cache->next_id;
     }
 
+  /* Add the session to the active list. */
+  apr_hash_set(ra_cache->active, &cache_entry->session,
+               sizeof(cache_entry->session), cache_entry);
+
+  RA_CACHE_DBG(("ra_cache_open_session: added to active:        %"
+                DBG_PTR_FMT"\n", (apr_uint64_t)cache_entry->session));
+
+  cache_entry->ra_cache = ra_cache;
   cache_entry->owner_pool = result_pool;
   cache_entry->cb_table = cbtable;
   cache_entry->cb_baton = callback_baton;
@@ -483,6 +510,10 @@ svn_client__ra_cache_release_session(svn
   svn_client__ra_session_t *cache_entry =
     apr_hash_get(ra_cache->active, &session, sizeof(session));
 
+  RA_CACHE_DBG(("ra_cache_release_session: search active:       %"
+                DBG_PTR_FMT"%s\n", (apr_uint64_t)session,
+                (cache_entry ? " (found)" : " (not found)")));
+
   SVN_ERR_ASSERT_NO_RETURN(cache_entry != NULL);
   SVN_ERR_ASSERT_NO_RETURN(cache_entry->session == session);
   SVN_ERR_ASSERT_NO_RETURN(cache_entry->owner_pool != NULL);
@@ -497,6 +528,9 @@ svn_client__ra_cache_release_session(svn
   apr_hash_set(ra_cache->active, &cache_entry->session,
                sizeof(cache_entry->session), NULL);
 
+  RA_CACHE_DBG(("ra_cache_release_session: removed from active: %"
+                DBG_PTR_FMT"\n", (apr_uint64_t)session));
+
 #ifdef SVN_DEBUG
   /* Double-check that this entry is not part of the freelist. */
   assert(cache_entry == APR_RING_NEXT(cache_entry, freelist));
@@ -510,5 +544,5 @@ svn_client__ra_cache_release_session(svn
   cache_entry->cb_table = NULL;
   cache_entry->cb_baton = NULL;
 
-  RA_CACHE_DBG(("SESSION(%d): Released\n", cache_entry->id));
+  RA_CACHE_LOG(("SESSION(%d): Released\n", cache_entry->id));
 }


Reply via email to