[4.0] ac647ac Port varnishtop to the new logging API
Martin Blix Grydeland
martin at varnish-software.com
Thu Mar 13 10:24:22 CET 2014
commit ac647acd1a44ff770f7a76efe9e2beafa8286b52
Author: Guillaume Quintard <guillaume.quintard at gmail.com>
Date: Mon Dec 2 15:13:30 2013 +0100
Port varnishtop to the new logging API
diff --git a/bin/Makefile.am b/bin/Makefile.am
index 124cb98..48a9a51 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -8,4 +8,5 @@ SUBDIRS = varnishadm varnishd varnishlog varnishtest varnishncsa
if VARNISH_CURSES
#SUBDIRS += varnishhist varnishstat varnishtop
SUBDIRS += varnishstat
+SUBDIRS += varnishtop
endif
diff --git a/bin/varnishtop/Makefile.am b/bin/varnishtop/Makefile.am
index 54e672f..3a78c4e 100644
--- a/bin/varnishtop/Makefile.am
+++ b/bin/varnishtop/Makefile.am
@@ -7,8 +7,14 @@ bin_PROGRAMS = varnishtop
dist_man_MANS = varnishtop.1
varnishtop_SOURCES = varnishtop.c \
- $(top_builddir)/lib/libvarnish/vas.c \
- $(top_builddir)/lib/libvarnish/version.c
+ $(top_srcdir)/lib/libvarnishtools/vut.c \
+ $(top_srcdir)/lib/libvarnish/vas.c \
+ $(top_srcdir)/lib/libvarnish/flopen.c \
+ $(top_srcdir)/lib/libvarnish/version.c \
+ $(top_srcdir)/lib/libvarnish/vpf.c \
+ $(top_srcdir)/lib/libvarnish/vtim.c \
+ $(top_srcdir)/lib/libvarnish/vsb.c
+
varnishtop_LDADD = \
$(top_builddir)/lib/libvarnishcompat/libvarnishcompat.la \
diff --git a/bin/varnishtop/varnishtop.c b/bin/varnishtop/varnishtop.c
index e217f28..f2f9555 100644
--- a/bin/varnishtop/varnishtop.c
+++ b/bin/varnishtop/varnishtop.c
@@ -50,6 +50,7 @@
#include "vcs.h"
#include "vtree.h"
#include "vsb.h"
+#include "vut.h"
#if 0
#define AC(x) assert((x) != ERR)
@@ -57,6 +58,9 @@
#define AC(x) x
#endif
+static const char progname[] = "varnishtop2";
+static float period = 60; /* seconds */
+
struct top {
uint8_t tag;
char *rec_data;
@@ -105,61 +109,63 @@ top_cmp(const struct top *tp, const struct top *tp2)
}
-static int
-accumulate(void *priv, enum VSL_tag_e tag, unsigned fd, unsigned len,
- unsigned spec, const char *ptr, uint64_t bm)
+static int __match_proto__(VSLQ_dispatch_f)
+accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
+ void *priv)
{
struct top *tp, t;
- const char *q;
char *rd;
unsigned int u;
- int i;
+ unsigned tag;
+ const char *b, *e, *p;
+ unsigned len;
+
+ struct VSL_transaction *tr;
+ for (tr = pt[0]; tr != NULL; tr = *++pt) {
+ while ((1 == VSL_Next(tr->c))) {
+ tag = VSL_TAG(tr->c->rec.ptr);
+ b = VSL_CDATA(tr->c->rec.ptr);
+ len = VSL_LEN(tr->c->rec.ptr);
+ assert(len > 0);
+ e = b + len;
+ u = 0;
+ for (p = b; p <= e; p++) {
+ u += *p;
+ }
+
+ t.hash = u;
+ t.tag = tag;
+ t.clen = len;
+ t.count = 0;
+ rd = calloc(len+1, 1);
+ AN(rd);
+ memcpy(rd, VSL_CDATA(tr->c->rec.ptr), len);
+ rd[len] = '\0';
+ t.rec_data = rd;
+
+ AZ(pthread_mutex_lock(&mtx));
+ tp = VRB_FIND(top_tree, &top_tree_head, &t);
+ if (tp) {
+ VRB_REMOVE(top_tree, &top_tree_head, tp);
+ tp->count += 1.0;
+ /* Reinsert to rebalance */
+ VRB_INSERT(top_tree, &top_tree_head, tp);
+ free(rd);
+ } else {
+ ntop++;
+ tp = calloc(sizeof *tp, 1);
+ assert(tp != NULL);
+ tp->hash = u;
+ tp->count = 1.0;
+ tp->clen = len;
+ tp->tag = tag;
+ tp->rec_data = rd;
+ VRB_INSERT(top_tree, &top_tree_head, tp);
+ }
+ AZ(pthread_mutex_unlock(&mtx));
- (void)priv;
- (void)fd;
- (void)spec;
- (void)bm;
- // fprintf(stderr, "%p %08x %08x\n", p, p[0], p[1]);
-
- u = 0;
- q = ptr;
- for (i = 0; i < len; i++, q++) {
- if (f_flag && (*q == ':' || isspace(*q))) {
- len = q - ptr;
- break;
}
- u += *q;
}
- t.hash = u;
- t.tag = tag;
- t.clen = len;
- rd = malloc(len);
- AN(rd);
- memcpy(rd, ptr, len);
- t.rec_data = rd;
-
- AZ(pthread_mutex_lock(&mtx));
- tp = VRB_FIND(top_tree, &top_tree_head, &t);
- if (tp) {
- VRB_REMOVE(top_tree, &top_tree_head, tp);
- tp->count += 1.0;
- /* Reinsert to rebalance */
- VRB_INSERT(top_tree, &top_tree_head, tp);
- } else {
- ntop++;
- tp = calloc(sizeof *tp, 1);
- assert(tp != NULL);
- tp->rec_data = calloc(len + 1, 1);
- assert(tp->rec_data != NULL);
- tp->hash = u;
- tp->count = 1.0;
- tp->clen = len;
- tp->tag = tag;
- memcpy(tp->rec_data, ptr, len);
- tp->rec_data[len] = '\0';
- VRB_INSERT(top_tree, &top_tree_head, tp);
- }
- AZ(pthread_mutex_unlock(&mtx));
return (0);
}
@@ -187,16 +193,18 @@ update(const struct VSM_data *vd, int period)
AC(mvprintw(0, 0, "list length %u", ntop));
for (tp = VRB_MIN(top_tree, &top_tree_head); tp != NULL; tp = tp2) {
tp2 = VRB_NEXT(top_tree, &top_tree_head, tp);
+
if (++l < LINES) {
len = tp->clen;
if (len > COLS - 20)
len = COLS - 20;
AC(mvprintw(l, 0, "%9.2f %-*.*s %*.*s\n",
- tp->count, maxfieldlen, maxfieldlen,
- VSL_tags[tp->tag],
- len, len, tp->rec_data));
+ tp->count, maxfieldlen, maxfieldlen,
+ VSL_tags[tp->tag],
+ len, len, tp->rec_data));
t = tp->count;
}
+ (void)t;
tp->count += (1.0/3.0 - tp->count) / (double)n;
if (tp->count * 10 < t || l > LINES * 10) {
VRB_REMOVE(top_tree, &top_tree_head, tp);
@@ -209,27 +217,10 @@ update(const struct VSM_data *vd, int period)
}
static void *
-accumulate_thread(void *arg)
-{
- struct VSM_data *vd = arg;
- int i;
-
- for (;;) {
-
- i = VSL_Dispatch(vd, accumulate, NULL);
- if (i < 0)
- break;
- if (i == 0)
- usleep(50000);
- }
- return (arg);
-}
-
-static void
-do_curses(struct VSM_data *vd, int period)
+do_curses(void *arg)
{
- pthread_t thr;
int i;
+ struct VSM_data *vd = (struct VSM_data *)arg;
for (i = 0; i < 256; i++) {
if (VSL_tags[i] == NULL)
@@ -238,11 +229,6 @@ do_curses(struct VSM_data *vd, int period)
maxfieldlen = strlen(VSL_tags[i]);
}
- if (pthread_create(&thr, NULL, accumulate_thread, vd) != 0) {
- fprintf(stderr, "pthread_create(): %s\n", strerror(errno));
- exit(1);
- }
-
(void)initscr();
AC(raw());
AC(noecho());
@@ -269,54 +255,46 @@ do_curses(struct VSM_data *vd, int period)
AC(redrawwin(stdscr));
AC(refresh());
break;
- case '\003': /* Ctrl-C */
- AZ(raise(SIGINT));
- break;
case '\032': /* Ctrl-Z */
AC(endwin());
AZ(raise(SIGTSTP));
break;
+ case '\003': /* Ctrl-C */
+ printf("got ctrl-C\r\n");
case '\021': /* Ctrl-Q */
case 'Q':
case 'q':
+ AZ(raise(SIGINT));
AC(endwin());
- return;
+ return NULL;
default:
AC(beep());
break;
}
}
+ return NULL;
+
}
static void
dump(void)
{
struct top *tp, *tp2;
- printf("%d\n", ntop);
- printf("%p\n", VRB_MIN(top_tree, &top_tree_head));
for (tp = VRB_MIN(top_tree, &top_tree_head); tp != NULL; tp = tp2) {
tp2 = VRB_NEXT(top_tree, &top_tree_head, tp);
if (tp->count <= 1.0)
- break;
+ break;
printf("%9.2f %s %*.*s\n",
- tp->count, VSL_tags[tp->tag],
- tp->clen, tp->clen, tp->rec_data);
+ tp->count, VSL_tags[tp->tag],
+ tp->clen, tp->clen, tp->rec_data);
}
}
static void
-do_once(struct VSM_data *vd)
-{
- while (VSL_Dispatch(vd, accumulate, NULL) > 0)
- ;
- dump();
-}
-
-static void
usage(void)
{
fprintf(stderr,
- "usage: varnishtop %s [-1fV] [-n varnish_name]\n", VSL_USAGE);
+ "usage: varnishtop [-1fV] [-n varnish_name]\n");
exit(1);
}
@@ -325,14 +303,15 @@ main(int argc, char **argv)
{
struct VSM_data *vd;
int o, once = 0;
- float period = 60; /* seconds */
+ pthread_t thr;
vd = VSM_New();
+ VUT_Init(progname);
- while ((o = getopt(argc, argv, VSL_ARGS "1fVp:")) != -1) {
+ while ((o = getopt(argc, argv, "1fVp:")) != -1) {
switch (o) {
case '1':
- AN(VSL_Arg(vd, 'd', NULL));
+ VUT_Arg('d', NULL);
once = 1;
break;
case 'f':
@@ -343,7 +322,7 @@ main(int argc, char **argv)
period = strtol(optarg, NULL, 0);
if (errno != 0) {
fprintf(stderr,
- "Syntax error, %s is not a number", optarg);
+ "Syntax error, %s is not a number", optarg);
exit(1);
}
break;
@@ -354,7 +333,7 @@ main(int argc, char **argv)
fprintf(stderr, "-m is not supported\n");
exit(1);
default:
- if (VSL_Arg(vd, o, optarg) > 0)
+ if (!VUT_Arg(o, optarg))
break;
usage();
}
@@ -365,10 +344,20 @@ main(int argc, char **argv)
exit (1);
}
- if (once) {
- do_once(vd);
- } else {
- do_curses(vd, period);
+ VUT.dispatch_f = &accumulate;
+ VUT.dispatch_priv = NULL;
+ if (!once){
+ if (pthread_create(&thr, NULL, do_curses, vd) != 0) {
+ fprintf(stderr, "pthread_create(): %s\n", strerror(errno));
+ exit(1);
+ }
}
+ VUT_Setup();
+ VUT_Main();
+ VUT_Fini();
+ if (once)
+ dump();
+ else
+ pthread_join(thr, NULL);
exit(0);
}
diff --git a/configure.ac b/configure.ac
index e22fc4e..38634b9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -562,6 +562,7 @@ AC_CONFIG_FILES([
bin/varnishd/Makefile
bin/varnishlog/Makefile
bin/varnishstat/Makefile
+ bin/varnishtop/Makefile
bin/varnishtest/Makefile
bin/varnishncsa/Makefile
doc/Makefile
More information about the varnish-commit
mailing list