diff --git a/include/proto/dumpstats.h b/include/proto/dumpstats.h index 990c620d5..0ba3ae0b4 100644 --- a/include/proto/dumpstats.h +++ b/include/proto/dumpstats.h @@ -46,8 +46,7 @@ int stats_sock_parse_request(struct stream_interface *si, char *line); void stats_io_handler(struct stream_interface *si); -int stats_dump_raw(struct session *s, struct buffer *rep, struct uri_auth *uri); -void stats_dump_raw_to_buffer(struct session *s, struct buffer *req); +int stats_dump_raw_to_buffer(struct session *s, struct buffer *rep); int stats_dump_http(struct session *s, struct buffer *rep, struct uri_auth *uri); int stats_dump_proxy(struct session *s, struct proxy *px, struct uri_auth *uri); int stats_dump_sess_to_buffer(struct session *s, struct buffer *rep); diff --git a/src/dumpstats.c b/src/dumpstats.c index d39bbcd3d..25a0bcab0 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -417,9 +417,7 @@ void stats_io_handler(struct stream_interface *si) si->st0 = 1; // send prompt break; case 3: /* stats/info dump, should be split later ? */ - stats_dump_raw_to_buffer(s, res); - si->ib->flags |= BF_READ_PARTIAL; /* remove this once we use buffer_feed */ - if (s->ana_state == STATS_ST_CLOSE) + if (stats_dump_raw_to_buffer(s, res)) si->st0 = 1; // end of command, send prompt break; case 4: /* sessions dump */ @@ -519,15 +517,14 @@ void stats_io_handler(struct stream_interface *si) } } -/* - * Produces statistics data for the session . Expects to be called with - * client socket shut down on input. It *may* make use of informations from - * . s->data_ctx must have been zeroed first, and the flags properly set. - * It returns 0 if it had to stop writing data and an I/O is needed, 1 if the - * dump is finished and the session must be closed, or -1 in case of any error. - * It automatically clears the HIJACK bit from the response buffer. +/* This function is called to send output to the response buffer. + * It dumps statistics onto the output buffer owned by session . + * s->data_ctx must have been zeroed first, and the flags properly set. + * It returns 0 as long as it does not complete, non-zero upon completion. + * Some states are not used but it makes the code more similar to other + * functions which handle stats too. */ -int stats_dump_raw(struct session *s, struct buffer *rep, struct uri_auth *uri) +int stats_dump_raw_to_buffer(struct session *s, struct buffer *rep) { struct proxy *px; struct chunk msg; @@ -537,16 +534,14 @@ int stats_dump_raw(struct session *s, struct buffer *rep, struct uri_auth *uri) switch (s->data_state) { case DATA_ST_INIT: - /* the function had not been called yet, let's prepare the - * buffer for a response. - */ + /* the function had not been called yet */ s->data_state = DATA_ST_HEAD; /* fall through */ case DATA_ST_HEAD: if (s->data_ctx.stats.flags & STAT_SHOW_STAT) { print_csv_header(&msg); - if (buffer_write_chunk(rep, &msg) >= 0) + if (buffer_feed_chunk(rep, &msg) >= 0) return 0; } @@ -590,7 +585,7 @@ int stats_dump_raw(struct session *s, struct buffer *rep, struct uri_auth *uri) nb_tasks_cur, run_queue_cur, global.node, global.desc?global.desc:"" ); - if (buffer_write_chunk(rep, &msg) >= 0) + if (buffer_feed_chunk(rep, &msg) >= 0) return 0; } @@ -610,9 +605,11 @@ int stats_dump_raw(struct session *s, struct buffer *rep, struct uri_auth *uri) px = s->data_ctx.stats.px; /* skip the disabled proxies and non-networked ones */ if (px->state != PR_STSTOPPED && - (px->cap & (PR_CAP_FE | PR_CAP_BE))) + (px->cap & (PR_CAP_FE | PR_CAP_BE))) { + rep->flags |= BF_READ_PARTIAL; /* remove this once stats_dump_proxy uses buffer_feed */ if (stats_dump_proxy(s, px, NULL) == 0) return 0; + } s->data_ctx.stats.px = px->next; s->data_ctx.stats.px_st = DATA_ST_PX_INIT; @@ -628,32 +625,16 @@ int stats_dump_raw(struct session *s, struct buffer *rep, struct uri_auth *uri) /* fall through */ case DATA_ST_FIN: - buffer_stop_hijack(rep); return 1; default: /* unknown state ! */ - buffer_stop_hijack(rep); - return -1; + s->data_state = DATA_ST_FIN; + return 1; } } -/* This function is called to send output to the response buffer. It simply - * calls stats_dump_raw(), and releases the buffer's hijack bit when the dump - * is finished. - */ -void stats_dump_raw_to_buffer(struct session *s, struct buffer *rep) -{ - if (s->ana_state != STATS_ST_REP) - return; - - if (stats_dump_raw(s, rep, NULL) != 0) - s->ana_state = STATS_ST_CLOSE; - return; -} - - /* * Produces statistics data for the session . Expects to be called with * client socket shut down on input. It stops by itself by unsetting the