Commit 48170767 authored by Dridi Boukelmoune's avatar Dridi Boukelmoune

vrt_var: Expose bereq.task_deadline in vcl_pipe

The [be]req.task_deadline should eventually be generalized to all
subroutines with read-write access to [be]req. When that happens,
bereq.task_deadline will inherit req.task_deadline during the pipe
transition.

Related tasks should otherwise have independent deadlines, except
sub-request tasks like ESI where there is a hierarchical dependency.
parent 490553b0
...@@ -419,6 +419,7 @@ struct busyobj { ...@@ -419,6 +419,7 @@ struct busyobj {
vtim_dur connect_timeout; vtim_dur connect_timeout;
vtim_dur first_byte_timeout; vtim_dur first_byte_timeout;
vtim_dur between_bytes_timeout; vtim_dur between_bytes_timeout;
vtim_dur task_deadline;
/* Timers */ /* Timers */
vtim_real t_first; /* First timestamp logged */ vtim_real t_first; /* First timestamp logged */
......
...@@ -366,6 +366,7 @@ vbe_dir_http1pipe(VRT_CTX, VCL_BACKEND d) ...@@ -366,6 +366,7 @@ vbe_dir_http1pipe(VRT_CTX, VCL_BACKEND d)
struct backend *bp; struct backend *bp;
struct v1p_acct v1a; struct v1p_acct v1a;
struct pfd *pfd; struct pfd *pfd;
vtim_real deadline;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC); CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
...@@ -390,8 +391,15 @@ vbe_dir_http1pipe(VRT_CTX, VCL_BACKEND d) ...@@ -390,8 +391,15 @@ vbe_dir_http1pipe(VRT_CTX, VCL_BACKEND d)
i = V1F_SendReq(ctx->req->wrk, ctx->bo, i = V1F_SendReq(ctx->req->wrk, ctx->bo,
&v1a.bereq, &v1a.out); &v1a.bereq, &v1a.out);
VSLb_ts_req(ctx->req, "Pipe", W_TIM_real(ctx->req->wrk)); VSLb_ts_req(ctx->req, "Pipe", W_TIM_real(ctx->req->wrk));
if (i == 0) if (i == 0) {
retval = V1P_Process(ctx->req, *PFD_Fd(pfd), &v1a); deadline = ctx->bo->task_deadline;
if (isnan(deadline))
deadline = cache_param->pipe_task_deadline;
if (deadline > 0.)
deadline += ctx->req->sp->t_idle;
retval = V1P_Process(ctx->req, *PFD_Fd(pfd), &v1a,
deadline);
}
VSLb_ts_req(ctx->req, "PipeSess", W_TIM_real(ctx->req->wrk)); VSLb_ts_req(ctx->req, "PipeSess", W_TIM_real(ctx->req->wrk));
ctx->bo->htc->doclose = retval; ctx->bo->htc->doclose = retval;
vbe_dir_finish(ctx, d); vbe_dir_finish(ctx, d);
......
...@@ -795,6 +795,7 @@ cnt_pipe(struct worker *wrk, struct req *req) ...@@ -795,6 +795,7 @@ cnt_pipe(struct worker *wrk, struct req *req)
} }
bo->wrk = wrk; bo->wrk = wrk;
bo->task_deadline = NAN; /* XXX: copy req->task_deadline */
if (WS_Overflowed(req->ws)) if (WS_Overflowed(req->ws))
wrk->vpi->handling = VCL_RET_FAIL; wrk->vpi->handling = VCL_RET_FAIL;
else else
......
...@@ -409,6 +409,8 @@ VRT_r_bereq_##which(VRT_CTX) \ ...@@ -409,6 +409,8 @@ VRT_r_bereq_##which(VRT_CTX) \
BEREQ_TIMEOUT(connect_timeout) BEREQ_TIMEOUT(connect_timeout)
BEREQ_TIMEOUT(first_byte_timeout) BEREQ_TIMEOUT(first_byte_timeout)
BEREQ_TIMEOUT(between_bytes_timeout) BEREQ_TIMEOUT(between_bytes_timeout)
BEREQ_TIMEOUT(task_deadline)
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
......
...@@ -54,7 +54,8 @@ struct v1p_acct { ...@@ -54,7 +54,8 @@ struct v1p_acct {
int V1P_Enter(void); int V1P_Enter(void);
void V1P_Leave(void); void V1P_Leave(void);
stream_close_t V1P_Process(const struct req *, int fd, struct v1p_acct *); stream_close_t V1P_Process(const struct req *, int fd, struct v1p_acct *,
vtim_real deadline);
void V1P_Charge(struct req *, const struct v1p_acct *, struct VSC_vbe *); void V1P_Charge(struct req *, const struct v1p_acct *, struct VSC_vbe *);
/* cache_http1_line.c */ /* cache_http1_line.c */
......
...@@ -115,11 +115,11 @@ V1P_Charge(struct req *req, const struct v1p_acct *a, struct VSC_vbe *b) ...@@ -115,11 +115,11 @@ V1P_Charge(struct req *req, const struct v1p_acct *a, struct VSC_vbe *b)
} }
stream_close_t stream_close_t
V1P_Process(const struct req *req, int fd, struct v1p_acct *v1a) V1P_Process(const struct req *req, int fd, struct v1p_acct *v1a,
vtim_real deadline)
{ {
struct pollfd fds[2]; struct pollfd fds[2];
vtim_dur tmo, tmo_task; vtim_dur tmo, tmo_task;
vtim_real deadline;
stream_close_t sc; stream_close_t sc;
int i, j; int i, j;
...@@ -143,10 +143,6 @@ V1P_Process(const struct req *req, int fd, struct v1p_acct *v1a) ...@@ -143,10 +143,6 @@ V1P_Process(const struct req *req, int fd, struct v1p_acct *v1a)
fds[1].fd = req->sp->fd; fds[1].fd = req->sp->fd;
fds[1].events = POLLIN; fds[1].events = POLLIN;
deadline = cache_param->pipe_task_deadline;
if (deadline > 0.)
deadline += req->sp->t_idle;
sc = SC_TX_PIPE; sc = SC_TX_PIPE;
while (fds[0].fd > -1 || fds[1].fd > -1) { while (fds[0].fd > -1 || fds[1].fd > -1) {
fds[0].revents = 0; fds[0].revents = 0;
......
...@@ -6,15 +6,12 @@ server s1 { ...@@ -6,15 +6,12 @@ server s1 {
delay 1.1 delay 1.1
close close
loop 3 {
accept accept
rxreq rxreq
txresp -hdr "transfer-encoding: chunked" txresp -hdr "transfer-encoding: chunked"
expect_close expect_close
}
accept
rxreq
txresp -hdr "transfer-encoding: chunked"
expect_close
accept accept
non_fatal non_fatal
...@@ -28,13 +25,20 @@ server s1 { ...@@ -28,13 +25,20 @@ server s1 {
varnish v1 -cliok "param.set pipe_timeout 0s" varnish v1 -cliok "param.set pipe_timeout 0s"
varnish v1 -cliok "param.set pipe_task_deadline 0s" varnish v1 -cliok "param.set pipe_task_deadline 0s"
varnish v1 -vcl+backend "" -start varnish v1 -vcl+backend {
sub vcl_pipe {
if (req.method == "TMO") {
set bereq.task_deadline = 1.1s;
}
}
} -start
logexpect l1 -v v1 -g raw -q SessClose { logexpect l1 -v v1 -g raw -q SessClose {
expect 1000 * SessClose {^TX_PIPE 1\.} expect 1000 * SessClose {^TX_PIPE 1\.}
expect 1003 * SessClose {^RX_TIMEOUT 0\.} expect 1003 * SessClose {^RX_TIMEOUT 0\.}
expect 1006 * SessClose {^RX_TIMEOUT 1\.} expect 1006 * SessClose {^RX_TIMEOUT 1\.}
expect 1009 * SessClose {^RX_TIMEOUT 1\.} expect 1009 * SessClose {^RX_TIMEOUT 1\.}
expect 1012 * SessClose {^RX_TIMEOUT 1\.}
} -start } -start
client c1 { client c1 {
...@@ -51,12 +55,21 @@ varnish v1 -cliok "param.set pipe_timeout 0s" ...@@ -51,12 +55,21 @@ varnish v1 -cliok "param.set pipe_timeout 0s"
varnish v1 -cliok "param.set pipe_task_deadline 1.1s" varnish v1 -cliok "param.set pipe_task_deadline 1.1s"
client c1 -run client c1 -run
varnish v1 -cliok "param.set pipe_timeout 0s"
varnish v1 -cliok "param.set pipe_task_deadline 0s"
client c2 {
non_fatal
txreq -method TMO
rxresp
} -run
varnish v1 -cliok "param.set pipe_timeout 500ms" varnish v1 -cliok "param.set pipe_timeout 500ms"
varnish v1 -cliok "param.set pipe_task_deadline 1.1s" varnish v1 -cliok "param.set pipe_task_deadline 1.1s"
client c1 -run client c1 -run
logexpect l1 -wait logexpect l1 -wait
varnish v1 -expect MAIN.s_pipe == 4 varnish v1 -expect MAIN.s_pipe == 5
varnish v1 -expect MAIN.sc_tx_pipe == 1 varnish v1 -expect MAIN.sc_tx_pipe == 1
varnish v1 -expect MAIN.sc_rx_timeout == 3 varnish v1 -expect MAIN.sc_rx_timeout == 4
...@@ -840,6 +840,20 @@ bereq.retries ...@@ -840,6 +840,20 @@ bereq.retries
A count of how many times this request has been retried. A count of how many times this request has been retried.
.. _bereq.task_deadline:
bereq.task_deadline
Type: DURATION
Readable from: vcl_pipe
Writable from: vcl_pipe
Deadline for pipe sessions, defaults ``0s``, which falls back to the
``pipe_task_deadline`` parameter, see :ref:`varnishd(1)`
.. _bereq.time: .. _bereq.time:
bereq.time bereq.time
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment