On 7/7/23 1:00 PM, yla...@apache.org wrote:
> Author: ylavic
> Date: Fri Jul  7 11:00:34 2023
> New Revision: 1910846
> 
> URL: http://svn.apache.org/viewvc?rev=1910846&view=rev
> Log:
> util_filter: More useful logging for brigade setaside/reinstate/adopt.
> 
> 
> Modified:
>     httpd/httpd/trunk/server/util_filter.c
> 
> Modified: httpd/httpd/trunk/server/util_filter.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/server/util_filter.c?rev=1910846&r1=1910845&r2=1910846&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/util_filter.c (original)
> +++ httpd/httpd/trunk/server/util_filter.c Fri Jul  7 11:00:34 2023
> @@ -949,12 +949,14 @@ AP_DECLARE(apr_status_t) ap_filter_setas
>      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
>  {
>      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_reins
>                                                       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_reins
>      }
>  
>      /* 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_reins
>       * 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_reins
>          }
>  
>          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_reins
>                  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_reins
>              /*
>               * 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;

Doesn't that change the logic? In the previous code the buckets beyond the 
flush_upto that the function returned are
in sum below conf->flush_max_threshold and conf->flush_max_pipelined. Now we do 
not update *flush_upto any longer if
after the first update we bypass conf->flush_max_threshold and 
conf->flush_max_pipelined again.

Regards

RĂ¼diger

Reply via email to