[4.1] 891889f Retool SES_RxReq() from a REQ specific thing to a general "receive som stuff on this TCP connection with timeouts" function.

Poul-Henning Kamp phk at FreeBSD.org
Fri Sep 4 15:54:53 CEST 2015


commit 891889f0d3613fb3e59167f87cc0752876f2bb1d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Aug 10 09:55:58 2015 +0000

    Retool SES_RxReq() from a REQ specific thing to a general "receive som
    stuff on this TCP connection with timeouts" function.
    
    Inpired by colliding patches from Martin & Lasse.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 6719345..4c57c4e 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -980,8 +980,8 @@ void SES_RxInit(struct http_conn *htc, struct ws *ws,
     unsigned maxbytes, unsigned maxhdr);
 void SES_RxReInit(struct http_conn *htc);
 enum htc_status_e SES_Rx(struct http_conn *htc, double tmo);
-enum htc_status_e SES_RxReq(const struct worker *, struct req *,
-    htc_complete_f *func);
+enum htc_status_e SES_RxStuff(struct http_conn *, htc_complete_f *, double t0,
+    double *t1, double *t2, double ti, double tn);
 
 #define SESS_ATTR(UP, low, typ, len)				\
 	int SES_Get_##low(const struct sess *sp, typ *dst);	\
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 56340e0..7476419 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -217,66 +217,73 @@ SES_Rx(struct http_conn *htc, double tmo)
 
 /*----------------------------------------------------------------------
  * Receive a request/packet/whatever, with timeouts
+ *
+ * t0 is when we start
+ * *t1 becomes time of first non-idle rx 
+ * *t2 becomes time of complete rx
+ * ti is when we return IDLE if nothing has arrived
+ * tn is when we timeout on non-complete
  */
 
 enum htc_status_e
-SES_RxReq(const struct worker *wrk, struct req *req, htc_complete_f *func)
+SES_RxStuff(struct http_conn *htc, htc_complete_f *func, double t0,
+    double *t1, double *t2, double ti, double tn)
 {
 	double tmo;
-	double now, when;
-	struct sess *sp;
+	double now;
 	enum htc_status_e hs;
 
-	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
-	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
-	sp = req->sp;
-	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(htc, HTTP_CONN_MAGIC);
 
-	AZ(isnan(sp->t_idle));
-	assert(isnan(req->t_first));
+	AZ(isnan(t0));
+	AZ(isnan(tn));
+	if (t1 != NULL)
+		assert(isnan(*t1));
 
-	when = sp->t_idle + cache_param->timeout_idle;
-	tmo = cache_param->timeout_linger;
+	now = t0;
 	while (1) {
-		hs = SES_Rx(req->htc, tmo);
-		now = VTIM_real();
+		if (!isnan(ti))
+			tmo = ti - t0;
+		else
+			tmo = tn - t0;
+		hs = SES_Rx(htc, tmo);
 		if (hs == HTC_S_EOF) {
-			WS_ReleaseP(req->htc->ws, req->htc->rxbuf_b);
+			WS_ReleaseP(htc->ws, htc->rxbuf_b);
 			return (HTC_S_CLOSE);
 		}
 		if (hs == HTC_S_OVERFLOW) {
-			WS_ReleaseP(req->htc->ws, req->htc->rxbuf_b);
+			WS_ReleaseP(htc->ws, htc->rxbuf_b);
 			return (HTC_S_OVERFLOW);
 		}
-		hs = func(req->htc);
+		now = VTIM_real();
+		hs = func(htc);
 		if (hs == HTC_S_OVERFLOW) {
-			WS_ReleaseP(req->htc->ws, req->htc->rxbuf_b);
+			WS_ReleaseP(htc->ws, htc->rxbuf_b);
 			return (HTC_S_OVERFLOW);
 		}
 		if (hs == HTC_S_JUNK) {
-			WS_ReleaseP(req->htc->ws, req->htc->rxbuf_b);
+			WS_ReleaseP(htc->ws, htc->rxbuf_b);
 			return (HTC_S_JUNK);
 		}
 		if (hs == HTC_S_COMPLETE) {
 			/* Got it, run with it */
-			if (isnan(req->t_first))
-				req->t_first = now;
-			req->t_req = now;
+			if (t1 != NULL && isnan(*t1))
+				*t1 = now;
+			if (t2 != NULL)
+				*t2 = now;
 			return (HTC_S_COMPLETE);
 		}
-		if (when < now)
+		if (tn < now)
 			return (HTC_S_TIMEOUT);
 		if (hs == HTC_S_MORE) {
 			/* Working on it */
-			if (isnan(req->t_first))
-				req->t_first = now;
-			tmo = when - now;
+			if (t1 != NULL && isnan(*t1))
+				*t1 = now;
+			tmo = tn - now;
 			continue;
 		}
 		assert(hs == HTC_S_EMPTY);
-		/* Nothing but whitespace */
-		tmo = sp->t_idle + cache_param->timeout_linger - now;
-		if (tmo < 0)
+		if (ti < now)
 			return (HTC_S_IDLE);
 	}
 }
diff --git a/bin/varnishd/http1/cache_http1_fsm.c b/bin/varnishd/http1/cache_http1_fsm.c
index 103ba3b..e66fa96 100644
--- a/bin/varnishd/http1/cache_http1_fsm.c
+++ b/bin/varnishd/http1/cache_http1_fsm.c
@@ -199,7 +199,10 @@ HTTP1_Session(struct worker *wrk, struct req *req)
 			AZ(req->vcl);
 			AZ(req->esi_level);
 
-			hs = SES_RxReq(wrk, req, HTTP1_Complete);
+			hs = SES_RxStuff(req->htc, HTTP1_Complete, sp->t_idle,
+			    &req->t_first, &req->t_req,
+			    sp->t_idle + cache_param->timeout_linger,
+			    sp->t_idle + cache_param->timeout_idle);
 			if (hs < HTC_S_EMPTY) {
 				req->acct.req_hdrbytes +=
 				    req->htc->rxbuf_e - req->htc->rxbuf_b;
diff --git a/bin/varnishd/proxy/cache_proxy_proto.c b/bin/varnishd/proxy/cache_proxy_proto.c
index e359cb0..f3c9caa 100644
--- a/bin/varnishd/proxy/cache_proxy_proto.c
+++ b/bin/varnishd/proxy/cache_proxy_proto.c
@@ -351,7 +351,8 @@ VPX_Proto_Sess(struct worker *wrk, void *priv)
 	assert(sizeof vpx1_sig == 5);
 	assert(sizeof vpx2_sig == 12);
 
-	hs = SES_RxReq(wrk, req, vpx_complete);
+	hs = SES_RxStuff(req->htc, vpx_complete, sp->t_idle,
+	    NULL, NULL, NAN, sp->t_idle + cache_param->timeout_idle);
 	if (hs != HTC_S_COMPLETE) {
 		Req_Release(req);
 		SES_Delete(sp, SC_RX_JUNK, NAN);
@@ -377,8 +378,6 @@ VPX_Proto_Sess(struct worker *wrk, void *priv)
 		req->htc->pipeline_e = req->htc->rxbuf_e;
 	WS_Release(req->htc->ws, 0);
 	SES_RxReInit(req->htc);
-	req->t_req = NAN;
-	req->t_first = NAN;
 	req->sp->sess_step = S_STP_H1NEWREQ;
 	wrk->task.func = SES_Proto_Req;
 	wrk->task.priv = req;



More information about the varnish-commit mailing list