diff options
author | Yann Ylavic <ylavic@apache.org> | 2023-07-07 13:00:34 +0200 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2023-07-07 13:00:34 +0200 |
commit | b24195a1f212e91e162a9c107e03733b6d03e7a5 (patch) | |
tree | 049fa7b0cab1c80925e1ecaa192524f7a44bc03d /server | |
parent | pytests: Ignore log errors/warnings per function. (diff) | |
download | apache2-b24195a1f212e91e162a9c107e03733b6d03e7a5.tar.xz apache2-b24195a1f212e91e162a9c107e03733b6d03e7a5.zip |
util_filter: More useful logging for brigade setaside/reinstate/adopt.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1910846 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'server')
-rw-r--r-- | server/util_filter.c | 86 |
1 files changed, 49 insertions, 37 deletions
diff --git a/server/util_filter.c b/server/util_filter.c index 8c278293cf..3b1e96fb44 100644 --- a/server/util_filter.c +++ b/server/util_filter.c @@ -949,12 +949,14 @@ AP_DECLARE(apr_status_t) ap_filter_setaside_brigade(ap_filter_t *f, apr_status_t rv = APR_SUCCESS; struct ap_filter_private *fp = f->priv; - ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, - "setaside %s brigade to %s brigade in '%s' %sput filter", - APR_BRIGADE_EMPTY(bb) ? "empty" : "full", - (!fp->bb || APR_BRIGADE_EMPTY(fp->bb)) ? "empty" : "full", - f->frec->name, - f->frec->direction == AP_FILTER_INPUT ? "in" : "out"); + if (!APR_BRIGADE_EMPTY(bb) || (fp->bb && !APR_BRIGADE_EMPTY(fp->bb))) { + ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, + "setaside %s brigade to %s brigade in '%s' %sput filter", + APR_BRIGADE_EMPTY(bb) ? "empty" : "full", + (!fp->bb || APR_BRIGADE_EMPTY(fp->bb)) ? "empty" : "full", + f->frec->name, + f->frec->direction == AP_FILTER_INPUT ? "in" : "out"); + } /* This API is not suitable for request filters */ if (f->frec->ftype < AP_FTYPE_CONNECTION) { @@ -1049,12 +1051,14 @@ AP_DECLARE(void) ap_filter_adopt_brigade(ap_filter_t *f, { struct ap_filter_private *fp = f->priv; - ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, - "adopt %s brigade to %s brigade in '%s' %sput filter", - APR_BRIGADE_EMPTY(bb) ? "empty" : "full", - (!fp->bb || APR_BRIGADE_EMPTY(fp->bb)) ? "empty" : "full", - f->frec->name, - f->frec->direction == AP_FILTER_INPUT ? "in" : "out"); + if (!APR_BRIGADE_EMPTY(bb) || (fp->bb && !APR_BRIGADE_EMPTY(fp->bb))) { + ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, + "adopt %s brigade to %s brigade in '%s' %sput filter", + APR_BRIGADE_EMPTY(bb) ? "empty" : "full", + (!fp->bb || APR_BRIGADE_EMPTY(fp->bb)) ? "empty" : "full", + f->frec->name, + f->frec->direction == AP_FILTER_INPUT ? "in" : "out"); + } if (!APR_BRIGADE_EMPTY(bb)) { ap_filter_prepare_brigade(f); @@ -1067,18 +1071,26 @@ AP_DECLARE(apr_status_t) ap_filter_reinstate_brigade(ap_filter_t *f, apr_bucket **flush_upto) { apr_bucket *bucket, *next; + apr_size_t flush_max_threshold; + apr_int32_t flush_max_pipelined; apr_size_t bytes_in_brigade, memory_bytes_in_brigade; int eor_buckets_in_brigade, opaque_buckets_in_brigade; struct ap_filter_private *fp = f->priv; core_server_config *conf; int is_flush; - ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, - "reinstate %s brigade to %s brigade in '%s' %sput filter", - (!fp->bb || APR_BRIGADE_EMPTY(fp->bb) ? "empty" : "full"), - (APR_BRIGADE_EMPTY(bb) ? "empty" : "full"), - f->frec->name, - f->frec->direction == AP_FILTER_INPUT ? "in" : "out"); + if (flush_upto) { + *flush_upto = NULL; + } + + if (!APR_BRIGADE_EMPTY(bb) || (fp->bb && !APR_BRIGADE_EMPTY(fp->bb))) { + ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, + "reinstate %s brigade to %s brigade in '%s' %sput filter", + (!fp->bb || APR_BRIGADE_EMPTY(fp->bb) ? "empty" : "full"), + (APR_BRIGADE_EMPTY(bb) ? "empty" : "full"), + f->frec->name, + f->frec->direction == AP_FILTER_INPUT ? "in" : "out"); + } /* This API is not suitable for request filters */ if (f->frec->ftype < AP_FTYPE_CONNECTION) { @@ -1086,17 +1098,15 @@ AP_DECLARE(apr_status_t) ap_filter_reinstate_brigade(ap_filter_t *f, } /* Buckets in fp->bb are leftover from previous call to setaside, so - * they happen before anything added here in bb. + * they happen before anything in bb already. */ if (fp->bb) { APR_BRIGADE_PREPEND(bb, fp->bb); } - if (!flush_upto) { - /* Just prepend all. */ + if (!flush_upto || APR_BRIGADE_EMPTY(bb)) { + /* Just prepend all, or nothing to do. */ return APR_SUCCESS; } - - *flush_upto = NULL; /* * Determine if and up to which bucket the caller needs to do a blocking @@ -1124,13 +1134,15 @@ AP_DECLARE(apr_status_t) ap_filter_reinstate_brigade(ap_filter_t *f, * reinstated by moving them from/to fp->bb to/from user bb. */ + conf = ap_get_core_module_config(f->c->base_server->module_config); + flush_max_threshold = conf->flush_max_threshold; + flush_max_pipelined = conf->flush_max_pipelined; + bytes_in_brigade = 0; memory_bytes_in_brigade = 0; eor_buckets_in_brigade = 0; opaque_buckets_in_brigade = 0; - conf = ap_get_core_module_config(f->c->base_server->module_config); - for (bucket = APR_BRIGADE_FIRST(bb); bucket != APR_BRIGADE_SENTINEL(bb); bucket = next) { next = APR_BUCKET_NEXT(bucket); @@ -1157,9 +1169,9 @@ AP_DECLARE(apr_status_t) ap_filter_reinstate_brigade(ap_filter_t *f, } if (is_flush - || (memory_bytes_in_brigade > conf->flush_max_threshold) - || (conf->flush_max_pipelined >= 0 - && eor_buckets_in_brigade > conf->flush_max_pipelined)) { + || (memory_bytes_in_brigade > flush_max_threshold) + || (flush_max_pipelined >= 0 + && eor_buckets_in_brigade > flush_max_pipelined)) { /* this segment of the brigade MUST be sent before returning. */ if (APLOGctrace6(f->c)) { @@ -1170,11 +1182,9 @@ AP_DECLARE(apr_status_t) ap_filter_reinstate_brigade(ap_filter_t *f, ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, "will flush because of %s", reason); ap_log_cerror(APLOG_MARK, APLOG_TRACE8, 0, f->c, - "seen in brigade%s: bytes: %" APR_SIZE_T_FMT + "seen in brigade so far: bytes: %" APR_SIZE_T_FMT ", memory bytes: %" APR_SIZE_T_FMT ", eor " "buckets: %d, opaque buckets: %d", - *flush_upto == NULL ? " so far" - : " since last flush point", bytes_in_brigade, memory_bytes_in_brigade, eor_buckets_in_brigade, @@ -1183,16 +1193,18 @@ AP_DECLARE(apr_status_t) ap_filter_reinstate_brigade(ap_filter_t *f, /* * Defer the actual blocking write to avoid doing many writes. */ + if (memory_bytes_in_brigade > flush_max_threshold) { + flush_max_threshold = APR_SIZE_MAX; + } + if (flush_max_pipelined >= 0 + && eor_buckets_in_brigade > flush_max_pipelined) { + flush_max_pipelined = APR_INT32_MAX; + } *flush_upto = next; - - bytes_in_brigade = 0; - memory_bytes_in_brigade = 0; - eor_buckets_in_brigade = 0; - opaque_buckets_in_brigade = 0; } } - ap_log_cerror(APLOG_MARK, APLOG_TRACE8, 0, f->c, + ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, f->c, "brigade contains%s: bytes: %" APR_SIZE_T_FMT ", non-file bytes: %" APR_SIZE_T_FMT ", eor buckets: %d, opaque buckets: %d", |