On 24 August 2016 at 17:43, <kot...@apache.org> wrote: > Author: kotkov > Date: Wed Aug 24 14:43:21 2016 > New Revision: 1757532 > > URL: http://svn.apache.org/viewvc?rev=1757532&view=rev > Log: > In mod_dav_svn, rewrite the code responsible for answering to GET requests > with a specified delta base, so that it would reuse a single bucket brigade. > > This gets rid of the unbounded memory usage caused by creating a new bucket > brigade per *every* call of the svn_stream_write(). The bucket brigades > were allocated in the request pool. > > * subversion/mod_dav_svn/repos.c > (diff_ctx_t): Remove `pool`, add a new bucket brigade (`bb`) field. > (write_to_filter, close_filter): Reuse the single bucket brigade from the > stream's context. > (deliver): Create a bucket brigade, pass it to the output stream for > svndiff, and destroy it after we've sent the data. > > Modified: > subversion/trunk/subversion/mod_dav_svn/repos.c > > Modified: subversion/trunk/subversion/mod_dav_svn/repos.c > URL: > http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/repos.c?rev=1757532&r1=1757531&r2=1757532&view=diff > ============================================================================== > --- subversion/trunk/subversion/mod_dav_svn/repos.c (original) > +++ subversion/trunk/subversion/mod_dav_svn/repos.c Wed Aug 24 14:43:21 2016 > @@ -3237,7 +3237,7 @@ set_headers(request_rec *r, const dav_re > [...]
> @@ -3266,15 +3264,13 @@ static svn_error_t * __attribute__((war > close_filter(void *baton) > { > diff_ctx_t *dc = baton; > - apr_bucket_brigade *bb; > apr_bucket *bkt; > apr_status_t status; > > /* done with the file. write an EOS bucket now. */ > - bb = apr_brigade_create(dc->pool, dc->output->c->bucket_alloc); > bkt = apr_bucket_eos_create(dc->output->c->bucket_alloc); > - APR_BRIGADE_INSERT_TAIL(bb, bkt); > - if ((status = ap_pass_brigade(dc->output, bb)) != APR_SUCCESS) > + APR_BRIGADE_INSERT_TAIL(dc->bb, bkt); > + if ((status = ap_pass_brigade(dc->output, dc->bb)) != APR_SUCCESS) > return svn_error_create(status, NULL, "Could not write EOS to filter"); > As far I understand apr_brigade_cleanup() should be called after ap_pass_brigade(). So code should be something like: [[[ APR_BRIGADE_INSERT_TAIL(dc->bb, bkt); status = ap_pass_brigade(dc->output, dc->bb); apr_brigade_cleanup(dc->bb); if (status != APR_SUCCESS) return svn_error_create(status, NULL, "Could not write EOS to filter"); ]]] -- Ivan Zhakov