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