static int vbe_TryConnect(const struct busyobj *bo, int pf, const struct suckaddr *sa, const struct vdi_simple *vs) { int s, i, tmo; double tmod; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CHECK_OBJ_NOTNULL(vs, VDI_SIMPLE_MAGIC); s = socket(pf, SOCK_STREAM, 0); if (s < 0) return (s); FIND_TMO(connect_timeout, tmod, bo, vs->vrt); tmo = (int)(tmod * 1000.0); i = VTCP_connect(s, sa, tmo); if (i != 0) { AZ(close(s)); return (-1); } return (s); }
vdi_simple_getfd(const struct director *d, struct busyobj *bo) { struct vdi_simple *vs; struct vbc *vc; CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC); CAST_OBJ_NOTNULL(vs, d->priv, VDI_SIMPLE_MAGIC); vc = vbe_GetVbe(bo, vs); if (vc != NULL) { FIND_TMO(first_byte_timeout, vc->first_byte_timeout, bo, vs->vrt); FIND_TMO(between_bytes_timeout, vc->between_bytes_timeout, bo, vs->vrt); } return (vc); }
static struct vbc * vbe_dir_getfd(struct worker *wrk, struct backend *bp, struct busyobj *bo) { struct vbc *vc; double tmod; char abuf1[VTCP_ADDRBUFSIZE], abuf2[VTCP_ADDRBUFSIZE]; char pbuf1[VTCP_PORTBUFSIZE], pbuf2[VTCP_PORTBUFSIZE]; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CHECK_OBJ_NOTNULL(bp, BACKEND_MAGIC); AN(bp->vsc); if (!VBE_Healthy(bp, NULL)) { // XXX: per backend stats ? VSC_C_main->backend_unhealthy++; return (NULL); } if (bp->max_connections > 0 && bp->n_conn >= bp->max_connections) { // XXX: per backend stats ? VSC_C_main->backend_busy++; return (NULL); } AZ(bo->htc); bo->htc = WS_Alloc(bo->ws, sizeof *bo->htc); if (bo->htc == NULL) /* XXX: counter ? */ return (NULL); bo->htc->doclose = SC_NULL; FIND_TMO(connect_timeout, tmod, bo, bp); vc = VBT_Get(bp->tcp_pool, tmod, bp, wrk); if (vc == NULL) { // XXX: Per backend stats ? VSC_C_main->backend_fail++; bo->htc = NULL; return (NULL); } assert(vc->fd >= 0); AN(vc->addr); Lck_Lock(&bp->mtx); bp->n_conn++; bp->vsc->conn++; bp->vsc->req++; Lck_Unlock(&bp->mtx); if (bp->proxy_header != 0) VPX_Send_Proxy(vc->fd, bp->proxy_header, bo->sp); VTCP_myname(vc->fd, abuf1, sizeof abuf1, pbuf1, sizeof pbuf1); VTCP_hisname(vc->fd, abuf2, sizeof abuf2, pbuf2, sizeof pbuf2); VSLb(bo->vsl, SLT_BackendOpen, "%d %s %s %s %s %s", vc->fd, bp->display_name, abuf2, pbuf2, abuf1, pbuf1); INIT_OBJ(bo->htc, HTTP_CONN_MAGIC); bo->htc->priv = vc; bo->htc->fd = vc->fd; FIND_TMO(first_byte_timeout, bo->htc->first_byte_timeout, bo, bp); FIND_TMO(between_bytes_timeout, bo->htc->between_bytes_timeout, bo, bp); return (vc); }