You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2014/06/23 08:49:31 UTC

svn commit: r1604700 - /subversion/trunk/subversion/libsvn_fs_fs/low_level.c

Author: stsp
Date: Mon Jun 23 06:49:30 2014
New Revision: 1604700

URL: http://svn.apache.org/r1604700
Log:
Introduce another scratch pool in the server-side log code, reducing the
the resident memory size of an 'svn log -v' process from 407M to 317M while
showing r11708 of ruby's Subversion repository via ra_local (on OpenBSD).
Ruby's r11708 sets svn:eol-style on 123934 files...

* subversion/libsvn_fs_fs/low_level.c
  (read_change): Switch to dual-pool parameters, and use a scratch pool for
   lines read from the revision file and a result_pool for returned data.
  (svn_fs_fs__read_changes): Use an iterpool while looping over changes
   and pass it as a scratch pool to read_change().
  (svn_fs_fs__read_changes_incrementally): Same, except this was already
   passing an iterpool pool as the result pool.

Modified:
    subversion/trunk/subversion/libsvn_fs_fs/low_level.c

Modified: subversion/trunk/subversion/libsvn_fs_fs/low_level.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/low_level.c?rev=1604700&r1=1604699&r2=1604700&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_fs_fs/low_level.c (original)
+++ subversion/trunk/subversion/libsvn_fs_fs/low_level.c Mon Jun 23 06:49:30 2014
@@ -200,7 +200,8 @@ svn_fs_fs__unparse_footer(apr_off_t l2p_
 static svn_error_t *
 read_change(change_t **change_p,
             svn_stream_t *stream,
-            apr_pool_t *pool)
+            apr_pool_t *result_pool,
+            apr_pool_t *scratch_pool)
 {
   svn_stringbuf_t *line;
   svn_boolean_t eof = TRUE;
@@ -211,13 +212,13 @@ read_change(change_t **change_p,
   /* Default return value. */
   *change_p = NULL;
 
-  SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, pool));
+  SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
 
   /* Check for a blank line. */
   if (eof || (line->len == 0))
     return SVN_NO_ERROR;
 
-  change = apr_pcalloc(pool, sizeof(*change));
+  change = apr_pcalloc(result_pool, sizeof(*change));
   info = &change->info;
   last_str = line->data;
 
@@ -227,7 +228,7 @@ read_change(change_t **change_p,
     return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                             _("Invalid changes line in rev-file"));
 
-  info->node_rev_id = svn_fs_fs__id_parse(str, strlen(str), pool);
+  info->node_rev_id = svn_fs_fs__id_parse(str, strlen(str), result_pool);
   if (info->node_rev_id == NULL)
     return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                             _("Invalid changes line in rev-file"));
@@ -346,12 +347,12 @@ read_change(change_t **change_p,
         }
     }
   
-  /* Get the changed path (LAST_STR is was allocated in POOL). */
+  /* Get the changed path. */
   change->path.len = strlen(last_str);
-  change->path.data = last_str;
+  change->path.data = apr_pstrdup(result_pool, last_str);
 
   /* Read the next line, the copyfrom line. */
-  SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, pool));
+  SVN_ERR(svn_stream_readline(stream, &line, "\n", &eof, scratch_pool));
   info->copyfrom_known = TRUE;
   if (eof || line->len == 0)
     {
@@ -371,8 +372,7 @@ read_change(change_t **change_p,
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                                 _("Invalid changes line in rev-file"));
 
-      /* LAST_STR is was allocated in POOL. */
-      info->copyfrom_path = last_str;
+      info->copyfrom_path = apr_pstrdup(result_pool, last_str);
     }
 
   *change_p = change;
@@ -386,17 +386,20 @@ svn_fs_fs__read_changes(apr_array_header
                         apr_pool_t *pool)
 {
   change_t *change;
+  apr_pool_t *iterpool = svn_pool_create(pool);
 
   /* pre-allocate enough room for most change lists
      (will be auto-expanded as necessary) */
   *changes = apr_array_make(pool, 30, sizeof(change_t *));
 
-  SVN_ERR(read_change(&change, stream, pool));
+  SVN_ERR(read_change(&change, stream, pool, iterpool));
   while (change)
     {
       APR_ARRAY_PUSH(*changes, change_t*) = change;
-      SVN_ERR(read_change(&change, stream, pool));
+      SVN_ERR(read_change(&change, stream, pool, iterpool));
+      svn_pool_clear(iterpool);
     }
+  svn_pool_destroy(iterpool);
 
   return SVN_NO_ERROR;
 }
@@ -416,7 +419,7 @@ svn_fs_fs__read_changes_incrementally(sv
     {
       svn_pool_clear(iterpool);
 
-      SVN_ERR(read_change(&change, stream, iterpool));
+      SVN_ERR(read_change(&change, stream, iterpool, iterpool));
       if (change)
         SVN_ERR(change_receiver(change_receiver_baton, change, iterpool));
     }