[master] 64ad584 Make varnishlog use VSL Query/Dispatch
Martin Blix Grydeland
martin at varnish-cache.org
Wed May 15 14:46:14 CEST 2013
commit 64ad5841387017ba9a4d6adf3f95a191a76588b4
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date: Tue Apr 30 15:52:44 2013 +0200
Make varnishlog use VSL Query/Dispatch
diff --git a/bin/varnishlog/varnishlog.c b/bin/varnishlog/varnishlog.c
index 6e22d30..c669e70 100644
--- a/bin/varnishlog/varnishlog.c
+++ b/bin/varnishlog/varnishlog.c
@@ -62,33 +62,12 @@ error(int status, const char *fmt, ...)
va_start(ap, fmt);
vfprintf(stderr, fmt, ap); /* XXX: syslog on daemon */
va_end(ap);
+ fprintf(stderr, "\n");
if (status)
exit(status);
}
-static struct VSL_cursor *
-cursor_vsm(struct VSL_data *vsl, struct VSM_data *vsm, int status, int front)
-{
- struct VSL_cursor *c;
-
- AN(vsm);
- if (VSM_Open(vsm)) {
- if (status)
- error(status, "VSM: %s", VSM_Error(vsm));
- VSM_ResetError(vsm);
- return (NULL);
- }
- c = VSL_CursorVSM(vsl, vsm, front);
- if (c == NULL) {
- if (status)
- error(status, "VSL: %s", VSL_Error(vsl));
- VSL_ResetError(vsl);
- return (NULL);
- }
- return (c);
-}
-
static void
usage(void)
{
@@ -96,90 +75,128 @@ usage(void)
exit(1);
}
-static void
-do_raw(struct VSL_data *vsl, struct VSM_data *vsm)
-{
- struct VSL_cursor *c;
- int i;
-
- c = cursor_vsm(vsl, vsm, 1, 1);
- AN(c);
-
- i = 0;
- while (1) {
- while (c == NULL) {
- c = cursor_vsm(vsl, vsm, 0, 1);
- if (c != NULL) {
- error(0, "Log reopened\n");
- break;
- }
- VTIM_sleep(1.);
- }
-
- i = VSL_Next(c);
- if (i == 1) {
- /* Got new record */
- if (VSL_Match(vsl, c))
- (void)VSL_Print(vsl, c, stdout);
- } else if (i == 0) {
- /* Nothing to do but wait */
- VTIM_sleep(0.01);
- } else if (i == -1) {
- /* EOF */
- break;
- } else if (i == -2) {
- /* Abandoned - try reconnect */
- error(0, "Log abandoned, reopening\n");
- VSL_DeleteCursor(c);
- c = NULL;
- VSM_Close(vsm);
- } else if (i < -2) {
- /* Overrun - bail */
- error(1, "Log overrun\n");
- }
- }
-
- VSL_DeleteCursor(c);
-}
-
int
main(int argc, char * const *argv)
{
+ char optchar;
+ int d_opt = 0;
+ char *g_arg = NULL;
+ char *r_arg = NULL;
+
struct VSL_data *vsl;
struct VSM_data *vsm;
- char c;
- char *r_arg = NULL;
+ struct VSL_cursor *c;
+ struct VSLQ *q;
+ enum VSL_grouping_e grouping = VSL_g_vxid;
+ int i;
vsl = VSL_New();
AN(vsl);
vsm = VSM_New();
AN(vsm);
- while ((c = getopt(argc, argv, "n:r:")) != -1) {
- switch (c) {
- case 'r':
- r_arg = optarg;
+ while ((optchar = getopt(argc, argv, "dg:n:r:")) != -1) {
+ switch (optchar) {
+ case 'd':
+ d_opt = 1;
+ break;
+ case 'g':
+ /* Grouping mode */
+ g_arg = optarg;
break;
case 'n':
+ /* Instance name */
if (VSM_n_Arg(vsm, optarg) > 0)
break;
+ case 'r':
+ /* Read from file */
+ r_arg = optarg;
+ break;
default:
usage();
}
}
+ if (g_arg) {
+ if (!strcmp(g_arg, "raw"))
+ grouping = VSL_g_raw;
+ else if (!strcmp(g_arg, "vxid"))
+ grouping = VSL_g_vxid;
+ else if (!strcmp(g_arg, "request"))
+ grouping = VSL_g_request;
+ else if (!strcmp(g_arg, "session"))
+ grouping = VSL_g_session;
+ else
+ error(1, "Wrong -g argument: %s", g_arg);
+ }
+
+ /* Create cursor */
if (r_arg) {
/* XXX */
+ error (1, "-r not implemented");
} else {
if (VSM_Open(vsm))
- error(1, VSM_Error(vsm));
+ error(1, "VSM_Open: %s", VSM_Error(vsm));
+ if (!(c = VSL_CursorVSM(vsl, vsm, !d_opt)))
+ error(1, "VSL_CursorVSM: %s", VSL_Error(vsl));
}
+ AN(c);
- do_raw(vsl, vsm);
+ /* Create query */
+ q = VSLQ_New(vsl, &c, grouping, argv[optind]);
+ if (q == NULL)
+ error(1, "VSLQ_New: %s", VSL_Error(vsl));
+ AZ(c);
+ while (1) {
+ while (!r_arg && q == NULL) {
+ VTIM_sleep(0.1);
+ if (VSM_Open(vsm)) {
+ VSM_ResetError(vsm);
+ continue;
+ }
+ c = VSL_CursorVSM(vsl, vsm, 1);
+ if (c == NULL) {
+ VSL_ResetError(vsl);
+ continue;
+ }
+ q = VSLQ_New(vsl, &c, grouping, argv[optind]);
+ AN(q);
+ AZ(c);
+ }
+
+ i = VSLQ_Dispatch(q, VSL_PrintSet, stdout);
+ if (i == 0) {
+ /* Nothing to do but wait */
+ VTIM_sleep(0.01);
+ } else if (i == -1) {
+ /* EOF */
+ break;
+ } else if (i <= -2) {
+ /* XXX: Make continuation optional */
+ VSLQ_Flush(q, VSL_PrintSet, stdout);
+ VSLQ_Delete(&q);
+ AZ(q);
+ if (i == -2) {
+ /* Abandoned */
+ error(0, "Log abandoned - reopening");
+ VSM_Close(vsm);
+ } else if (i < -2) {
+ /* Overrun */
+ error(0, "Log overrun");
+ }
+ } else {
+ error(1, "Unexpected: %d", i);
+ }
+ }
+
+ if (q != NULL) {
+ VSLQ_Flush(q, VSL_PrintSet, stdout);
+ VSLQ_Delete(&q);
+ AZ(q);
+ }
VSL_Delete(vsl);
- if (vsm)
- VSM_Delete(vsm);
+ VSM_Delete(vsm);
exit(0);
}
More information about the varnish-commit
mailing list