]> err.no Git - varnish/commitdiff
First, rough implementation of dynamic counters
authorTollef Fog Heen <tfheen@err.no>
Sun, 16 Nov 2008 16:07:01 +0000 (17:07 +0100)
committerTollef Fog Heen <tfheen@err.no>
Fri, 30 Jan 2009 12:08:49 +0000 (13:08 +0100)
12 files changed:
varnish-cache/bin/varnishd/cache_cli.c
varnish-cache/bin/varnishd/cache_vrt.c
varnish-cache/bin/varnishd/common.h
varnish-cache/bin/varnishd/varnishd.c
varnish-cache/include/vrt.h
varnish-cache/include/vrt_obj.h
varnish-cache/lib/libvcl/vcc_compile.h
varnish-cache/lib/libvcl/vcc_fixed_token.c
varnish-cache/lib/libvcl/vcc_gen_fixed_token.tcl
varnish-cache/lib/libvcl/vcc_gen_obj.tcl
varnish-cache/lib/libvcl/vcc_obj.c
varnish-cache/lib/libvcl/vcc_var.c

index 2a9481652d38c70c93418fdfcb014b1ae59971e1..724e37939c9c23c7549812ccfda70d7a8fd14bc6 100644 (file)
@@ -46,6 +46,7 @@
 #include <poll.h>
 
 #include "shmlog.h"
+#include "counter.h"
 #include "cli.h"
 #include "cli_priv.h"
 #include "cli_common.h"
@@ -198,6 +199,19 @@ cli_debug_sizeof(struct cli *cli, const char * const *av, void *priv)
        SZOF(struct varnish_stats);
 }
 
+static void
+cli_debug_counters(struct cli *cli, const char * const *av, void *priv)
+{
+       (void)av;
+       (void)priv;
+       struct varnish_counters *c = VSL_counters;
+       cli_out(cli, "<name> <value>\n");
+       while (c) {
+         cli_out(cli, "%s %d\n", c->name, c->value);
+         c = c->next;
+       }
+}
+
 /*--------------------------------------------------------------------*/
 
 static void
@@ -231,6 +245,9 @@ static struct cli_proto debug_cmds[] = {
        { "debug.sizeof", "debug.sizeof",
                "\tDump sizeof various data structures\n",
                0, 0, cli_debug_sizeof },
+       { "debug.counters", "debug.counters",
+               "\tDump counters\n",
+               0, 0, cli_debug_counters },
        { NULL }
 };
 
index f9db47ae8cf9968a93e40d7a6f4ea36e41ebec7b..979264e2753d6982afb919602eff73f90755c345 100644 (file)
@@ -46,6 +46,7 @@
 #include <stdarg.h>
 
 #include "shmlog.h"
+#include "counter.h"
 #include "vrt.h"
 #include "vrt_obj.h"
 #include "vcl.h"
@@ -343,6 +344,51 @@ VRT_r_bereq_between_bytes_timeout(struct sess *sp)
 
 /*--------------------------------------------------------------------*/
 
+static MTX counter_mtx;
+
+struct varnish_counters*
+VRT_FindCounter(const struct sess *sp, const char *name)
+{
+       struct varnish_counters *c = VSL_counters;
+
+       CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+       while (c) {
+               if (strcmp(name, c->name) == 0)
+                       return c;
+               c = c->next;
+       }
+       /* Not found, create a new one. */
+       c = malloc(sizeof (struct varnish_counters));
+       c->name = strdup(name);
+       c->value = 0;
+
+       AZ(pthread_mutex_lock(&counter_mtx));
+       c->next = VSL_counters;
+       VSL_counters = c;
+       AZ(pthread_mutex_unlock(&counter_mtx));
+       return c;
+}
+
+uint64_t
+VRT_GetCounter(const struct sess *sp, const char *name)
+{
+       struct varnish_counters *c;
+       CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+       c = VRT_FindCounter(sp, name);
+       return c->value;
+}
+
+void
+VRT_SetCounter(const struct sess *sp, const char *name, uint64_t value)
+{
+       struct varnish_counters *c;
+       CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+       c = VRT_FindCounter(sp, name);
+       c->value = value;
+}
+
+/*--------------------------------------------------------------------*/
+
 void
 VRT_handling(struct sess *sp, unsigned hand)
 {
index 82913efdd66f9d33539fd8b66fe960b2b1688a9d..48f2885f98a8c9f7d1f8eedd71f1e202beff1126 100644 (file)
@@ -42,6 +42,8 @@ void VSL_Panic(int *len, char **ptr);
 void VSL_MgtInit(const char *fn, unsigned size);
 extern struct varnish_stats *VSL_stats;
 
+extern struct varnish_counters *VSL_counters;
+
 #define TRUST_ME(ptr)  ((void*)(uintptr_t)(ptr))
 
 /* Really belongs in mgt.h, but storage_file chokes on both */
index c3dd3314c7155d22bc5e236ef8773586c00ddc24..fa087e0c346035444094c906a924f0e1e3b6f6b9 100644 (file)
@@ -79,6 +79,8 @@
 struct heritage heritage;
 volatile struct params *params;
 
+struct varnish_counters *VSL_counters;
+
 /*--------------------------------------------------------------------*/
 
 struct choice {
index 5a0f60dc95bcf2c295e934a158b6e0c864fce712..c41aaadd5e3469f595a3c6aad37d87ebe4fbfc78 100644 (file)
@@ -185,3 +185,7 @@ const char *VRT_backend_string(struct sess *sp);
                VRT_handling(sp, hand);         \
                return (1);                     \
        } while (0)
+
+uint64_t VRT_GetCounter(const struct sess *, const char *name);
+void VRT_SetCounter(const struct sess *, const char *, uint64_t value);
+struct varnish_counters *VRT_FindCounter(const struct sess *sp, const char *name);
index 44c1738035e45af54247fcbfe5839076a69f74a7..7bc0387e36e39d15057d76f9df776bbda2b81086 100644 (file)
@@ -59,3 +59,5 @@ const char * VRT_r_resp_response(const struct sess *);
 void VRT_l_resp_response(const struct sess *, const char *, ...);
 double VRT_r_now(const struct sess *);
 unsigned VRT_r_req_backend_healthy(const struct sess *);
+struct counter * VRT_r_counter_(const struct sess *);
+void VRT_l_counter_(const struct sess *, struct counter *);
index 41db37154faa6bb90571af998c5db86cf7437868..84d032c9f4394cd34477a1574c2bf1d7e8cd020c 100644 (file)
@@ -106,7 +106,8 @@ enum var_type {
        STRING,
        IP,
        HASH,
-       HEADER
+       HEADER,
+       COUNTER
 };
 
 enum var_access {
index bb6df1d88ed8ed57e3a3ce8873a05b72a1fbb82b..39a2f35fd862065e71066096f801a19504a79047 100644 (file)
@@ -156,13 +156,13 @@ const char * const vcl_tnames[256] = {
 void
 vcl_output_lang_h(struct vsb *sb)
 {
+       vsb_cat(sb, "#include <stdint.h>\n");
 
        /* ../../include/vcl.h */
 
-       vsb_cat(sb, "/*\n * $Id: vcc_gen_fixed_token.tcl 3534 2009-01-19 13");
-       vsb_cat(sb, ":46:31Z phk $\n *\n * NB:  This file is machine genera");
-       vsb_cat(sb, "ted, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_t");
-       vsb_cat(sb, "oken.tcl instead\n */\n\nstruct sess;\n");
+       vsb_cat(sb, "/*\n * $Id$\n *\n * NB:  This file is machine generate");
+       vsb_cat(sb, "d, DO NOT EDIT!\n *\n * Edit and run vcc_gen_fixed_tok");
+       vsb_cat(sb, "en.tcl instead\n */\n\nstruct sess;\n");
        vsb_cat(sb, "struct cli;\n\ntypedef void vcl_init_f(struct cli *);\n");
        vsb_cat(sb, "typedef void vcl_fini_f(struct cli *);\n");
        vsb_cat(sb, "typedef int vcl_func_f(struct sess *sp);\n");
@@ -235,15 +235,15 @@ vcl_output_lang_h(struct vsb *sb)
        vsb_cat(sb, " * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWI");
        vsb_cat(sb, "SE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFT");
        vsb_cat(sb, "WARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n");
-       vsb_cat(sb, " * SUCH DAMAGE.\n *\n * $Id: vrt.h 3541 2009-01-23 21:");
-       vsb_cat(sb, "17:02Z phk $\n *\n * Runtime support for compiled VCL ");
-       vsb_cat(sb, "programs.\n *\n * XXX: When this file is changed, lib/");
-       vsb_cat(sb, "libvcl/vcc_gen_fixed_token.tcl\n");
-       vsb_cat(sb, " * XXX: *MUST* be rerun.\n */\n");
-       vsb_cat(sb, "\nstruct sess;\nstruct vsb;\nstruct cli;\n");
-       vsb_cat(sb, "struct director;\nstruct VCL_conf;\n");
-       vsb_cat(sb, "struct sockaddr;\n\n/*\n * A backend probe specificati");
-       vsb_cat(sb, "on\n */\n\nextern void *vrt_magic_string_end;\n");
+       vsb_cat(sb, " * SUCH DAMAGE.\n *\n * $Id$\n *\n");
+       vsb_cat(sb, " * Runtime support for compiled VCL programs.\n");
+       vsb_cat(sb, " *\n * XXX: When this file is changed, lib/libvcl/vcc_");
+       vsb_cat(sb, "gen_fixed_token.tcl\n * XXX: *MUST* be rerun.\n");
+       vsb_cat(sb, " */\n\nstruct sess;\nstruct vsb;\n");
+       vsb_cat(sb, "struct cli;\nstruct director;\n");
+       vsb_cat(sb, "struct VCL_conf;\nstruct sockaddr;\n");
+       vsb_cat(sb, "\n/*\n * A backend probe specification\n");
+       vsb_cat(sb, " */\n\nextern void *vrt_magic_string_end;\n");
        vsb_cat(sb, "\nstruct vrt_backend_probe {\n\tconst char\t*url;\n");
        vsb_cat(sb, "\tconst char\t*request;\n\tdouble\t\ttimeout;\n");
        vsb_cat(sb, "\tdouble\t\tinterval;\n\tunsigned\twindow;\n");
@@ -321,12 +321,16 @@ vcl_output_lang_h(struct vsb *sb)
        vsb_cat(sb, "uct sess *sp);\n\n#define VRT_done(sp, hand)\t\t\t\\\n");
        vsb_cat(sb, "\tdo {\t\t\t\t\t\\\n\t\tVRT_handling(sp, hand);\t\t\\\n");
        vsb_cat(sb, "\t\treturn (1);\t\t\t\\\n\t} while (0)\n");
+       vsb_cat(sb, "\nuint64_t VRT_GetCounter(const struct sess *, const c");
+       vsb_cat(sb, "har *name);\nvoid VRT_SetCounter(const struct sess *, ");
+       vsb_cat(sb, "const char *, uint64_t value);\n");
+       vsb_cat(sb, "struct varnish_counters *VRT_FindCounter(const struct ");
+       vsb_cat(sb, "sess *sp, const char *name);\n");
 
        /* ../../include/vrt_obj.h */
 
-       vsb_cat(sb, "/*\n * $Id: vrt_obj.h 3406 2008-11-19 14:13:57Z petter");
-       vsb_cat(sb, " $\n *\n * NB:  This file is machine generated, DO NOT");
-       vsb_cat(sb, " EDIT!\n *\n * Edit vcc_gen_obj.tcl instead\n");
+       vsb_cat(sb, "/*\n * $Id$\n *\n * NB:  This file is machine generate");
+       vsb_cat(sb, "d, DO NOT EDIT!\n *\n * Edit vcc_gen_obj.tcl instead\n");
        vsb_cat(sb, " */\n\nstruct sockaddr * VRT_r_client_ip(const struct ");
        vsb_cat(sb, "sess *);\nstruct sockaddr * VRT_r_server_ip(struct ses");
        vsb_cat(sb, "s *);\nint VRT_r_server_port(struct sess *);\n");
@@ -382,5 +386,7 @@ vcl_output_lang_h(struct vsb *sb)
        vsb_cat(sb, "\nvoid VRT_l_resp_response(const struct sess *, const ");
        vsb_cat(sb, "char *, ...);\ndouble VRT_r_now(const struct sess *);\n");
        vsb_cat(sb, "unsigned VRT_r_req_backend_healthy(const struct sess *");
-       vsb_cat(sb, ");\n");
+       vsb_cat(sb, ");\nstruct counter * VRT_r_counter_(const struct sess ");
+       vsb_cat(sb, "*);\nvoid VRT_l_counter_(const struct sess *, struct c");
+       vsb_cat(sb, "ounter *);\n");
 }
index 648a8257942f82558f40f5d6c2cd9ef7ecdf975e..edd328ec6a60e7a60282a91d861a2949a416d53e 100755 (executable)
@@ -399,6 +399,7 @@ puts $fo ""
 puts $fo "void"
 puts $fo "vcl_output_lang_h(struct vsb *sb)"
 puts $fo "{"
+puts $fo "\tvsb_cat(sb, \"#include <stdint.h>\\n\");"
 
 copy_include ../../include/vcl.h
 copy_include ../../include/vrt.h
index 405ca02bf4c4d5d87a52cc3fdc31461823148caf..286b324c54d1f86d648c472e3c64a2d28aa5d702 100755 (executable)
@@ -235,7 +235,11 @@ set spobj {
            {recv pipe pass hash miss hit fetch deliver discard timeout}
            "const struct sess *"
     }
-
+    { counter.
+       RW COUNTER
+       {recv pipe pass hash miss hit fetch deliver discard timeout}
+       "const struct sess *"
+    }
 }
 
 set tt(IP)             "struct sockaddr *"
@@ -249,6 +253,7 @@ set tt(HDR_RESP)    "const char *"
 set tt(HDR_OBJ)                "const char *"
 set tt(HDR_REQ)                "const char *"
 set tt(HDR_BEREQ)      "const char *"
+set tt(COUNTER)                "struct counter *"
 set tt(HOSTNAME)       "const char *"
 set tt(PORTNAME)       "const char *"
 set tt(HASH)           "const char *"
index a7f98211111b9a9fa66fbeef34149394b824c66e..a04d1ce92571adc853a8d92215b21405fb14f107 100644 (file)
@@ -217,5 +217,12 @@ struct var vcc_vars[] = {
             | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DELIVER
             | VCL_MET_DISCARD | VCL_MET_TIMEOUT
        },
+       { "counter.", COUNTER, 8,
+           "VRT_r_counter_(sp)",           "VRT_l_counter_(sp, ",
+           V_RW,           0,
+           VCL_MET_RECV | VCL_MET_PIPE | VCL_MET_PASS | VCL_MET_HASH
+            | VCL_MET_MISS | VCL_MET_HIT | VCL_MET_FETCH | VCL_MET_DELIVER
+            | VCL_MET_DISCARD | VCL_MET_TIMEOUT
+       },
        { NULL }
 };
index 66a4f211c760caf75050a3193385357dd1da48df..40e84f6822cd7cad385dbfe7404af2c6072ddde3 100644 (file)
@@ -76,6 +76,39 @@ HeaderVar(struct tokenlist *tl, const struct token *t, const struct var *vh)
        return (v);
 }
 
+static struct var *
+CounterVar(struct tokenlist *tl, const struct token *t, const struct var *vh)
+{
+       char *p;
+       struct var *v;
+       int i;
+
+       (void)tl;
+
+       v = TlAlloc(tl, sizeof *v);
+       assert(v != NULL);
+       i = t->e - t->b;
+       p = TlAlloc(tl, i + 1);
+       assert(p != NULL);
+       memcpy(p, t->b, i);
+       p[i] = '\0';
+       v->name = p;
+       v->access = V_RW;
+       v->fmt = INT;
+       v->hdr = vh->hdr;
+       v->methods = vh->methods;
+       asprintf(&p, "VRT_GetCounter(sp, \"%s\")", v->name+vh->len);
+       AN(p);
+       TlFree(tl, p);
+       v->rname = p;
+       asprintf(&p, "VRT_SetCounter(sp, \"%s\", ", v->name+vh->len);
+
+       AN(p);
+       TlFree(tl, p);
+       v->lname = p;
+       return (v);
+}
+
 /*--------------------------------------------------------------------*/
 
 struct var *
@@ -83,17 +116,28 @@ vcc_FindVar(struct tokenlist *tl, const struct token *t, struct var *vl)
 {
        struct var *v;
 
+       printf("%d\n", t->tok);
        for (v = vl; v->name != NULL; v++) {
-               if (v->fmt == HEADER  && (t->e - t->b) <= v->len)
+               printf("%s %d (%d %d)\n", v->name, v->fmt, t->e - t->b, v->len);
+               if ((v->fmt == HEADER ||
+                    v->fmt == COUNTER) && (t->e - t->b) <= v->len)
                        continue;
-               if (v->fmt != HEADER  && t->e - t->b != v->len)
+               if ((v->fmt != HEADER &&
+                    v->fmt != COUNTER) && (t->e - t->b) != v->len)
                        continue;
                if (memcmp(t->b, v->name, v->len))
                        continue;
                vcc_AddUses(tl, v);
-               if (v->fmt != HEADER)
+               switch (v->fmt) {
+               case HEADER:
+                       return (HeaderVar(tl, t, v));
+                       break;
+               case COUNTER:
+                       return (CounterVar(tl, t, v));
+                       break;
+               default:
                        return (v);
-               return (HeaderVar(tl, t, v));
+               }
        }
        vsb_printf(tl->sb, "Unknown variable ");
        vcc_ErrToken(tl, t);