summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2009-04-02 17:54:48 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2009-04-02 17:54:48 +0200
commit4ab540e3ba25a13fd079490ac52438e55dc92672 (patch)
tree14586687d81fa45ecadfebb54e3e05b0e8b43716
parent1d16216aa326296673cc8520a8df351c4d492dfe (diff)
downloadrsyslog-4ab540e3ba25a13fd079490ac52438e55dc92672.tar.gz
rsyslog-4ab540e3ba25a13fd079490ac52438e55dc92672.tar.xz
rsyslog-4ab540e3ba25a13fd079490ac52438e55dc92672.zip
fully integrated regex patch
Now have removed the previous method, as really nobody should call it any longer (and now nobody does ;)). Also did some other cleanup.
-rw-r--r--ChangeLog2
-rw-r--r--runtime/stringbuf.c41
-rw-r--r--runtime/stringbuf.h3
-rw-r--r--tools/syslogd.c8
4 files changed, 19 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog
index 42fda5b3..fc9f807f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -34,6 +34,8 @@ Version 4.1.6 [DEVEL] (rgerhards), 2009-03-??
the full high availability features of rsyslog's engine
- bugfix: fixed some segaults on Solaris, where vsprintf() does not
check for NULL pointers
+- improved performance of regexp-based filters
+ Thanks to Arnaud Cornet for providing the idea and initial patch.
---------------------------------------------------------------------------
Version 4.1.5 [DEVEL] (rgerhards), 2009-03-11
- bugfix: parser did not correctly parse fields in UDP-received messages
diff --git a/runtime/stringbuf.c b/runtime/stringbuf.c
index 4a7cc4bd..35ec44c6 100644
--- a/runtime/stringbuf.c
+++ b/runtime/stringbuf.c
@@ -703,49 +703,34 @@ int rsCStrCaseInsensitveStartsWithSzStr(cstr_t *pCS1, uchar *psz, size_t iLenSz)
* never is a \0 *inside* a property string.
* Note that the function returns -1 if regexp functionality is not available.
* rgerhards: 2009-03-04: ERE support added, via parameter iType: 0 - BRE, 1 - ERE
+ * Arnaud Cornet/rgerhards: 2009-04-02: performance improvement by caching compiled regex
+ * If a caller does not need the cached version, it must still provide memory for it
+ * and must call rsCStrRegexDestruct() afterwards.
*/
-rsRetVal rsCStrSzStrMatchRegex(cstr_t *pCS1, uchar *psz, int iType)
+rsRetVal rsCStrSzStrMatchRegex(cstr_t *pCS1, uchar *psz, int iType, void *rc)
{
- regex_t preq;
+ regex_t **cache = (regex_t**) rc;
int ret;
DEFiRet;
- if(objUse(regexp, LM_REGEXP_FILENAME) == RS_RET_OK) {
- regexp.regcomp(&preq, (char*) rsCStrGetSzStr(pCS1), (iType == 1 ? REG_EXTENDED : 0) | REG_NOSUB);
- ret = regexp.regexec(&preq, (char*) psz, 0, NULL, 0);
- regexp.regfree(&preq);
- if(ret != 0)
- ABORT_FINALIZE(RS_RET_NOT_FOUND);
- } else {
- ABORT_FINALIZE(RS_RET_NOT_FOUND);
- }
-
-finalize_it:
- RETiRet;
-}
-
-/* same as above, only not braindead */
-int rsCStrSzStrMatchRegexCache(cstr_t *pCS1, uchar *psz, void *rc)
-{
- int ret;
- regex_t **cache = (regex_t**) rc;
-
- BEGINfunc
-
+ assert(pCS1 != NULL);
+ assert(psz != NULL);
assert(cache != NULL);
if(objUse(regexp, LM_REGEXP_FILENAME) == RS_RET_OK) {
if (*cache == NULL) {
*cache = calloc(sizeof(regex_t), 1);
- regexp.regcomp(*cache, (char*) rsCStrGetSzStr(pCS1), 0);
+ regexp.regcomp(*cache, (char*) rsCStrGetSzStr(pCS1), (iType == 1 ? REG_EXTENDED : 0) | REG_NOSUB);
}
ret = regexp.regexec(*cache, (char*) psz, 0, NULL, 0);
+ if(ret != 0)
+ ABORT_FINALIZE(RS_RET_NOT_FOUND);
} else {
- ret = 1; /* simulate "not found" */
+ ABORT_FINALIZE(RS_RET_NOT_FOUND);
}
- ENDfunc
- return ret;
+finalize_it:
+ RETiRet;
}
diff --git a/runtime/stringbuf.h b/runtime/stringbuf.h
index 311d7f41..684133bb 100644
--- a/runtime/stringbuf.h
+++ b/runtime/stringbuf.h
@@ -136,8 +136,7 @@ int rsCStrCaseInsensitiveLocateInSzStr(cstr_t *pThis, uchar *sz);
int rsCStrStartsWithSzStr(cstr_t *pCS1, uchar *psz, size_t iLenSz);
int rsCStrCaseInsensitveStartsWithSzStr(cstr_t *pCS1, uchar *psz, size_t iLenSz);
int rsCStrSzStrStartsWithCStr(cstr_t *pCS1, uchar *psz, size_t iLenSz);
-rsRetVal rsCStrSzStrMatchRegex(cstr_t *pCS1, uchar *psz, int iType);
-int rsCStrSzStrMatchRegexCache(cstr_t *pCS1, uchar *psz, void *cache);
+rsRetVal rsCStrSzStrMatchRegex(cstr_t *pCS1, uchar *psz, int iType, void *cache);
void rsCStrRegexDestruct(void *rc);
rsRetVal rsCStrConvertToNumber(cstr_t *pStr, number_t *pNumber);
rsRetVal rsCStrConvertToBool(cstr_t *pStr, number_t *pBool);
diff --git a/tools/syslogd.c b/tools/syslogd.c
index d5429855..b23c12a7 100644
--- a/tools/syslogd.c
+++ b/tools/syslogd.c
@@ -1077,15 +1077,13 @@ static rsRetVal shouldProcessThisMessage(selector_t *f, msg_t *pMsg, int *bProce
bRet = 1; /* process message! */
break;
case FIOP_REGEX:
- //TODO REGEX: this needs to be merged with new functionality below
- //rgerhards, 2009-04-02
- if(rsCStrSzStrMatchRegexCache(f->f_filterData.prop.pCSCompValue,
- (unsigned char*) pszPropVal, &f->f_filterData.prop.regex_cache) == 0)
+ if(rsCStrSzStrMatchRegex(f->f_filterData.prop.pCSCompValue,
+ (unsigned char*) pszPropVal, 0, &f->f_filterData.prop.regex_cache) == RS_RET_OK)
bRet = 1;
break;
case FIOP_EREREGEX:
if(rsCStrSzStrMatchRegex(f->f_filterData.prop.pCSCompValue,
- (unsigned char*) pszPropVal, 1) == RS_RET_OK)
+ (unsigned char*) pszPropVal, 1, &f->f_filterData.prop.regex_cache) == RS_RET_OK)
bRet = 1;
break;
default: