]> err.no Git - varnish/commitdiff
Implement the three function VCL model in the compiler.
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 12 Apr 2006 08:58:54 +0000 (08:58 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Wed, 12 Apr 2006 08:58:54 +0000 (08:58 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@139 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_pool.c
varnish-cache/bin/varnishd/cache_vcl.c
varnish-cache/bin/varnishd/varnishd.c
varnish-cache/include/vcl_lang.h
varnish-cache/lib/libvcl/vcl_compile.c
varnish-cache/lib/libvcl/vcl_fixed_token.c
varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl
varnish-cache/lib/libvcl/vcl_token_defs.h

index c4a16c01848ed7dce4b18f1533093f8cca976bbc..58ed922adc694fb0c4de714be01d300888f70e50 100644 (file)
@@ -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);
index 7ff01b4d4d9f034fbc42c2248302c958156d512a..678b9f98098071208ce7203f774a197ca715aff3 100644 (file)
@@ -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) {
index fdd5d3f145992ad5ca1bee96edaa769429278ac2..bb8ca23532908aa884f031e66f4b059f6d883fb5 100644 (file)
@@ -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) { }
index 5ad81825c35d4b54e8f7b19ca942ea12d47e2644..17d689be76be56f5a184b892db9b3f396f9700f0 100644 (file)
@@ -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);
index 8b63c08f1727323a53f14c30bfaf9fd4bc2b5b96..9b919b16b94e95b0785362c0d4da89798fae69f5 100644 (file)
@@ -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;
index f10301ab8bd1bf6debd427a5f93f4cb729e26f49..8ec8cf2502fc8614f557e791fac6f3889347f50b 100644 (file)
@@ -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,
index ca30d1ab2e9a9efb5a8ce8cc00e99a097876a485..792a7be67b19ba59fb4f21f7fd2c33dd8d3cc0df 100644 (file)
@@ -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);
index c10cbad53e74cd3bd70f717cf7cc41cc7b26247a..7ebc242c8c6fc88094f7984655f3ec25a6822d4a 100755 (executable)
@@ -15,6 +15,7 @@ set keywords {
        error
        pass
        fetch
+       insert
        call
        no_cache
        no_new_cache
index 760f921fae3502048e9a8bfe7a239be9e099c026..d25a392c56da2653ca3aec176369bb78fee11c22 100644 (file)
 #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