From b8f839de86a29924a3b4b16d36f6cc7331a4a2d4 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Wed, 20 Nov 2013 14:03:15 +0100 Subject: testbench: add test for RainerScript optimizer --- tests/Makefile.am | 3 +++ tests/rs_optimizer_pri.sh | 16 ++++++++++++++++ tests/testsuites/rs_optimizer_pri.conf | 8 ++++++++ 3 files changed, 27 insertions(+) create mode 100755 tests/rs_optimizer_pri.sh create mode 100644 tests/testsuites/rs_optimizer_pri.conf diff --git a/tests/Makefile.am b/tests/Makefile.am index fd1dbce1..13d87dec 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -72,6 +72,7 @@ TESTS += \ rscript_prifilt.sh \ rscript_optimizer1.sh \ rscript_ruleset_call.sh \ + rs_optimizer_pri.sh \ cee_simple.sh \ cee_diskqueue.sh \ incltest.sh \ @@ -292,6 +293,8 @@ EXTRA_DIST= 1.rstest 2.rstest 3.rstest err1.rstest \ testsuites/rscript_stop2.conf \ stop-localvar.sh \ testsuites/stop-localvar.conf \ + rs_optimizer_pri.sh \ + testsuites/rs_optimizer_pr.conf \ rscript_prifilt.sh \ testsuites/rscript_prifilt.conf \ rscript_optimizer1.sh \ diff --git a/tests/rs_optimizer_pri.sh b/tests/rs_optimizer_pri.sh new file mode 100755 index 00000000..d7f81089 --- /dev/null +++ b/tests/rs_optimizer_pri.sh @@ -0,0 +1,16 @@ +# Test for the RainerScript optimizer, folding of +# syslogfacility/priority-text to prifilt. Unfortunately, we cannot yet +# automatically detect if the optimizer does not correctly fold, but we +# can at least detect if it segfaults or otherwise creates incorrect code. +# This file is part of the rsyslog project, released under ASL 2.0 +# rgerhards, 2013-11-20 +echo =============================================================================== +echo \[rs_optimizer_pri.sh\]: testing RainerScript PRI optimizer +source $srcdir/diag.sh init +source $srcdir/diag.sh startup rs_optimizer_pri.conf +sleep 1 +source $srcdir/diag.sh injectmsg 0 100 +source $srcdir/diag.sh shutdown-when-empty # shut down rsyslogd when done processing messages +source $srcdir/diag.sh wait-shutdown +source $srcdir/diag.sh seq-check 0 99 +source $srcdir/diag.sh exit diff --git a/tests/testsuites/rs_optimizer_pri.conf b/tests/testsuites/rs_optimizer_pri.conf new file mode 100644 index 00000000..9ff27dc8 --- /dev/null +++ b/tests/testsuites/rs_optimizer_pri.conf @@ -0,0 +1,8 @@ +$IncludeConfig diag-common.conf +template(name="outfmt" type="string" string="%msg:F,58:2%\n") + +module(load="../plugins/imtcp/.libs/imtcp") +input(type="imtcp" port="13514") + +if $syslogfacility-text == "local4" then + action(type="omfile" template="outfmt" file="rsyslog.out.log") -- cgit v1.2.3 From 89030a107ef46286196d7ffae8e992138bbd7e69 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Wed, 20 Nov 2013 14:10:08 +0100 Subject: bugfix: RainerScript optimizer did not optimize PRI filters things like "if $syslogfacility-text == "local3"" were not converted to PRIFILT. This was a regression introduced in 7.5.6. --- ChangeLog | 3 +++ grammar/rainerscript.c | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7cddf587..53625056 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,9 @@ Version 7.5.7 [v7-devel] 2013-11-?? * high water mark is now dynamically 90% of queue size * low water makr is now dynamically 70% of queue size * queue.workerThreadMinimumMessage set to queue.size / num workers +- bugfix: RainerScript optimizer did not optimize PRI filters + things like "if $syslogfacility-text == "local3"" were not converted + to PRIFILT. This was a regression introduced in 7.5.6. - bugfix: legacy directive $ActionQueueWorkerThreads was not honored - bugfix: segfault on startup when certain script constructs are used e.g. "if not $msg ..." diff --git a/grammar/rainerscript.c b/grammar/rainerscript.c index ecc23b54..e4f85860 100644 --- a/grammar/rainerscript.c +++ b/grammar/rainerscript.c @@ -2884,7 +2884,7 @@ cnfexprOptimize_CMP_severity_facility(struct cnfexpr *expr) if(expr->l->nodetype != 'V') FINALIZE; - if(!strcmp("$syslogseverity", ((struct cnfvar*)expr->l)->name)) { + if(!strcmp("syslogseverity", ((struct cnfvar*)expr->l)->name)) { if(expr->r->nodetype == 'N') { int sev = (int) ((struct cnfnumval*)expr->r)->val; if(sev >= 0 && sev <= 7) { @@ -2898,7 +2898,7 @@ cnfexprOptimize_CMP_severity_facility(struct cnfexpr *expr) "evaluate to FALSE", sev); } } - } else if(!strcmp("$syslogfacility", ((struct cnfvar*)expr->l)->name)) { + } else if(!strcmp("syslogfacility", ((struct cnfvar*)expr->l)->name)) { if(expr->r->nodetype == 'N') { int fac = (int) ((struct cnfnumval*)expr->r)->val; if(fac >= 0 && fac <= 24) { @@ -2926,7 +2926,7 @@ cnfexprOptimize_CMP_var(struct cnfexpr *expr) { struct cnffunc *func; - if(!strcmp("$syslogfacility-text", ((struct cnfvar*)expr->l)->name)) { + if(!strcmp("syslogfacility-text", ((struct cnfvar*)expr->l)->name)) { if(expr->r->nodetype == 'S') { char *cstr = es_str2cstr(((struct cnfstringval*)expr->r)->estr, NULL); int fac = decodeSyslogName((uchar*)cstr, syslogFacNames); @@ -2944,7 +2944,7 @@ cnfexprOptimize_CMP_var(struct cnfexpr *expr) } free(cstr); } - } else if(!strcmp("$syslogseverity-text", ((struct cnfvar*)expr->l)->name)) { + } else if(!strcmp("syslogseverity-text", ((struct cnfvar*)expr->l)->name)) { if(expr->r->nodetype == 'S') { char *cstr = es_str2cstr(((struct cnfstringval*)expr->r)->estr, NULL); int sev = decodeSyslogName((uchar*)cstr, syslogPriNames); -- cgit v1.2.3 From 2c3bce4e31608572b8d469237c086da6656afa8a Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Wed, 20 Nov 2013 14:14:46 +0100 Subject: testbench: improve test --- tests/rs_optimizer_pri.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/rs_optimizer_pri.sh b/tests/rs_optimizer_pri.sh index d7f81089..4d6e4637 100755 --- a/tests/rs_optimizer_pri.sh +++ b/tests/rs_optimizer_pri.sh @@ -9,7 +9,8 @@ echo \[rs_optimizer_pri.sh\]: testing RainerScript PRI optimizer source $srcdir/diag.sh init source $srcdir/diag.sh startup rs_optimizer_pri.conf sleep 1 -source $srcdir/diag.sh injectmsg 0 100 +source $srcdir/diag.sh tcpflood -m100 # correct facility +source $srcdir/diag.sh tcpflood -m100 -P175 # incorrect facility --> must be ignored source $srcdir/diag.sh shutdown-when-empty # shut down rsyslogd when done processing messages source $srcdir/diag.sh wait-shutdown source $srcdir/diag.sh seq-check 0 99 -- cgit v1.2.3