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

Reply via email to