[master] bbac365 Try to improve the state-management for the backend waiters -- or failing that, try to get better diagnostics about what it does wrong...
Poul-Henning Kamp
phk at FreeBSD.org
Mon Mar 2 23:43:02 CET 2015
commit bbac365619c995096d6a690bf531227e095424d4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Mon Mar 2 22:42:19 2015 +0000
Try to improve the state-management for the backend waiters -- or
failing that, try to get better diagnostics about what it does wrong...
diff --git a/bin/varnishd/cache/cache_backend.h b/bin/varnishd/cache/cache_backend.h
index 87616db..2fa7694 100644
--- a/bin/varnishd/cache/cache_backend.h
+++ b/bin/varnishd/cache/cache_backend.h
@@ -95,9 +95,10 @@ struct vbc {
uint8_t state;
#define VBC_STATE_AVAIL (1<<0)
#define VBC_STATE_USED (1<<1)
-#define VBC_STATE_CLEANUP (1<<2)
+#define VBC_STATE_STOLEN (1<<2)
+#define VBC_STATE_CLEANUP (1<<3)
uint8_t in_waiter;
- uint8_t stolen;
+ uint8_t have_been_in_waiter;
struct waited waited[1];
struct backend *backend;
diff --git a/bin/varnishd/cache/cache_backend_tcp.c b/bin/varnishd/cache/cache_backend_tcp.c
index e348823..d88a0cf 100644
--- a/bin/varnishd/cache/cache_backend_tcp.c
+++ b/bin/varnishd/cache/cache_backend_tcp.c
@@ -90,44 +90,40 @@ tcp_handle(struct waited *w, enum wait_event ev, double now)
Lck_Lock(&tp->mtx);
VSL(SLT_Debug, 0,
- "------> Handler fd %d in_w %d state %d ev %d stolen %d",
- vbc->fd, vbc->in_waiter, vbc->state, ev, vbc->stolen);
+ "------> Handler fd %d in_w %d state 0x%x ev %d have_been %d",
+ vbc->fd, vbc->in_waiter, vbc->state, ev, vbc->have_been_in_waiter);
AN(vbc->in_waiter);
switch(vbc->state) {
- case VBC_STATE_AVAIL:
- if (ev != WAITER_ACTION || !vbc->stolen) {
- VSL(SLT_Debug,
- 0, "------> Handler avail + !action -> close");
+ case VBC_STATE_STOLEN:
+ vbc->state = VBC_STATE_AVAIL;
+ VTAILQ_REMOVE(&tp->connlist, vbc, list);
+ if (Wait_Enter(tp->waiter, vbc->waited)) {
+ VSL(SLT_Debug, 0,
+ "------> Handler stolen -> re-wait failed");
VTCP_close(&vbc->fd);
- VTAILQ_REMOVE(&tp->connlist, vbc, list);
tp->n_conn--;
FREE_OBJ(vbc);
} else {
- VSL(SLT_Debug, 0,
- "------> Handler avail + action -> re-wait");
- vbc->stolen = 0;
- if (Wait_Enter(tp->waiter, vbc->waited)) {
- VSL(SLT_Debug, 0,
- "------> Handler avail + "
- "!timeout -> re-wait failed");
- VTCP_close(&vbc->fd);
- VTAILQ_REMOVE(&tp->connlist, vbc, list);
- tp->n_conn--;
- FREE_OBJ(vbc);
- }
+ VTAILQ_INSERT_HEAD(&tp->connlist, vbc, list);
}
break;
+ case VBC_STATE_AVAIL:
+ VTCP_close(&vbc->fd);
+ VTAILQ_REMOVE(&tp->connlist, vbc, list);
+ tp->n_conn--;
+ FREE_OBJ(vbc);
+ break;
case VBC_STATE_USED:
- VSL(SLT_Debug, 0, "------> Handler used");
vbc->in_waiter = 0;
+ vbc->have_been_in_waiter = 1;
break;
case VBC_STATE_CLEANUP:
- VSL(SLT_Debug, 0, "------> Handler cleanup");
VTCP_close(&vbc->fd);
tp->n_kill--;
VTAILQ_REMOVE(&tp->killlist, vbc, list);
- FREE_OBJ(vbc);
+ memset(vbc, 0x11, sizeof *vbc);
+ free(vbc);
break;
default:
WRONG("Wrong vbc state");
@@ -223,7 +219,8 @@ VBT_Rel(struct tcp_pool **tpp)
tp->n_kill++;
} else {
VTCP_close(&vbc->fd);
- FREE_OBJ(vbc);
+ memset(vbc, 0x22, sizeof *vbc);
+ free(vbc);
}
}
while (tp->n_kill) {
@@ -298,18 +295,23 @@ VBT_Recycle(struct tcp_pool *tp, struct vbc **vbcp)
vbc->waited->ptr = vbc;
vbc->waited->fd = vbc->fd;
vbc->waited->idle = VTIM_real();
+ vbc->state = VBC_STATE_AVAIL;
VSL(SLT_Debug, 0, "------> Recycle fd %d Wait_Enter", vbc->fd);
if (Wait_Enter(tp->waiter, vbc->waited)) {
VTCP_close(&vbc->fd);
- FREE_OBJ(vbc);
+ memset(vbc, 0x33, sizeof *vbc);
+ free(vbc);
+ vbc = NULL;
+ } else {
+ VTAILQ_INSERT_HEAD(&tp->connlist, vbc, list);
}
i = 1;
+ } else {
+ vbc->state = VBC_STATE_STOLEN;
+ VTAILQ_INSERT_TAIL(&tp->connlist, vbc, list);
}
if (vbc != NULL) {
- vbc->state = VBC_STATE_AVAIL;
- vbc->stolen = 1;
- VTAILQ_INSERT_HEAD(&tp->connlist, vbc, list);
tp->n_conn++;
vbc->recycled = 1;
}
@@ -360,7 +362,8 @@ VBT_Close(struct tcp_pool *tp, struct vbc **vbcp)
tp->n_kill++;
} else {
VTCP_close(&vbc->fd);
- FREE_OBJ(vbc);
+ memset(vbc, 0x44, sizeof *vbc);
+ free(vbc);
}
Lck_Unlock(&tp->mtx);
}
@@ -381,8 +384,10 @@ VBT_Get(struct tcp_pool *tp, double tmo)
if (vbc != NULL) {
CHECK_OBJ_NOTNULL(vbc, VBC_MAGIC);
- assert(vbc->state == VBC_STATE_AVAIL);
- VSL(SLT_Debug, 0, "------> Steal fd %d", vbc->fd);
+ VSL(SLT_Debug, 0, "------> Steal fd %d state 0x%x",
+ vbc->fd, vbc->state);
+ assert(vbc->state == VBC_STATE_AVAIL ||
+ vbc->state == VBC_STATE_STOLEN);
VTAILQ_REMOVE(&tp->connlist, vbc, list);
tp->n_conn--;
More information about the varnish-commit
mailing list