From e66d30b53bf747e7da27bbf99bd7257fb47bf98f Mon Sep 17 00:00:00 2001 From: phk Date: Wed, 12 Apr 2006 08:58:54 +0000 Subject: [PATCH] Implement the three function VCL model in the compiler. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@139 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache.h | 4 -- varnish-cache/bin/varnishd/cache_pool.c | 2 +- varnish-cache/bin/varnishd/cache_vcl.c | 4 ++ varnish-cache/bin/varnishd/varnishd.c | 22 +++++--- varnish-cache/include/vcl_lang.h | 21 ++++++-- varnish-cache/lib/libvcl/vcl_compile.c | 47 ++++++++++++---- varnish-cache/lib/libvcl/vcl_fixed_token.c | 29 ++++++++-- .../lib/libvcl/vcl_gen_fixed_token.tcl | 1 + varnish-cache/lib/libvcl/vcl_token_defs.h | 53 ++++++++++--------- 9 files changed, 124 insertions(+), 59 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache.h b/varnish-cache/bin/varnishd/cache.h index c4a16c01..58ed922a 100644 --- a/varnish-cache/bin/varnishd/cache.h +++ b/varnish-cache/bin/varnishd/cache.h @@ -16,10 +16,6 @@ struct worker; #endif /* Hashing -----------------------------------------------------------*/ -struct object { /* XXX: this goes elsewhere in due time */ - unsigned char hash[16]; - unsigned refcnt; -}; typedef void hash_init_f(void); typedef struct object *hash_lookup_f(unsigned char *key, struct object *nobj); diff --git a/varnish-cache/bin/varnishd/cache_pool.c b/varnish-cache/bin/varnishd/cache_pool.c index 7ff01b4d..678b9f98 100644 --- a/varnish-cache/bin/varnishd/cache_pool.c +++ b/varnish-cache/bin/varnishd/cache_pool.c @@ -48,7 +48,7 @@ CacheWorker(void *priv) sp->backend = sp->vcl->default_backend; /* Call the VCL program */ - sp->vcl->main_func(sp); + sp->vcl->recv_func(sp); printf("Handling: %d\n", sp->handling); switch(sp->handling) { diff --git a/varnish-cache/bin/varnishd/cache_vcl.c b/varnish-cache/bin/varnishd/cache_vcl.c index fdd5d3f1..bb8ca235 100644 --- a/varnish-cache/bin/varnishd/cache_vcl.c +++ b/varnish-cache/bin/varnishd/cache_vcl.c @@ -196,3 +196,7 @@ VCL_pass(VCL_FARGS) sess->handling = HND_Pass; sess->done++; } + +void VCL_insert(VCL_FARGS) { } +void VCL_fetch(VCL_FARGS) { } +void VCL_error(VCL_FARGS, unsigned err, const char *str) { } diff --git a/varnish-cache/bin/varnishd/varnishd.c b/varnish-cache/bin/varnishd/varnishd.c index 5ad81825..17d689be 100644 --- a/varnish-cache/bin/varnishd/varnishd.c +++ b/varnish-cache/bin/varnishd/varnishd.c @@ -71,20 +71,26 @@ vcl_default(const char *bflag) "backend default {\n" " set backend.host = \"%s\";\n" "}\n" - "sub main {\n" - " pass;\n" -#if 0 + "sub vcl_recv {\n" " if (req.request != \"GET\" && req.request != \"HEAD\") {\n" " pass;\n" " }\n" - " lookup;\n" + "}\n" + "\n" + "sub vcl_lookup {\n" " if (!obj.valid) {\n" " fetch;\n" - " if (obj.cacheable) {\n" - " insert;\n" - " }\n" " }\n" -#endif + " if (!obj.cacheable) {\n" + " pass;\n" + " }\n" + "}\n" + "\n" + "sub vcl_fetch {\n" + " if (!obj.valid) {\n" + " error;\n" + " }\n" + " insert;\n" "}\n" "", bflag); assert(buf != NULL); diff --git a/varnish-cache/include/vcl_lang.h b/varnish-cache/include/vcl_lang.h index 8b63c08f..9b919b16 100644 --- a/varnish-cache/include/vcl_lang.h +++ b/varnish-cache/include/vcl_lang.h @@ -40,6 +40,13 @@ struct httphdr { unsigned nuhdr; }; +struct object { + unsigned char hash[16]; + unsigned refcnt; + unsigned valid; + unsigned cacheable; +}; + struct sess { int fd; @@ -68,6 +75,7 @@ struct sess { sesscb_f *sesscb; struct backend *backend; + struct object *obj; struct VCL_conf *vcl; /* Various internal stuff */ @@ -93,14 +101,15 @@ struct backend { #define VCL_PASS_ARGS sess void VCL_count(unsigned); -void VCL_no_cache(); -void VCL_no_new_cache(); +void VCL_no_cache(VCL_FARGS); +void VCL_no_new_cache(VCL_FARGS); int ip_match(unsigned, struct vcl_acl *); int string_match(const char *, const char *); int VCL_rewrite(const char *, const char *); -int VCL_error(unsigned, const char *); +void VCL_error(VCL_FARGS, unsigned, const char *); void VCL_pass(VCL_FARGS); -int VCL_fetch(void); +void VCL_fetch(VCL_FARGS); +void VCL_insert(VCL_FARGS); int VCL_switch_config(const char *); typedef void vcl_init_f(void); @@ -110,7 +119,9 @@ struct VCL_conf { unsigned magic; #define VCL_CONF_MAGIC 0x7406c509 /* from /dev/random */ vcl_init_f *init_func; - vcl_func_f *main_func; + vcl_func_f *recv_func; + vcl_func_f *lookup_func; + vcl_func_f *fetch_func; struct backend *default_backend; struct vcl_ref *ref; unsigned nref; diff --git a/varnish-cache/lib/libvcl/vcl_compile.c b/varnish-cache/lib/libvcl/vcl_compile.c index f10301ab..8ec8cf25 100644 --- a/varnish-cache/lib/libvcl/vcl_compile.c +++ b/varnish-cache/lib/libvcl/vcl_compile.c @@ -121,6 +121,9 @@ static struct var be_vars[] = { static struct var vars[] = { + { "req.request", STRING, 0, "sess->http.req" }, + { "obj.valid", BOOL, 0, "sess->obj->valid" }, + { "obj.cacheable", BOOL, 0, "sess->obj->cacheable" }, #if 0 { "req.ttlfactor", FLOAT, 0, "req->ttlfactor" }, { "req.url.host", STRING, 0, "req->url.host" }, @@ -659,6 +662,15 @@ Cond_String(struct var *vp, struct tokenlist *tl) tl->t->e - tl->t->b, tl->t->b); NextToken(tl); break; + case T_NEQ: + I(tl); sbuf_printf(tl->fc, "strcmp(%s, ", vp->cname); + NextToken(tl); + ExpectErr(tl, CSTR); + sbuf_printf(tl->fc, "%*.*s)\n", + tl->t->e - tl->t->b, + tl->t->e - tl->t->b, tl->t->b); + NextToken(tl); + break; default: sbuf_printf(tl->sb, "Illegal condition "); ErrToken(tl, tl->t); @@ -874,29 +886,41 @@ Action(struct tokenlist *tl) switch (at->tok) { case T_NO_NEW_CACHE: I(tl); - sbuf_printf(tl->fc, "VCL_no_new_cache();\n"); + sbuf_printf(tl->fc, "VCL_no_new_cache(VCL_PASS_ARGS);\n"); return; case T_NO_CACHE: I(tl); - sbuf_printf(tl->fc, "VCL_no_cache();\n"); + sbuf_printf(tl->fc, "VCL_no_cache(VCL_PASS_ARGS);\n"); return; case T_FINISH: - I(tl); - sbuf_printf(tl->fc, "return;\n"); + I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n"); + I(tl); sbuf_printf(tl->fc, "return;\n"); return; case T_PASS: I(tl); sbuf_printf(tl->fc, "VCL_pass(VCL_PASS_ARGS);\n"); - sbuf_printf(tl->fc, "return;\n"); + I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n"); + I(tl); sbuf_printf(tl->fc, "return;\n"); return; case T_FETCH: I(tl); - sbuf_printf(tl->fc, "VCL_fetch();\n"); + sbuf_printf(tl->fc, "VCL_fetch(VCL_PASS_ARGS);\n"); + I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n"); + I(tl); sbuf_printf(tl->fc, "return;\n"); + return; + case T_INSERT: + I(tl); + sbuf_printf(tl->fc, "VCL_insert(VCL_PASS_ARGS);\n"); + I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n"); + I(tl); sbuf_printf(tl->fc, "return;\n"); return; case T_ERROR: - a = UintVal(tl); + if (tl->t->tok == CNUM) + a = UintVal(tl); + else + a = 0; I(tl); - sbuf_printf(tl->fc, "VCL_error(%u, ", a); + sbuf_printf(tl->fc, "VCL_error(VCL_PASS_ARGS, %u, ", a); if (tl->t->tok == CSTR) { sbuf_printf(tl->fc, "%*.*s);\n", tl->t->e - tl->t->b, @@ -904,6 +928,8 @@ Action(struct tokenlist *tl) NextToken(tl); } else sbuf_printf(tl->fc, "(const char *)0);\n"); + I(tl); sbuf_printf(tl->fc, "sess->done = 1;\n"); + I(tl); sbuf_printf(tl->fc, "return;\n"); return; case T_SWITCH_CONFIG: ExpectErr(tl, ID); @@ -1537,8 +1563,9 @@ EmitStruct(struct tokenlist *tl) "\t.magic = VCL_CONF_MAGIC,\n"); sbuf_printf(tl->fc, "\t.init_func = VCL_Init,\n"); - sbuf_printf(tl->fc, - "\t.main_func = VCL_function_main,\n"); + sbuf_printf(tl->fc, "\t.recv_func = VCL_function_vcl_recv,\n"); + sbuf_printf(tl->fc, "\t.lookup_func = VCL_function_vcl_lookup,\n"); + sbuf_printf(tl->fc, "\t.fetch_func = VCL_function_vcl_fetch,\n"); sbuf_printf(tl->fc, "\t.default_backend = &VCL_backend_default,\n"); sbuf_printf(tl->fc, diff --git a/varnish-cache/lib/libvcl/vcl_fixed_token.c b/varnish-cache/lib/libvcl/vcl_fixed_token.c index ca30d1ab..792a7be6 100644 --- a/varnish-cache/lib/libvcl/vcl_fixed_token.c +++ b/varnish-cache/lib/libvcl/vcl_fixed_token.c @@ -218,6 +218,12 @@ vcl_fixed_token(const char *p, const char **q) } return (0); case 'i': + if (p[0] == 'i' && p[1] == 'n' && p[2] == 's' && + p[3] == 'e' && p[4] == 'r' && p[5] == 't' + && !isvar(p[6])) { + *q = p + 6; + return (T_INSERT); + } if (p[0] == 'i' && p[1] == 'f' && !isvar(p[2])) { *q = p + 2; return (T_IF); @@ -360,6 +366,7 @@ vcl_init_tnames(void) vcl_tnames[T_IF] = "if"; vcl_tnames[T_INC] = "++"; vcl_tnames[T_INCR] = "+="; + vcl_tnames[T_INSERT] = "insert"; vcl_tnames[T_LEQ] = "<="; vcl_tnames[T_MUL] = "*="; vcl_tnames[T_NEQ] = "!="; @@ -464,12 +471,20 @@ vcl_output_lang_h(FILE *f) fputs("HTTPH(\"Expires\", H_Expires, 2, 1, 0, 0, 0)\n", f); fputs("HTTPH(\"Location\", H_Location, 2, 1, 0, 0, 0)\n", f); fputs("HTTPH(\"Content-Encoding\", H_Content_Encoding, 2, 1, 0, 0, 0)\n", f); + fputs("HTTPH(\"ETag:\", H_ETag, 2, 1, 0, 0, 0)\n", f); fputs("\n", f); fputs("#undef HTTPH\n", f); fputs(" const char *uhdr[VCA_UNKNOWNHDR];\n", f); fputs(" unsigned nuhdr;\n", f); fputs("};\n", f); fputs("\n", f); + fputs("struct object { \n", f); + fputs(" unsigned char hash[16];\n", f); + fputs(" unsigned refcnt;\n", f); + fputs(" unsigned valid;\n", f); + fputs(" unsigned cacheable;\n", f); + fputs("};\n", f); + fputs("\n", f); fputs("struct sess {\n", f); fputs(" int fd;\n", f); fputs("\n", f); @@ -498,6 +513,7 @@ vcl_output_lang_h(FILE *f) fputs(" sesscb_f *sesscb;\n", f); fputs("\n", f); fputs(" struct backend *backend;\n", f); + fputs(" struct object *obj;\n", f); fputs(" struct VCL_conf *vcl;\n", f); fputs("\n", f); fputs(" /* Various internal stuff */\n", f); @@ -523,14 +539,15 @@ vcl_output_lang_h(FILE *f) fputs("#define VCL_PASS_ARGS sess\n", f); fputs("\n", f); fputs("void VCL_count(unsigned);\n", f); - fputs("void VCL_no_cache();\n", f); - fputs("void VCL_no_new_cache();\n", f); + fputs("void VCL_no_cache(VCL_FARGS);\n", f); + fputs("void VCL_no_new_cache(VCL_FARGS);\n", f); fputs("int ip_match(unsigned, struct vcl_acl *);\n", f); fputs("int string_match(const char *, const char *);\n", f); fputs("int VCL_rewrite(const char *, const char *);\n", f); - fputs("int VCL_error(unsigned, const char *);\n", f); + fputs("void VCL_error(VCL_FARGS, unsigned, const char *);\n", f); fputs("void VCL_pass(VCL_FARGS);\n", f); - fputs("int VCL_fetch(void);\n", f); + fputs("void VCL_fetch(VCL_FARGS);\n", f); + fputs("void VCL_insert(VCL_FARGS);\n", f); fputs("int VCL_switch_config(const char *);\n", f); fputs("\n", f); fputs("typedef void vcl_init_f(void);\n", f); @@ -540,7 +557,9 @@ vcl_output_lang_h(FILE *f) fputs(" unsigned magic;\n", f); fputs("#define VCL_CONF_MAGIC 0x7406c509 /* from /dev/random */\n", f); fputs(" vcl_init_f *init_func;\n", f); - fputs(" vcl_func_f *main_func;\n", f); + fputs(" vcl_func_f *recv_func;\n", f); + fputs(" vcl_func_f *lookup_func;\n", f); + fputs(" vcl_func_f *fetch_func;\n", f); fputs(" struct backend *default_backend;\n", f); fputs(" struct vcl_ref *ref;\n", f); fputs(" unsigned nref;\n", f); diff --git a/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl b/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl index c10cbad5..7ebc242c 100755 --- a/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl +++ b/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl @@ -15,6 +15,7 @@ set keywords { error pass fetch + insert call no_cache no_new_cache diff --git a/varnish-cache/lib/libvcl/vcl_token_defs.h b/varnish-cache/lib/libvcl/vcl_token_defs.h index 760f921f..d25a392c 100644 --- a/varnish-cache/lib/libvcl/vcl_token_defs.h +++ b/varnish-cache/lib/libvcl/vcl_token_defs.h @@ -16,29 +16,30 @@ #define T_ERROR 137 #define T_PASS 138 #define T_FETCH 139 -#define T_CALL 140 -#define T_NO_CACHE 141 -#define T_NO_NEW_CACHE 142 -#define T_SET 143 -#define T_REWRITE 144 -#define T_FINISH 145 -#define T_SWITCH_CONFIG 146 -#define T_INC 147 -#define T_DEC 148 -#define T_CAND 149 -#define T_COR 150 -#define T_LEQ 151 -#define T_EQ 152 -#define T_NEQ 153 -#define T_GEQ 154 -#define T_SHR 155 -#define T_SHL 156 -#define T_INCR 157 -#define T_DECR 158 -#define T_MUL 159 -#define T_DIV 160 -#define ID 161 -#define VAR 162 -#define CNUM 163 -#define CSTR 164 -#define EOI 165 +#define T_INSERT 140 +#define T_CALL 141 +#define T_NO_CACHE 142 +#define T_NO_NEW_CACHE 143 +#define T_SET 144 +#define T_REWRITE 145 +#define T_FINISH 146 +#define T_SWITCH_CONFIG 147 +#define T_INC 148 +#define T_DEC 149 +#define T_CAND 150 +#define T_COR 151 +#define T_LEQ 152 +#define T_EQ 153 +#define T_NEQ 154 +#define T_GEQ 155 +#define T_SHR 156 +#define T_SHL 157 +#define T_INCR 158 +#define T_DECR 159 +#define T_MUL 160 +#define T_DIV 161 +#define ID 162 +#define VAR 163 +#define CNUM 164 +#define CSTR 165 +#define EOI 166 -- 2.39.5