Commit cc70c580 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Rearrange the backend code a bit.

parent 28bdbcc2
......@@ -678,6 +678,9 @@ void VCA_Shutdown(void);
/* cache_backend_cfg.c */
void VBE_InitCfg(void);
/* cache_backend_poll.c */
void VBP_Init(void);
/* cache_ban.c */
struct ban *BAN_New(void);
int BAN_AddTest(struct ban *, const char *, const char *, const char *);
......
......@@ -36,9 +36,8 @@
#include "cache.h"
#include "cache_backend.h"
#include "cache_director.h"
#include "vcl.h"
#include "cache_backend.h"
#include "vrt.h"
#include "vtcp.h"
......@@ -297,21 +296,16 @@ vbe_dir_http1pipe(const struct director *d, struct req *req, struct busyobj *bo)
/*--------------------------------------------------------------------*/
struct director *
VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
void
VBE_fill_director(struct backend *be, const struct vrt_backend *vrt)
{
struct director *d;
struct backend *be;
ASSERT_CLI();
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC);
CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
AN(ctx->vcl);
be = VBE_AddBackend(ctx, vrt);
AN(be);
ALLOC_OBJ(d, DIRECTOR_MAGIC);
XXXAN(d);
INIT_OBJ(be->director, DIRECTOR_MAGIC);
d = be->director;
d->priv = be;
d->priv2 = vrt;
d->name = "backend";
......@@ -322,65 +316,4 @@ VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
d->getbody = vbe_dir_getbody;
d->getip = vbe_dir_getip;
d->finish = vbe_dir_finish;
if (vrt->probe != NULL)
VBP_Insert(be, vrt->probe, vrt->hosthdr);
return (d);
}
void
VRT_event_vbe(VRT_CTX, enum vcl_event_e ev, const struct director *d,
const struct vrt_backend *vrt)
{
struct backend *be;
ASSERT_CLI();
(void)ev;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
assert(d->priv2 == vrt);
CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
if (ev == VCL_EVENT_WARM) {
be->vsc = VSM_Alloc(sizeof *be->vsc,
VSC_CLASS, VSC_type_vbe, be->display_name);
AN(be->vsc);
}
if (be->probe != NULL && ev == VCL_EVENT_WARM)
VBP_Control(be, 1);
if (be->probe != NULL && ev == VCL_EVENT_COLD)
VBP_Control(be, 0);
if (ev == VCL_EVENT_COLD) {
VSM_Free(be->vsc);
be->vsc = NULL;
}
}
void
VRT_delete_backend(VRT_CTX, struct director **dp)
{
struct director *d;
struct backend *be;
ASSERT_CLI();
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(dp);
AN(*dp);
d = *dp;
*dp = NULL;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
if (be->probe != NULL)
VBP_Remove(be);
VBE_DeleteBackend(be);
free(d->vcl_name);
FREE_OBJ(d);
}
......@@ -82,6 +82,8 @@ struct backend {
struct VSC_C_vbe *vsc;
struct tcp_pool *tcp_pool;
struct director director[1];
};
/* -------------------------------------------------------------------*/
......@@ -105,11 +107,11 @@ struct vbc {
struct worker *wrk;
};
/* cache_backend.c */
void VBE_fill_director(struct backend *be, const struct vrt_backend *vrt);
/* cache_backend_cfg.c */
unsigned VBE_Healthy(const struct backend *b, double *changed);
struct backend *VBE_AddBackend(const struct vrt_ctx *,
const struct vrt_backend *);
void VBE_DeleteBackend(struct backend *);
/* cache_backend_poll.c */
void VBP_Insert(struct backend *b, struct vrt_backend_probe const *p,
......@@ -117,7 +119,6 @@ void VBP_Insert(struct backend *b, struct vrt_backend_probe const *p,
void VBP_Remove(struct backend *b);
void VBP_Control(const struct backend *b, int stop);
void VBP_Status(struct cli *cli, const struct backend *, int details);
void VBP_Init(void);
struct tcp_pool *VBT_Ref(const struct suckaddr *ip4,
const struct suckaddr *ip6);
......
......@@ -38,76 +38,56 @@
#include "cache.h"
#include "cache_director.h"
#include "cache_backend.h"
#include "vcli.h"
#include "vcli_priv.h"
#include "vsa.h"
#include "vcl.h"
#include "vrt.h"
#include "vtim.h"
static VTAILQ_HEAD(, backend) backends = VTAILQ_HEAD_INITIALIZER(backends);
static struct lock backends_mtx;
/*--------------------------------------------------------------------
*/
void
VBE_DeleteBackend(struct backend *b)
{
CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
Lck_Lock(&backends_mtx);
VTAILQ_REMOVE(&backends, b, list);
VSC_C_main->n_backend--;
Lck_Unlock(&backends_mtx);
free(b->ipv4);
free(b->ipv6);
free(b->display_name);
AZ(b->vsc);
VBT_Rel(&b->tcp_pool);
Lck_Delete(&b->mtx);
FREE_OBJ(b);
}
/*--------------------------------------------------------------------
* Create a new director::backend instance.
*/
struct backend *
VBE_AddBackend(const struct vrt_ctx *ctx, const struct vrt_backend *vb)
struct director *
VRT_new_backend(VRT_CTX, const struct vrt_backend *vrt)
{
struct backend *b;
char buf[128];
struct vcl *vcl;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
vcl = ctx->vcl;
AN(vcl);
AN(vb->vcl_name);
assert(vb->ipv4_suckaddr != NULL || vb->ipv6_suckaddr != NULL);
AN(vrt->vcl_name);
assert(vrt->ipv4_suckaddr != NULL || vrt->ipv6_suckaddr != NULL);
/* Create new backend */
ALLOC_OBJ(b, BACKEND_MAGIC);
XXXAN(b);
Lck_New(&b->mtx, lck_backend);
bprintf(buf, "%s.%s", VCL_Name(vcl), vb->vcl_name);
bprintf(buf, "%s.%s", VCL_Name(vcl), vrt->vcl_name);
REPLACE(b->display_name, buf);
b->vcl = vcl;
b->vcl_name = vb->vcl_name;
b->ipv4_addr = vb->ipv4_addr;
b->ipv6_addr = vb->ipv6_addr;
b->port = vb->port;
b->vcl_name = vrt->vcl_name;
b->ipv4_addr = vrt->ipv4_addr;
b->ipv6_addr = vrt->ipv6_addr;
b->port = vrt->port;
b->tcp_pool = VBT_Ref(vb->ipv4_suckaddr, vb->ipv6_suckaddr);
b->tcp_pool = VBT_Ref(vrt->ipv4_suckaddr, vrt->ipv6_suckaddr);
if (vb->ipv4_suckaddr != NULL)
b->ipv4 = VSA_Clone(vb->ipv4_suckaddr);
if (vb->ipv6_suckaddr != NULL)
b->ipv6 = VSA_Clone(vb->ipv6_suckaddr);
if (vrt->ipv4_suckaddr != NULL)
b->ipv4 = VSA_Clone(vrt->ipv4_suckaddr);
if (vrt->ipv6_suckaddr != NULL)
b->ipv6 = VSA_Clone(vrt->ipv6_suckaddr);
assert(b->ipv4 != NULL || b->ipv6 != NULL);
......@@ -119,7 +99,80 @@ VBE_AddBackend(const struct vrt_ctx *ctx, const struct vrt_backend *vb)
VTAILQ_INSERT_TAIL(&backends, b, list);
VSC_C_main->n_backend++;
Lck_Unlock(&backends_mtx);
return (b);
VBE_fill_director(b, vrt);
if (vrt->probe != NULL)
VBP_Insert(b, vrt->probe, vrt->hosthdr);
return (b->director);
}
void
VRT_event_vbe(VRT_CTX, enum vcl_event_e ev, const struct director *d,
const struct vrt_backend *vrt)
{
struct backend *be;
ASSERT_CLI();
(void)ev;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CHECK_OBJ_NOTNULL(vrt, VRT_BACKEND_MAGIC);
assert(d->priv2 == vrt);
CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
if (ev == VCL_EVENT_WARM) {
be->vsc = VSM_Alloc(sizeof *be->vsc,
VSC_CLASS, VSC_type_vbe, be->display_name);
AN(be->vsc);
}
if (be->probe != NULL && ev == VCL_EVENT_WARM)
VBP_Control(be, 1);
if (be->probe != NULL && ev == VCL_EVENT_COLD)
VBP_Control(be, 0);
if (ev == VCL_EVENT_COLD) {
VSM_Free(be->vsc);
be->vsc = NULL;
}
}
void
VRT_delete_backend(VRT_CTX, struct director **dp)
{
struct director *d;
struct backend *be;
ASSERT_CLI();
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(dp);
AN(*dp);
d = *dp;
*dp = NULL;
CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(be, d->priv, BACKEND_MAGIC);
if (be->probe != NULL)
VBP_Remove(be);
free(d->vcl_name);
Lck_Lock(&backends_mtx);
VTAILQ_REMOVE(&backends, be, list);
VSC_C_main->n_backend--;
Lck_Unlock(&backends_mtx);
free(be->ipv4);
free(be->ipv6);
free(be->display_name);
AZ(be->vsc);
VBT_Rel(&be->tcp_pool);
Lck_Delete(&be->mtx);
FREE_OBJ(be);
}
/*---------------------------------------------------------------------
......
......@@ -45,6 +45,7 @@
#include "cache.h"
#include "cache_director.h"
#include "cache_backend.h"
#include "vcli_priv.h"
#include "vrt.h"
......
......@@ -38,6 +38,7 @@
#include "cache.h"
#include "cache_director.h"
#include "cache_backend.h"
#include "cache_pool.h"
#include "vtcp.h"
......
......@@ -33,7 +33,6 @@
#include <stdlib.h>
#include "cache.h"
#include "cache_backend.h"
#include "common/heritage.h"
#include "vcli_priv.h"
......
......@@ -43,6 +43,7 @@
#include "cache_filter.h"
#include "common/heritage.h"
#include "cache_director.h"
#include "cache_backend.h"
#include "storage/storage.h"
#include "vcli_priv.h"
......
......@@ -37,8 +37,8 @@
#include "hash/hash_slinger.h"
#include "cache/cache_backend.h"
#include "cache/cache_director.h"
#include "cache/cache_backend.h"
#include "vcli_priv.h"
#include "vtcp.h"
#include "vtim.h"
......
......@@ -36,8 +36,8 @@
#include "cache/cache.h"
#include "cache/cache_backend.h"
#include "cache/cache_director.h"
#include "cache/cache_backend.h"
#include "vtcp.h"
#include "vtim.h"
......
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