diff --git a/src/stream.c b/src/stream.c index 5a36a0357..aaf42f39f 100644 --- a/src/stream.c +++ b/src/stream.c @@ -3154,9 +3154,6 @@ struct show_sess_ctx { unsigned int uid; /* if non-null, the uniq_id of the session being dumped */ int section; /* section of the session being dumped */ int pos; /* last position of the current session's buffer */ - enum { - STATE_LIST = 0, - } state; /* dump state */ }; /* This function dumps a complete stream state onto the conn-stream's @@ -3562,193 +3559,191 @@ static int cli_io_handler_dump_sess(struct appctx *appctx) chunk_reset(&trash); - switch (ctx->state) { - default: - /* first, let's detach the back-ref from a possible previous stream */ - if (!LIST_ISEMPTY(&ctx->bref.users)) { + /* first, let's detach the back-ref from a possible previous stream */ + if (!LIST_ISEMPTY(&ctx->bref.users)) { + LIST_DELETE(&ctx->bref.users); + LIST_INIT(&ctx->bref.users); + } else if (!ctx->bref.ref) { + /* first call, start with first stream */ + ctx->bref.ref = ha_thread_ctx[ctx->thr].streams.n; + } + + /* and start from where we stopped */ + while (1) { + char pn[INET6_ADDRSTRLEN]; + struct stream *curr_strm; + int done= 0; + + if (ctx->bref.ref == &ha_thread_ctx[ctx->thr].streams) + done = 1; + else { + /* check if we've found a stream created after issuing the "show sess" */ + curr_strm = LIST_ELEM(ctx->bref.ref, struct stream *, list); + if ((int)(curr_strm->stream_epoch - __cs_strm(appctx->owner)->stream_epoch) > 0) + done = 1; + } + + if (done) { + ctx->thr++; + if (ctx->thr >= global.nbthread) + break; + ctx->bref.ref = ha_thread_ctx[ctx->thr].streams.n; + continue; + } + + if (ctx->target) { + if (ctx->target != (void *)-1 && ctx->target != curr_strm) + goto next_sess; + + LIST_APPEND(&curr_strm->back_refs, &ctx->bref.users); + /* call the proper dump() function and return if we're missing space */ + if (!stats_dump_full_strm_to_buffer(cs, curr_strm)) + goto full; + + /* stream dump complete */ LIST_DELETE(&ctx->bref.users); LIST_INIT(&ctx->bref.users); - } else if (!ctx->bref.ref) { - /* first call, start with first stream */ - ctx->bref.ref = ha_thread_ctx[ctx->thr].streams.n; - } - - /* and start from where we stopped */ - while (1) { - char pn[INET6_ADDRSTRLEN]; - struct stream *curr_strm; - int done= 0; - - if (ctx->bref.ref == &ha_thread_ctx[ctx->thr].streams) - done = 1; - else { - /* check if we've found a stream created after issuing the "show sess" */ - curr_strm = LIST_ELEM(ctx->bref.ref, struct stream *, list); - if ((int)(curr_strm->stream_epoch - __cs_strm(appctx->owner)->stream_epoch) > 0) - done = 1; - } - - if (done) { - ctx->thr++; - if (ctx->thr >= global.nbthread) - break; - ctx->bref.ref = ha_thread_ctx[ctx->thr].streams.n; - continue; - } - - if (ctx->target) { - if (ctx->target != (void *)-1 && ctx->target != curr_strm) - goto next_sess; - - LIST_APPEND(&curr_strm->back_refs, &ctx->bref.users); - /* call the proper dump() function and return if we're missing space */ - if (!stats_dump_full_strm_to_buffer(cs, curr_strm)) - goto full; - - /* stream dump complete */ - LIST_DELETE(&ctx->bref.users); - LIST_INIT(&ctx->bref.users); - if (ctx->target != (void *)-1) { - ctx->target = NULL; - break; - } - else - goto next_sess; - } - - chunk_appendf(&trash, - "%p: proto=%s", - curr_strm, - strm_li(curr_strm) ? strm_li(curr_strm)->rx.proto->name : "?"); - - conn = objt_conn(strm_orig(curr_strm)); - switch (conn && conn_get_src(conn) ? addr_to_str(conn->src, pn, sizeof(pn)) : AF_UNSPEC) { - case AF_INET: - case AF_INET6: - chunk_appendf(&trash, - " src=%s:%d fe=%s be=%s srv=%s", - pn, - get_host_port(conn->src), - strm_fe(curr_strm)->id, - (curr_strm->be->cap & PR_CAP_BE) ? curr_strm->be->id : "", - objt_server(curr_strm->target) ? __objt_server(curr_strm->target)->id : "" - ); - break; - case AF_UNIX: - chunk_appendf(&trash, - " src=unix:%d fe=%s be=%s srv=%s", - strm_li(curr_strm)->luid, - strm_fe(curr_strm)->id, - (curr_strm->be->cap & PR_CAP_BE) ? curr_strm->be->id : "", - objt_server(curr_strm->target) ? __objt_server(curr_strm->target)->id : "" - ); + if (ctx->target != (void *)-1) { + ctx->target = NULL; break; } - - chunk_appendf(&trash, - " ts=%02x epoch=%#x age=%s calls=%u rate=%u cpu=%llu lat=%llu", - curr_strm->task->state, curr_strm->stream_epoch, - human_time(now.tv_sec - curr_strm->logs.tv_accept.tv_sec, 1), - curr_strm->task->calls, read_freq_ctr(&curr_strm->call_rate), - (unsigned long long)curr_strm->task->cpu_time, (unsigned long long)curr_strm->task->lat_time); - - chunk_appendf(&trash, - " rq[f=%06xh,i=%u,an=%02xh,rx=%s", - curr_strm->req.flags, - (unsigned int)ci_data(&curr_strm->req), - curr_strm->req.analysers, - curr_strm->req.rex ? - human_time(TICKS_TO_MS(curr_strm->req.rex - now_ms), - TICKS_TO_MS(1000)) : ""); - - chunk_appendf(&trash, - ",wx=%s", - curr_strm->req.wex ? - human_time(TICKS_TO_MS(curr_strm->req.wex - now_ms), - TICKS_TO_MS(1000)) : ""); - - chunk_appendf(&trash, - ",ax=%s]", - curr_strm->req.analyse_exp ? - human_time(TICKS_TO_MS(curr_strm->req.analyse_exp - now_ms), - TICKS_TO_MS(1000)) : ""); - - chunk_appendf(&trash, - " rp[f=%06xh,i=%u,an=%02xh,rx=%s", - curr_strm->res.flags, - (unsigned int)ci_data(&curr_strm->res), - curr_strm->res.analysers, - curr_strm->res.rex ? - human_time(TICKS_TO_MS(curr_strm->res.rex - now_ms), - TICKS_TO_MS(1000)) : ""); - - chunk_appendf(&trash, - ",wx=%s", - curr_strm->res.wex ? - human_time(TICKS_TO_MS(curr_strm->res.wex - now_ms), - TICKS_TO_MS(1000)) : ""); - - chunk_appendf(&trash, - ",ax=%s]", - curr_strm->res.analyse_exp ? - human_time(TICKS_TO_MS(curr_strm->res.analyse_exp - now_ms), - TICKS_TO_MS(1000)) : ""); - - conn = cs_conn(curr_strm->csf); - chunk_appendf(&trash, - " csf=[%d,%1xh,fd=%d]", - curr_strm->csf->state, - curr_strm->csf->flags, - conn_fd(conn)); - - conn = cs_conn(curr_strm->csb); - chunk_appendf(&trash, - " csb=[%d,%1xh,fd=%d]", - curr_strm->csb->state, - curr_strm->csb->flags, - conn_fd(conn)); - - chunk_appendf(&trash, - " exp=%s rc=%d c_exp=%s", - curr_strm->task->expire ? - human_time(TICKS_TO_MS(curr_strm->task->expire - now_ms), - TICKS_TO_MS(1000)) : "", - curr_strm->conn_retries, - curr_strm->conn_exp ? - human_time(TICKS_TO_MS(curr_strm->conn_exp - now_ms), - TICKS_TO_MS(1000)) : ""); - if (task_in_rq(curr_strm->task)) - chunk_appendf(&trash, " run(nice=%d)", curr_strm->task->nice); - - chunk_appendf(&trash, "\n"); - - if (ci_putchk(cs_ic(cs), &trash) == -1) { - /* let's try again later from this stream. We add ourselves into - * this stream's users so that it can remove us upon termination. - */ - LIST_APPEND(&curr_strm->back_refs, &ctx->bref.users); - goto full; - } - - next_sess: - ctx->bref.ref = curr_strm->list.n; - } - - if (ctx->target && ctx->target != (void *)-1) { - /* specified stream not found */ - if (ctx->section > 0) - chunk_appendf(&trash, " *** session terminated while we were watching it ***\n"); else - chunk_appendf(&trash, "Session not found.\n"); - - if (ci_putchk(cs_ic(cs), &trash) == -1) - goto full; - - ctx->target = NULL; - ctx->uid = 0; - goto done; + goto next_sess; } + + chunk_appendf(&trash, + "%p: proto=%s", + curr_strm, + strm_li(curr_strm) ? strm_li(curr_strm)->rx.proto->name : "?"); + + conn = objt_conn(strm_orig(curr_strm)); + switch (conn && conn_get_src(conn) ? addr_to_str(conn->src, pn, sizeof(pn)) : AF_UNSPEC) { + case AF_INET: + case AF_INET6: + chunk_appendf(&trash, + " src=%s:%d fe=%s be=%s srv=%s", + pn, + get_host_port(conn->src), + strm_fe(curr_strm)->id, + (curr_strm->be->cap & PR_CAP_BE) ? curr_strm->be->id : "", + objt_server(curr_strm->target) ? __objt_server(curr_strm->target)->id : "" + ); + break; + case AF_UNIX: + chunk_appendf(&trash, + " src=unix:%d fe=%s be=%s srv=%s", + strm_li(curr_strm)->luid, + strm_fe(curr_strm)->id, + (curr_strm->be->cap & PR_CAP_BE) ? curr_strm->be->id : "", + objt_server(curr_strm->target) ? __objt_server(curr_strm->target)->id : "" + ); + break; + } + + chunk_appendf(&trash, + " ts=%02x epoch=%#x age=%s calls=%u rate=%u cpu=%llu lat=%llu", + curr_strm->task->state, curr_strm->stream_epoch, + human_time(now.tv_sec - curr_strm->logs.tv_accept.tv_sec, 1), + curr_strm->task->calls, read_freq_ctr(&curr_strm->call_rate), + (unsigned long long)curr_strm->task->cpu_time, (unsigned long long)curr_strm->task->lat_time); + + chunk_appendf(&trash, + " rq[f=%06xh,i=%u,an=%02xh,rx=%s", + curr_strm->req.flags, + (unsigned int)ci_data(&curr_strm->req), + curr_strm->req.analysers, + curr_strm->req.rex ? + human_time(TICKS_TO_MS(curr_strm->req.rex - now_ms), + TICKS_TO_MS(1000)) : ""); + + chunk_appendf(&trash, + ",wx=%s", + curr_strm->req.wex ? + human_time(TICKS_TO_MS(curr_strm->req.wex - now_ms), + TICKS_TO_MS(1000)) : ""); + + chunk_appendf(&trash, + ",ax=%s]", + curr_strm->req.analyse_exp ? + human_time(TICKS_TO_MS(curr_strm->req.analyse_exp - now_ms), + TICKS_TO_MS(1000)) : ""); + + chunk_appendf(&trash, + " rp[f=%06xh,i=%u,an=%02xh,rx=%s", + curr_strm->res.flags, + (unsigned int)ci_data(&curr_strm->res), + curr_strm->res.analysers, + curr_strm->res.rex ? + human_time(TICKS_TO_MS(curr_strm->res.rex - now_ms), + TICKS_TO_MS(1000)) : ""); + + chunk_appendf(&trash, + ",wx=%s", + curr_strm->res.wex ? + human_time(TICKS_TO_MS(curr_strm->res.wex - now_ms), + TICKS_TO_MS(1000)) : ""); + + chunk_appendf(&trash, + ",ax=%s]", + curr_strm->res.analyse_exp ? + human_time(TICKS_TO_MS(curr_strm->res.analyse_exp - now_ms), + TICKS_TO_MS(1000)) : ""); + + conn = cs_conn(curr_strm->csf); + chunk_appendf(&trash, + " csf=[%d,%1xh,fd=%d]", + curr_strm->csf->state, + curr_strm->csf->flags, + conn_fd(conn)); + + conn = cs_conn(curr_strm->csb); + chunk_appendf(&trash, + " csb=[%d,%1xh,fd=%d]", + curr_strm->csb->state, + curr_strm->csb->flags, + conn_fd(conn)); + + chunk_appendf(&trash, + " exp=%s rc=%d c_exp=%s", + curr_strm->task->expire ? + human_time(TICKS_TO_MS(curr_strm->task->expire - now_ms), + TICKS_TO_MS(1000)) : "", + curr_strm->conn_retries, + curr_strm->conn_exp ? + human_time(TICKS_TO_MS(curr_strm->conn_exp - now_ms), + TICKS_TO_MS(1000)) : ""); + if (task_in_rq(curr_strm->task)) + chunk_appendf(&trash, " run(nice=%d)", curr_strm->task->nice); + + chunk_appendf(&trash, "\n"); + + if (ci_putchk(cs_ic(cs), &trash) == -1) { + /* let's try again later from this stream. We add ourselves into + * this stream's users so that it can remove us upon termination. + */ + LIST_APPEND(&curr_strm->back_refs, &ctx->bref.users); + goto full; + } + + next_sess: + ctx->bref.ref = curr_strm->list.n; } + + if (ctx->target && ctx->target != (void *)-1) { + /* specified stream not found */ + if (ctx->section > 0) + chunk_appendf(&trash, " *** session terminated while we were watching it ***\n"); + else + chunk_appendf(&trash, "Session not found.\n"); + + if (ci_putchk(cs_ic(cs), &trash) == -1) + goto full; + + ctx->target = NULL; + ctx->uid = 0; + goto done; + } + done: thread_release(); return 1;