On Thu, Nov 13, 2014 at 4:32 PM, Evgeny Kotkov <evgeny.kot...@visualsvn.com> wrote:
> Stefan Fuhrmann <stef...@apache.org> writes: > > > URL: http://svn.apache.org/r1639352 > > Log: > > Continue work on 'svnfsfs stats' for FSFS f6. > > > > Use the FSFS standard parser to read the changed paths list and get > > the number entries in it. > > > > * subversion/libsvn_fs_fs/stats.c > > (revision_info_t): Remove obsolete member. > > (get_change_count): Replace by ... > > (get_phys_change_count): ... this. Use FSFS standard functions to read > > the change list and count its entries. > > (read_phys_revision): Update caller. > > > > (get_log_change_count): The former get_change_count. > > (read_log_rev_or_packfile): Call it here. > > > > [...] > > > +static svn_error_t * > > +get_phys_change_count(query_t *query, > > + revision_info_t *revision_info, > > + apr_pool_t *scratch_pool) > > { > > - apr_uint64_t lines = 0; > > - const char *end = changes + len; > > + apr_pool_t *subpool = svn_pool_create(scratch_pool); > > + apr_array_header_t *changes; > > > > - /* line count */ > > - for (; changes < end; ++changes) > > - if (*changes == '\n') > > - ++lines; > > + SVN_ERR(svn_fs_fs__get_changes(&changes, query->fs, > > + revision_info->revision, subpool)); > > + revision_info->change_count = changes->nelts; > > > > - /* two lines per change */ > > - return lines / 2; > > + svn_pool_destroy(subpool); > > + > > + return SVN_NO_ERROR; > > } > > What would be the reason to create a subpool here? Thanks for the review, Evgeny! In this particular case, there is actually a reason: Neither this function now its caller owns the SCRATCH_POOL, hence can't clean it. This function potentially allocates a large amount of memory before the caller continues to recourse into the node-tree. The SUBPOOL shaves off quite a bit of the peak memory usage. Documented in r1639426. > It looks like this "subpool pattern" is quite common in the code around, > but is > there any reason for this? What would happen if we dropped all the > subpools / > local_pools / file_pools? > The code is older than it looks (first committed as fsfs-reorg.c but existed before that) and was simply not written with the two-pool paradigm in mind. OTOH, memory usage had been critical for fsfs-reorg, so every function tried to keep its dynamic usage as low as feasible. > # grep svn_pool_create subversion/libsvn_fs_fs/stats.c @ r1632945 > > apr_pool_t * file_pool = svn_pool_create(pool); > apr_pool_t *iterpool = svn_pool_create(scratch_pool); > apr_pool_t *subpool = svn_pool_create(scratch_pool); > apr_pool_t *subpool = svn_pool_create(scratch_pool); > apr_pool_t *local_pool = svn_pool_create(pool); > apr_pool_t *iterpool = svn_pool_create(local_pool); > apr_pool_t *local_pool = svn_pool_create(pool); > apr_pool_t *iterpool = svn_pool_create(pool); > apr_pool_t *localpool = svn_pool_create(pool); > As of r1639549, the whole stats code uses the two-pool paradigm and none of the local pools exists anymore, except for the one in get_phys_change_count. -- Stefan^2.