In 2.4's http_request.c there are two places doing:
bb = apr_brigade_create(c->pool, c->bucket_alloc);
to handle sending a FLUSH between requests and an EOR bucket which both
can't be done off r->pool. Because the brigade structure itself is
allocated out of c->pool this means we leak (~64bytes) per request
forever or up to request/conn limits.
We can thread a temp pool through to those functions and fix this,
though because these core internal functions are in the public API (ha
ha) this is the usual compat PITA, and I haven't worked out if that's
more complex for the the async requesta processing call chain.
As a PoC for non-async MPMs:
http://people.apache.org/~jorton/2.4-use-temp-pool.patch
Another choice is to allocate the brigade structure using the bucket
allocator and actually free it on _destroy(). Anybody around who can
remember why we used a pool allocation for that structure from the
beginning?
http://people.apache.org/~jorton/apr-util-brigade-bucket-alloc.patch
plus http://people.apache.org/~jorton/2.4-missing-brigade-destroy.patch
This seems like a simple change but it could have some nasty regressions
if there places where a brigade is reused after calling
apr_brigade_destroy(). Currently that itself can create leaks because
there is no pool cleanup but will otherwise work. I'm also not sure if
there are performance implications.
Also I'd previously written that it was a bad idea to ever call
apr_brigade_destroy() so this is kind of reversing that advice...
https://httpd.apache.org/docs/trunk/developer/output-filters.html#brigade
Whether or not this is a good idea in apr-util 1.x I'm not at all sure.
Any thoughts?
Regards, Joe