Commit 32aaa009 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Reverse the TCP(|UDS) and Connection pool layers.

Now the TCP|UDS simply returns a conn_pool, which then becomes
the primary handle.
parent 58064f34
......@@ -155,7 +155,7 @@ vbe_dir_getfd(VRT_CTX, struct worker *wrk, struct backend *bp,
bo->htc->doclose = SC_NULL;
FIND_TMO(connect_timeout, tmod, bo, bp);
pfd = VTP_Get(bp->tcp_pool, tmod, wrk, force_fresh, &err);
pfd = VCP_Get(bp->conn_pool, tmod, wrk, force_fresh, &err);
if (pfd == NULL) {
VBE_Connect_Error(bp->vsc, err);
VSLb(bo->vsl, SLT_FetchError,
......@@ -188,7 +188,7 @@ vbe_dir_getfd(VRT_CTX, struct worker *wrk, struct backend *bp,
// account as if connect failed - good idea?
VSC_C_main->backend_fail++;
bo->htc = NULL;
VTP_Close(&pfd);
VCP_Close(&pfd);
AZ(pfd);
Lck_Lock(&bp->mtx);
bp->n_conn--;
......@@ -237,7 +237,7 @@ vbe_dir_finish(VRT_CTX, VCL_BACKEND d)
if (bo->htc->doclose != SC_NULL || bp->proxy_header != 0) {
VSLb(bo->vsl, SLT_BackendClose, "%d %s close", *PFD_Fd(pfd),
VRT_BACKEND_string(bp->director));
VTP_Close(&pfd);
VCP_Close(&pfd);
AZ(pfd);
Lck_Lock(&bp->mtx);
} else {
......@@ -246,7 +246,7 @@ vbe_dir_finish(VRT_CTX, VCL_BACKEND d)
VRT_BACKEND_string(bp->director));
Lck_Lock(&bp->mtx);
VSC_C_main->backend_recycle++;
VTP_Recycle(bo->wrk, &pfd);
VCP_Recycle(bo->wrk, &pfd);
}
assert(bp->n_conn > 0);
bp->n_conn--;
......@@ -295,7 +295,7 @@ vbe_dir_gethdrs(VRT_CTX, VCL_BACKEND d)
&bo->acct.bereq_bodybytes);
if (PFD_State(pfd) != PFD_STATE_USED) {
if (VTP_Wait(wrk, pfd, VTIM_real() +
if (VCP_Wait(wrk, pfd, VTIM_real() +
bo->htc->first_byte_timeout) != 0) {
bo->htc->doclose = SC_RX_TIMEOUT;
VSLb(bo->vsl, SLT_FetchError,
......@@ -341,7 +341,7 @@ vbe_dir_getip(VRT_CTX, VCL_BACKEND d)
CHECK_OBJ_NOTNULL(ctx->bo->htc, HTTP_CONN_MAGIC);
pfd = ctx->bo->htc->priv;
return (VTP_GetIp(pfd));
return (VCP_GetIp(pfd));
}
/*--------------------------------------------------------------------*/
......@@ -430,7 +430,7 @@ vbe_free(struct backend *be)
else
VTAILQ_REMOVE(&backends, be, list);
VSC_C_main->n_backend--;
VTP_Rel(&be->tcp_pool);
VCP_Rel(&be->conn_pool);
Lck_Unlock(&backends_mtx);
#define DA(x) do { if (be->x != NULL) free(be->x); } while (0)
......@@ -462,7 +462,7 @@ vbe_panic(const struct director *d, struct vsb *vsb)
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
VTP_Panic(vsb, bp->tcp_pool);
VCP_Panic(vsb, bp->conn_pool);
VSB_printf(vsb, "hosthdr = %s,\n", bp->hosthdr);
VSB_printf(vsb, "n_conn = %u,\n", bp->n_conn);
}
......@@ -611,15 +611,15 @@ VRT_new_backend_clustered(VRT_CTX, struct vsmw_cluster *vc,
if (! vcl->temp->is_warm)
VRT_VSC_Hide(be->vsc_seg);
be->tcp_pool = VTP_Ref(vep, vbe_proto_ident);
AN(be->tcp_pool);
be->conn_pool = VTP_Ref(vep, vbe_proto_ident);
AN(be->conn_pool);
vbp = vrt->probe;
if (vbp == NULL)
vbp = VCL_DefaultProbe(vcl);
if (vbp != NULL) {
VBP_Insert(be, vbp, be->tcp_pool);
VBP_Insert(be, vbp, be->conn_pool);
m = vbe_methods;
} else {
be->sick = 0;
......
......@@ -42,7 +42,7 @@
struct vbp_target;
struct vrt_ctx;
struct vrt_backend_probe;
struct tcp_pool;
struct conn_pool;
/*--------------------------------------------------------------------
* An instance of a backend from a VCL program.
......@@ -67,7 +67,7 @@ struct backend {
struct vsc_seg *vsc_seg;
struct VSC_vbe *vsc;
struct tcp_pool *tcp_pool;
struct conn_pool *conn_pool;
VCL_BACKEND director;
......@@ -84,7 +84,7 @@ void VBE_SetHappy(const struct backend *, uint64_t);
/* cache_backend_probe.c */
void VBP_Update_Backend(struct vbp_target *vt);
void VBP_Insert(struct backend *b, struct vrt_backend_probe const *p,
struct tcp_pool *);
struct conn_pool *);
void VBP_Remove(struct backend *b);
void VBP_Control(const struct backend *b, int stop);
void VBP_Status(struct vsb *, const struct backend *, int details, int json);
......
......@@ -64,7 +64,7 @@ struct vbp_target {
VRT_BACKEND_PROBE_FIELDS()
struct backend *backend;
struct tcp_pool *tcp_pool;
struct conn_pool *conn_pool;
char *req;
int req_len;
......@@ -103,7 +103,7 @@ vbp_delete(struct vbp_target *vt)
#define DN(x) /**/
VRT_BACKEND_PROBE_HANDLE();
#undef DN
VTP_Rel(&vt->tcp_pool);
VCP_Rel(&vt->conn_pool);
free(vt->req);
FREE_OBJ(vt);
}
......@@ -285,7 +285,7 @@ vbp_poke(struct vbp_target *vt)
t_start = t_now = VTIM_real();
t_end = t_start + vt->timeout;
s = VTP_Open(vt->tcp_pool, t_end - t_now, &sa, &err);
s = VCP_Open(vt->conn_pool, t_end - t_now, &sa, &err);
if (s < 0) {
bprintf(vt->resp_buf, "Open error %d (%s)", err, vstrerror(err));
Lck_Lock(&vbp_mtx);
......@@ -673,7 +673,7 @@ VBP_Control(const struct backend *be, int enable)
void
VBP_Insert(struct backend *b, const struct vrt_backend_probe *vp,
struct tcp_pool *tp)
struct conn_pool *tp)
{
struct vbp_target *vt;
......@@ -685,8 +685,8 @@ VBP_Insert(struct backend *b, const struct vrt_backend_probe *vp,
ALLOC_OBJ(vt, VBP_TARGET_MAGIC);
XXXAN(vt);
vt->tcp_pool = tp;
VTP_AddRef(vt->tcp_pool);
vt->conn_pool = tp;
VCP_AddRef(vt->conn_pool);
vt->backend = b;
b->probe = vt;
......
......@@ -377,7 +377,7 @@ child_main(int sigmagic, size_t altstksz)
HTTP_Init();
VBO_Init();
VTP_Init();
VCP_Init();
VBP_Init();
VDI_Init();
VBE_InitCfg();
......
......@@ -27,7 +27,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* TCP connection pools.
* (TCP|UDS) connection pools.
*
*/
......@@ -216,7 +216,7 @@ VCP_Ref(const uint8_t *ident)
/*--------------------------------------------------------------------
*/
static void *
static struct conn_pool *
VCP_New(struct conn_pool *cp, uint8_t ident[VSHA256_DIGEST_LENGTH],
void *priv, const struct cp_methods *cm)
{
......@@ -240,14 +240,13 @@ VCP_New(struct conn_pool *cp, uint8_t ident[VSHA256_DIGEST_LENGTH],
VTAILQ_INSERT_HEAD(&conn_pools, cp, list);
Lck_Unlock(&conn_pools_mtx);
return (priv);
return (cp);
}
/*--------------------------------------------------------------------
*/
static void
void
VCP_AddRef(struct conn_pool *cp)
{
CHECK_OBJ_NOTNULL(cp, CONN_POOL_MAGIC);
......@@ -262,12 +261,13 @@ VCP_AddRef(struct conn_pool *cp)
* Release Conn pool, destroy if last reference.
*/
static void
VCP_Rel(struct conn_pool *cp)
void
VCP_Rel(struct conn_pool **cpp)
{
struct conn_pool *cp;
struct pfd *pfd, *pfd2;
CHECK_OBJ_NOTNULL(cp, CONN_POOL_MAGIC);
TAKE_OBJ_NOTNULL(cp, cpp, CONN_POOL_MAGIC);
Lck_Lock(&conn_pools_mtx);
assert(cp->refcnt > 0);
......@@ -305,7 +305,7 @@ VCP_Rel(struct conn_pool *cp)
* Recycle a connection.
*/
static void
void
VCP_Recycle(const struct worker *wrk, struct pfd **pfdp)
{
struct pfd *pfd;
......@@ -366,7 +366,7 @@ VCP_Recycle(const struct worker *wrk, struct pfd **pfdp)
* Open a new connection from pool.
*/
static int
int
VCP_Open(struct conn_pool *cp, vtim_dur tmo, VCL_IP *ap, int *err)
{
int r;
......@@ -440,7 +440,7 @@ VCP_Open(struct conn_pool *cp, vtim_dur tmo, VCL_IP *ap, int *err)
* Close a connection.
*/
static void
void
VCP_Close(struct pfd **pfdp)
{
struct pfd *pfd;
......@@ -474,7 +474,7 @@ VCP_Close(struct pfd **pfdp)
* Get a connection, possibly recycled
*/
static struct pfd *
struct pfd *
VCP_Get(struct conn_pool *cp, vtim_dur tmo, struct worker *wrk,
unsigned force_fresh, int *err)
{
......@@ -526,7 +526,7 @@ VCP_Get(struct conn_pool *cp, vtim_dur tmo, struct worker *wrk,
/*--------------------------------------------------------------------
*/
static int
int
VCP_Wait(struct worker *wrk, struct pfd *pfd, vtim_real tmo)
{
struct conn_pool *cp;
......@@ -558,6 +558,40 @@ VCP_Wait(struct worker *wrk, struct pfd *pfd, vtim_real tmo)
/*--------------------------------------------------------------------
*/
VCL_IP
VCP_GetIp(struct pfd *pfd)
{
CHECK_OBJ_NOTNULL(pfd, PFD_MAGIC);
return (pfd->addr);
}
/*--------------------------------------------------------------------*/
void
VCP_Panic(struct vsb *vsb, struct conn_pool *cp)
{
if (PAN_dump_struct(vsb, cp, CONN_POOL_MAGIC, "conn_pool"))
return;
VSB_printf(vsb, "ident = ");
VSB_quote(vsb, cp->ident, VSHA256_DIGEST_LENGTH, VSB_QUOTE_HEX);
VSB_printf(vsb, ",\n");
cp->methods->panic(vsb, cp->priv);
VSB_indent(vsb, -2);
VSB_cat(vsb, "},\n");
}
/*--------------------------------------------------------------------*/
void
VCP_Init(void)
{
Lck_New(&conn_pools_mtx, lck_tcp_pool);
}
/**********************************************************************/
struct tcp_pool {
unsigned magic;
#define TCP_POOL_MAGIC 0x28b0e42a
......@@ -643,25 +677,6 @@ vtp_panic(struct vsb *vsb, const void *priv)
/*--------------------------------------------------------------------*/
void
VTP_Panic(struct vsb *vsb, struct tcp_pool *tp)
{
struct conn_pool *cp;
cp = tp->cp;
if (PAN_dump_struct(vsb, cp, CONN_POOL_MAGIC, "conn_pool"))
return;
VSB_printf(vsb, "ident = ");
VSB_quote(vsb, cp->ident, VSHA256_DIGEST_LENGTH, VSB_QUOTE_HEX);
VSB_printf(vsb, ",\n");
cp->methods->panic(vsb, cp->priv);
VSB_indent(vsb, -2);
VSB_cat(vsb, "},\n");
}
/*--------------------------------------------------------------------*/
static void v_matchproto_(cp_close_f)
vtp_close(struct pfd *pfd)
{
......@@ -740,7 +755,7 @@ static const struct cp_methods vus_methods = {
* it doesn't exist already.
*/
struct tcp_pool *
struct conn_pool *
VTP_Ref(const struct vrt_endpoint *vep, const char *ident)
{
struct tcp_pool *tp;
......@@ -775,7 +790,7 @@ VTP_Ref(const struct vrt_endpoint *vep, const char *ident)
cp = VCP_Ref(digest);
if (cp != NULL)
return (cp->priv);
return (cp);
/*
* this is racy - we could end up with additional pools on the same id
......@@ -797,100 +812,3 @@ VTP_Ref(const struct vrt_endpoint *vep, const char *ident)
}
return (VCP_New(tp->cp, digest, tp, methods));
}
/*--------------------------------------------------------------------
* Add a reference to a tcp_pool
*/
void
VTP_AddRef(struct tcp_pool *tp)
{
CHECK_OBJ_NOTNULL(tp, TCP_POOL_MAGIC);
VCP_AddRef(tp->cp);
}
/*--------------------------------------------------------------------
* Release TCP pool, destroy if last reference.
*/
void
VTP_Rel(struct tcp_pool **tpp)
{
struct tcp_pool *tp;
TAKE_OBJ_NOTNULL(tp, tpp, TCP_POOL_MAGIC);
VCP_Rel(tp->cp);
}
/*--------------------------------------------------------------------
* Open a new connection from pool.
*/
int
VTP_Open(struct tcp_pool *tp, vtim_dur tmo, VCL_IP *ap, int *err)
{
return (VCP_Open(tp->cp, tmo, ap, err));
}
/*--------------------------------------------------------------------
* Recycle a connection.
*/
void
VTP_Recycle(const struct worker *wrk, struct pfd **pfdp)
{
VCP_Recycle(wrk, pfdp);
}
/*--------------------------------------------------------------------
* Close a connection.
*/
void
VTP_Close(struct pfd **pfdp)
{
VCP_Close(pfdp);
}
/*--------------------------------------------------------------------
* Get a connection
*/
struct pfd *
VTP_Get(struct tcp_pool *tp, vtim_dur tmo, struct worker *wrk,
unsigned force_fresh, int *err)
{
return (VCP_Get(tp->cp, tmo, wrk, force_fresh, err));
}
/*--------------------------------------------------------------------
*/
int
VTP_Wait(struct worker *wrk, struct pfd *pfd, vtim_real tmo)
{
return (VCP_Wait(wrk, pfd, tmo));
}
/*--------------------------------------------------------------------
*/
VCL_IP
VTP_GetIp(struct pfd *pfd)
{
CHECK_OBJ_NOTNULL(pfd, PFD_MAGIC);
return (pfd->addr);
}
/*--------------------------------------------------------------------*/
void
VTP_Init(void)
{
Lck_New(&conn_pools_mtx, lck_tcp_pool);
}
......@@ -28,11 +28,11 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Outgoing TCP connection pools
* Outgoing TCP|UDS connection pools
*
*/
struct tcp_pool;
struct conn_pool;
struct pfd;
#define PFD_STATE_AVAIL (1<<0)
#define PFD_STATE_USED (1<<1)
......@@ -48,13 +48,12 @@ void PFD_LocalName(const struct pfd *, char *, unsigned, char *, unsigned);
void PFD_RemoteName(const struct pfd *, char *, unsigned, char *, unsigned);
/*---------------------------------------------------------------------
* Prototypes
*/
struct VSC_vbe;
struct tcp_pool *VTP_Ref(const struct vrt_endpoint *, const char *ident);
struct conn_pool *VTP_Ref(const struct vrt_endpoint *, const char *ident);
/*
* Get a reference to a TCP pool. Either one or both of ipv4 or
* ipv6 arg must be non-NULL, or uds must be non-NULL. If recycling
......@@ -62,47 +61,47 @@ struct tcp_pool *VTP_Ref(const struct vrt_endpoint *, const char *ident);
* other pools with same {ipv4, ipv6, uds}.
*/
void VTP_AddRef(struct tcp_pool *);
void VCP_AddRef(struct conn_pool *);
/*
* Get another reference to an already referenced TCP pool.
*/
void VTP_Rel(struct tcp_pool **);
void VCP_Rel(struct conn_pool **);
/*
* Release reference to a TCP pool. When last reference is released
* the pool is destroyed and all cached connections closed.
*/
int VTP_Open(struct tcp_pool *, vtim_dur tmo, VCL_IP *, int*);
int VCP_Open(struct conn_pool *, vtim_dur tmo, VCL_IP *, int*);
/*
* Open a new connection and return the address used.
* errno will be returned in the last argument.
*/
void VTP_Close(struct pfd **);
void VCP_Close(struct pfd **);
/*
* Close a connection.
*/
void VTP_Recycle(const struct worker *, struct pfd **);
void VCP_Recycle(const struct worker *, struct pfd **);
/*
* Recycle an open connection.
*/
struct pfd *VTP_Get(struct tcp_pool *, vtim_dur tmo, struct worker *,
struct pfd *VCP_Get(struct conn_pool *, vtim_dur tmo, struct worker *,
unsigned force_fresh, int *err);
/*
* Get a (possibly) recycled connection.
* errno will be stored in err
*/
int VTP_Wait(struct worker *, struct pfd *, vtim_real tmo);
int VCP_Wait(struct worker *, struct pfd *, vtim_real tmo);
/*
* If the connection was recycled (state != VTP_STATE_USED) call this
* function before attempting to receive on the connection.
*/
void VTP_Panic(struct vsb *, struct tcp_pool *);
void VCP_Panic(struct vsb *, struct conn_pool *);
VCL_IP VTP_GetIp(struct pfd *);
VCL_IP VCP_GetIp(struct pfd *);
......@@ -145,8 +145,8 @@ void VCA_Shutdown(void);
void VBE_InitCfg(void);
void VBE_Poll(void);
/* cache_backend_tcp.c */
void VTP_Init(void);
/* cache_tcp_pool.c */
void VCP_Init(void);
/* cache_backend_poll.c */
void VBP_Init(void);
......
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