[experimental-ims] 0ad2c29 Move vca_handover() to SES_Handle() Move vca_close_session() to SES_Close() If SES_Delete() gets a reason, it calls SES_Close()

Geoff Simmons geoff at varnish-cache.org
Mon Jan 9 21:51:55 CET 2012


commit 0ad2c29e9716f357f1000e40198aa3bbaf2b0a19
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sat Sep 17 13:19:19 2011 +0000

    Move vca_handover() to SES_Handle()
    Move vca_close_session() to SES_Close()
    If SES_Delete() gets a reason, it calls SES_Close()
    
    More work on the solaris ports waiter.

diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index a6b1786..2f43ff8 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -646,7 +646,6 @@ struct vbc {
 
 /* cache_acceptor.c */
 void vca_return_session(struct sess *sp);
-void vca_close_session(struct sess *sp, const char *why);
 void VCA_Prep(struct sess *sp);
 void VCA_Init(void);
 void VCA_Shutdown(void);
@@ -861,7 +860,8 @@ void WRW_Sendfile(struct worker *w, int fd, off_t off, unsigned len);
 void SES_Init(void);
 struct sess *SES_New(void);
 struct sess *SES_Alloc(void);
-void SES_Delete(struct sess *sp);
+void SES_Close(struct sess *sp, const char *reason);
+void SES_Delete(struct sess *sp, const char *reason);
 void SES_Charge(struct sess *sp);
 
 /* cache_shmlog.c */
diff --git a/bin/varnishd/cache_acceptor.c b/bin/varnishd/cache_acceptor.c
index f7147cc..46f955b 100644
--- a/bin/varnishd/cache_acceptor.c
+++ b/bin/varnishd/cache_acceptor.c
@@ -330,47 +330,10 @@ vca_acct(void *arg)
 	NEEDLESS_RETURN(NULL);
 }
 
-/*--------------------------------------------------------------------*/
-
-void
-vca_handover(struct sess *sp, int status)
-{
-
-	switch (status) {
-	case -2:
-		vca_close_session(sp, "blast");
-		SES_Delete(sp);
-		break;
-	case -1:
-		vca_close_session(sp, "no request");
-		SES_Delete(sp);
-		break;
-	case 1:
-		sp->step = STP_START;
-		if (Pool_QueueSession(sp))
-			VSC_C_main->client_drop_late++;
-		break;
-	default:
-		INCOMPL();
-	}
-}
 
 /*--------------------------------------------------------------------*/
 
 void
-vca_close_session(struct sess *sp, const char *why)
-{
-	int i;
-
-	VSL(SLT_SessionClose, sp->id, "%s", why);
-	if (sp->fd >= 0) {
-		i = close(sp->fd);
-		assert(i == 0 || errno != EBADF);	/* XXX EINVAL seen */
-	}
-	sp->fd = -1;
-}
-
-void
 vca_return_session(struct sess *sp)
 {
 
@@ -383,7 +346,7 @@ vca_return_session(struct sess *sp)
 	 * acceptor thread, to reduce syscall density of the latter.
 	 */
 	if (VTCP_nonblocking(sp->fd))
-		vca_close_session(sp, "remote closed");
+		SES_Close(sp, "remote closed");
 	vca_act->pass(waiter_priv, sp);
 }
 
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index 39a2104..24b0ddc 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -116,14 +116,14 @@ cnt_wait(struct sess *sp)
 		return (0);
 	}
 	if (i == -2) {
-		vca_close_session(sp, "overflow");
+		SES_Close(sp, "overflow");
 		return (0);
 	}
 	if (i == -1 && Tlen(sp->htc->rxbuf) == 0 &&
 	    (errno == 0 || errno == ECONNRESET))
-		vca_close_session(sp, "EOF");
+		SES_Close(sp, "EOF");
 	else
-		vca_close_session(sp, "error");
+		SES_Close(sp, "error");
 	sp->step = STP_DONE;
 	return (0);
 }
@@ -364,13 +364,13 @@ cnt_done(struct sess *sp)
 		 * before we close, to get queued data transmitted.
 		 */
 		// XXX: not yet (void)VTCP_linger(sp->fd, 0);
-		vca_close_session(sp, sp->doclose);
+		SES_Close(sp, sp->doclose);
 	}
 
 	if (sp->fd < 0) {
 		sp->wrk->stats.sess_closed++;
 		sp->wrk = NULL;
-		SES_Delete(sp);
+		SES_Delete(sp, NULL);
 		return (1);
 	}
 
@@ -1483,7 +1483,7 @@ cnt_start(struct sess *sp)
 	/* If we could not even parse the request, just close */
 	if (done == 400) {
 		sp->step = STP_DONE;
-		vca_close_session(sp, "junk");
+		SES_Close(sp, "junk");
 		return (0);
 	}
 
diff --git a/bin/varnishd/cache_esi_deliver.c b/bin/varnishd/cache_esi_deliver.c
index 61555bf..ea4951f 100644
--- a/bin/varnishd/cache_esi_deliver.c
+++ b/bin/varnishd/cache_esi_deliver.c
@@ -335,8 +335,7 @@ ESI_Deliver(struct sess *sp)
 						st->ptr + off, l2,
 						obuf, sizeof obuf, &obufl);
 					if (WRW_Error(sp->wrk)) {
-						vca_close_session(sp,
-						    "remote closed");
+						SES_Close(sp, "remote closed");
 						p = e;
 						break;
 					}
@@ -388,7 +387,7 @@ ESI_Deliver(struct sess *sp)
 				obufl = 0;
 			}
 			if (WRW_Flush(sp->wrk)) {
-				vca_close_session(sp, "remote closed");
+				SES_Close(sp, "remote closed");
 				p = e;
 				break;
 			}
diff --git a/bin/varnishd/cache_pipe.c b/bin/varnishd/cache_pipe.c
index 0175937..ddb5c15 100644
--- a/bin/varnishd/cache_pipe.c
+++ b/bin/varnishd/cache_pipe.c
@@ -87,7 +87,7 @@ PipeSession(struct sess *sp)
 	i = WRW_FlushRelease(w);
 
 	if (i) {
-		vca_close_session(sp, "pipe");
+		SES_Close(sp, "pipe");
 		VDI_CloseFd(sp);
 		return;
 	}
@@ -127,6 +127,6 @@ PipeSession(struct sess *sp)
 			fds[1].fd = -1;
 		}
 	}
-	vca_close_session(sp, "pipe");
+	SES_Close(sp, "pipe");
 	VDI_CloseFd(sp);
 }
diff --git a/bin/varnishd/cache_pool.c b/bin/varnishd/cache_pool.c
index a80cd9b..92e81b1 100644
--- a/bin/varnishd/cache_pool.c
+++ b/bin/varnishd/cache_pool.c
@@ -232,7 +232,6 @@ Pool_QueueSession(struct sess *sp)
 	 * XXX: sleep whichever thread got us here
 	 */
 	sp->t_end = TIM_real();
-	vca_close_session(sp, "dropped");
 	if (sp->vcl != NULL) {
 		/*
 		 * A session parked on a busy object can come here
@@ -240,7 +239,7 @@ Pool_QueueSession(struct sess *sp)
 		 */
 		VCL_Rel(&sp->vcl);
 	}
-	SES_Delete(sp);
+	SES_Delete(sp, "dropped");
 	return (1);
 }
 
diff --git a/bin/varnishd/cache_response.c b/bin/varnishd/cache_response.c
index 73338f7..982d8fe 100644
--- a/bin/varnishd/cache_response.c
+++ b/bin/varnishd/cache_response.c
@@ -323,7 +323,7 @@ RES_WriteObj(struct sess *sp)
 		WRW_EndChunk(sp->wrk);
 
 	if (WRW_FlushRelease(sp->wrk))
-		vca_close_session(sp, "remote closed");
+		SES_Close(sp, "remote closed");
 }
 
 /*--------------------------------------------------------------------*/
@@ -423,5 +423,5 @@ RES_StreamEnd(struct sess *sp)
 	    !(sp->wrk->res_mode & RES_ESI_CHILD))
 		WRW_EndChunk(sp->wrk);
 	if (WRW_FlushRelease(sp->wrk))
-		vca_close_session(sp, "remote closed");
+		SES_Close(sp, "remote closed");
 }
diff --git a/bin/varnishd/cache_session.c b/bin/varnishd/cache_session.c
index 1ebca44..15373a4 100644
--- a/bin/varnishd/cache_session.c
+++ b/bin/varnishd/cache_session.c
@@ -48,6 +48,7 @@
 
 #include "cache.h"
 #include "cache_backend.h"
+#include "cache_waiter.h"
 
 /*--------------------------------------------------------------------*/
 
@@ -238,12 +239,55 @@ SES_Alloc(void)
 }
 
 /*--------------------------------------------------------------------
- * Recycle a session.  If the workspace has changed, deleted it,
+ * Handle a session (from waiter)
+ *
+ * Status: see HTC_Rx()
+ */
+
+void
+SES_Handle(struct sess *sp, int status)
+{
+
+	switch (status) {
+	case -2:
+		SES_Delete(sp, "blast");
+		break;
+	case -1:
+		SES_Delete(sp, "no request");
+		break;
+	case 1:
+		sp->step = STP_START;
+		if (Pool_QueueSession(sp))
+			VSC_C_main->client_drop_late++;
+		break;
+	default:
+		WRONG("Unexpected return from HTC_Rx()");
+	}
+}
+
+/*--------------------------------------------------------------------
+ * Close a sessions connection.
+ */
+
+void
+SES_Close(struct sess *sp, const char *reason)
+{
+	int i;
+
+	assert(sp->fd >= 0);
+	VSL(SLT_SessionClose, sp->id, "%s", reason);
+	i = close(sp->fd);
+	assert(i == 0 || errno != EBADF); /* XXX EINVAL seen */
+	sp->fd = -1;
+}
+
+/*--------------------------------------------------------------------
+ * (Close &) Recycle a session.  If the workspace has changed, deleted it,
  * otherwise wash it, and put it up for adoption.
  */
 
 void
-SES_Delete(struct sess *sp)
+SES_Delete(struct sess *sp, const char *reason)
 {
 	struct acct *b = &sp->acct_ses;
 	struct sessmem *sm;
@@ -253,6 +297,10 @@ SES_Delete(struct sess *sp)
 	sm = sp->mem;
 	CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
 
+	if (reason != NULL)
+		SES_Close(sp, reason);
+	assert(sp->fd < 0);
+
 	AZ(sp->obj);
 	AZ(sp->vcl);
 	VSC_C_main->n_sess--;			/* XXX: locking ? */
diff --git a/bin/varnishd/cache_waiter.h b/bin/varnishd/cache_waiter.h
index ab54fe7..86eb2cb 100644
--- a/bin/varnishd/cache_waiter.h
+++ b/bin/varnishd/cache_waiter.h
@@ -53,5 +53,6 @@ extern struct waiter waiter_poll;
 extern struct waiter waiter_ports;
 #endif
 
-/* vca_acceptor.c */
-void vca_handover(struct sess *sp, int bad);
+/* cache_session.c */
+void SES_Handle(struct sess *sp, int status);
+
diff --git a/bin/varnishd/cache_waiter_epoll.c b/bin/varnishd/cache_waiter_epoll.c
index 05c8bc2..acb8e13 100644
--- a/bin/varnishd/cache_waiter_epoll.c
+++ b/bin/varnishd/cache_waiter_epoll.c
@@ -138,19 +138,16 @@ vwe_eev(struct vwe *vwe, const struct epoll_event *ep)
 				return;	/* more needed */
 			}
 			VTAILQ_REMOVE(&vwe->sesshead, sp, list);
-			vca_handover(sp, i);
+			SES_Handle(sp, i);
 		} else if (ep->events & EPOLLERR) {
 			VTAILQ_REMOVE(&vwe->sesshead, sp, list);
-			vca_close_session(sp, "ERR");
-			SES_Delete(sp);
+			SES_Delete(sp, "ERR");
 		} else if (ep->events & EPOLLHUP) {
 			VTAILQ_REMOVE(&vwe->sesshead, sp, list);
-			vca_close_session(sp, "HUP");
-			SES_Delete(sp);
+			SES_Delete(sp, "HUP");
 		} else if (ep->events & EPOLLRDHUP) {
 			VTAILQ_REMOVE(&vwe->sesshead, sp, list);
-			vca_close_session(sp, "RHUP");
-			SES_Delete(sp);
+			SES_Delete(sp, "RHUP");
 		}
 	}
 }
@@ -202,8 +199,7 @@ vwe_thread(void *priv)
 				break;
 			VTAILQ_REMOVE(&vwe->sesshead, sp, list);
 			// XXX: not yet VTCP_linger(sp->fd, 0);
-			vca_close_session(sp, "timeout");
-			SES_Delete(sp);
+			SES_Delete(sp, "timeout");
 		}
 	}
 	return NULL;
diff --git a/bin/varnishd/cache_waiter_kqueue.c b/bin/varnishd/cache_waiter_kqueue.c
index 8febec7..7e6b10f 100644
--- a/bin/varnishd/cache_waiter_kqueue.c
+++ b/bin/varnishd/cache_waiter_kqueue.c
@@ -125,12 +125,11 @@ vwk_kev(struct vwk *vwk, const struct kevent *kp)
 			return;	/* more needed */
 		}
 		VTAILQ_REMOVE(&vwk->sesshead, sp, list);
-		vca_handover(sp, i);
+		SES_Handle(sp, i);
 		return;
 	} else if (kp->flags & EV_EOF) {
 		VTAILQ_REMOVE(&vwk->sesshead, sp, list);
-		vca_close_session(sp, "EOF");
-		SES_Delete(sp);
+		SES_Delete(sp, "EOF");
 		return;
 	} else {
 		VSL(SLT_Debug, sp->id, "KQ: sp %p kev data %lu flags 0x%x%s",
@@ -196,8 +195,7 @@ vwk_thread(void *priv)
 				break;
 			VTAILQ_REMOVE(&vwk->sesshead, sp, list);
 			// XXX: not yet (void)VTCP_linger(sp->fd, 0);
-			vca_close_session(sp, "timeout");
-			SES_Delete(sp);
+			SES_Delete(sp, "timeout");
 		}
 	}
 }
diff --git a/bin/varnishd/cache_waiter_poll.c b/bin/varnishd/cache_waiter_poll.c
index c51776d..f44daa9 100644
--- a/bin/varnishd/cache_waiter_poll.c
+++ b/bin/varnishd/cache_waiter_poll.c
@@ -165,14 +165,13 @@ vwp_main(void *priv)
 					VTAILQ_INSERT_HEAD(&vwp->sesshead, sp, list);
 				} else {
 					vwp_unpoll(vwp, fd);
-					vca_handover(sp, i);
+					SES_Handle(sp, i);
 				}
 			} else if (sp->t_open <= deadline) {
 				VTAILQ_REMOVE(&vwp->sesshead, sp, list);
 				vwp_unpoll(vwp, fd);
 				// XXX: not yet (void)VTCP_linger(sp->fd, 0);
-				vca_close_session(sp, "timeout");
-				SES_Delete(sp);
+				SES_Delete(sp, "timeout");
 			}
 		}
 		if (v && vwp->pollfd[vwp->pipes[0]].revents) {
diff --git a/bin/varnishd/cache_waiter_ports.c b/bin/varnishd/cache_waiter_ports.c
index d607b8a..329ee23 100644
--- a/bin/varnishd/cache_waiter_ports.c
+++ b/bin/varnishd/cache_waiter_ports.c
@@ -80,24 +80,23 @@ vws_port_ev(struct vws *vws, port_event_t *ev) {
 		assert(sp->fd >= 0);
 		AZ(sp->obj);
 		VTAILQ_INSERT_TAIL(&vws->sesshead, sp, list);
-		vws_add(vw, sp->fd, sp);
+		vws_add(vws, sp->fd, sp);
 	} else {
 		int i;
 		assert(ev->portev_source == PORT_SOURCE_FD);
 		CAST_OBJ_NOTNULL(sp, ev->portev_user, SESS_MAGIC);
 		assert(sp->fd >= 0);
 		if(ev->portev_events & POLLERR) {
-			vws_del(vws->sp->fd);
+			vws_del(vws, sp->fd);
 			VTAILQ_REMOVE(&vws->sesshead, sp, list);
-			vca_close_session(sp, "EOF");
-			SES_Delete(sp);
+			SES_Delete(sp, "EOF");
 			return;
 		}
 		i = HTC_Rx(sp->htc);
 
 		if (i == 0) {
 			/* incomplete header, wait for more data */
-			vws_add(sp->fd, sp);
+			vws_add(vws, sp->fd, sp);
 			return;
 		}
 
@@ -113,11 +112,11 @@ vws_port_ev(struct vws *vws, port_event_t *ev) {
 		 *
 		 * Ref: http://opensolaris.org/jive/thread.jspa?threadID=129476&tstart=0
 		 */
-		vws_del(vws->sp->fd);
+		vws_del(vws, sp->fd);
 		VTAILQ_REMOVE(&vws->sesshead, sp, list);
 
-		/* vca_handover will also handle errors */
-		vca_handover(sp, i);
+		/* SES_Handle will also handle errors */
+		SES_Handle(sp, i);
 	}
 	return;
 }
@@ -128,7 +127,7 @@ vws_thread(void *priv)
 	struct sess *sp;
 	struct vws *vws;
 
-	CAST_OBJ_NOTNULL(vwp, priv, VWP_MAGIC);
+	CAST_OBJ_NOTNULL(vws, priv, VWS_MAGIC);
 	/*
 	 * timeouts:
 	 *
@@ -219,8 +218,7 @@ vws_thread(void *priv)
 			if(sp->fd != -1) {
 				vws_del(vws, sp->fd);
 			}
-			vca_close_session(sp, "timeout");
-			SES_Delete(sp);
+			SES_Delete(sp, "timeout");
 		}
 
 		/*
@@ -271,7 +269,7 @@ vws_init(void)
 	ALLOC_OBJ(vws, VWS_MAGIC);
 	AN(vws);
 	VTAILQ_INIT(&vws->sesshead);
-	AZ(pthread_create(&vws_ports_thread, NULL, vws_thread, vws));
+	AZ(pthread_create(&vws->ports_thread, NULL, vws_thread, vws));
 	return (vws);
 }
 
diff --git a/bin/varnishd/storage_file.c b/bin/varnishd/storage_file.c
index 45dfac4..30203f8 100644
--- a/bin/varnishd/storage_file.c
+++ b/bin/varnishd/storage_file.c
@@ -557,7 +557,6 @@ const struct stevedore smf_stevedore = {
 #ifdef INCLUDE_TEST_DRIVER
 
 void vca_flush(struct sess *sp) {}
-void vca_close_session(struct sess *sp, const char *why) {}
 
 #define N	100
 #define M	(128*1024)



More information about the varnish-commit mailing list