On Nov 9, 2010, at 1:03 PM, hwri...@apache.org wrote:

> Author: hwright
> Date: Tue Nov  9 21:03:16 2010
> New Revision: 1033228
> 
> URL: http://svn.apache.org/viewvc?rev=1033228&view=rev
> Log:
> Merge r1022675 from trunk:
> 
> * r1022675 (r982355 from ^subversion/branches/performance)
>   Limit the amount of unused memory fragments held by the root pools.
>   Justification:
>     In combination with blame -g server side memory leaks, see r1032808 and
>     http://svn.haxx.se/dev/archive-2010-11/0102.shtml, svnserve's memory
>     usage can get bloated and stay that way, see
>     see http://svn.haxx.se/dev/archive-2010-11/0165.shtml.
>   Notes:
>     Use --accept=mine-full to avoid bizzare branch root property conflicts
>     on 'svn:ignore' and 'bugtraq:logregex'.  This happens for me with both
>     1.6.14 and tr...@1032984.
>   Votes:
>     +1: pburba, cmpilato, hwright
> 

> 
> --- subversion/branches/1.6.x/subversion/svnserve/main.c (original)
> +++ subversion/branches/1.6.x/subversion/svnserve/main.c Tue Nov  9 21:03:16 
> 2010
> @@ -356,6 +356,7 @@ int main(int argc, const char *argv[])
>   apr_sockaddr_t *sa;
>   apr_pool_t *pool;
>   apr_pool_t *connection_pool;
> +  apr_allocator_t *allocator;
>   svn_error_t *err;
>   apr_getopt_t *os;
>   int opt;
> @@ -747,10 +748,22 @@ int main(int argc, const char *argv[])
>         return ERROR_SUCCESS;
> #endif
> 
> +      /* If we are using fulltext caches etc., we will allocate many large
> +         chunks of memory of various sizes outside the cachde for those
> +         fulltexts. Make sure, we use the memory wisely: use an allocator
> +         that causes memory fragments to be given back to the OS early. */
> +
> +      if (apr_allocator_create(&allocator))
> +        return EXIT_FAILURE;
> +
> +      apr_allocator_max_free_set(allocator, 
> SVN_ALLOCATOR_RECOMMENDED_MAX_FREE);
> +
>       /* Non-standard pool handling.  The main thread never blocks to join
>          the connection threads so it cannot clean up after each one.  So
>          separate pools, that can be cleared at thread exit, are used */
> -      connection_pool = svn_pool_create(NULL);
> +
> +      connection_pool = svn_pool_create_ex(NULL, allocator);
> +      apr_allocator_owner_set(allocator, connection_pool);


Shouldn't the allocator have a mutex registered with it, given that svnserve is 
multithreaded?

Blair

Reply via email to