summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2012-04-18 16:22:46 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2012-04-18 16:22:46 +0200
commitbe5d462673e70afbe509e10c59b81ca7b86135ac (patch)
treef3b4571274ff5bf96061a7a0009425913d0ffbd4
parent80d62d6bb7fe19c50f10732f98c8de90094845b0 (diff)
parentadad82ffae842934ac1a409a14f5c22951f6cc37 (diff)
downloadrsyslog-be5d462673e70afbe509e10c59b81ca7b86135ac.tar.gz
rsyslog-be5d462673e70afbe509e10c59b81ca7b86135ac.tar.xz
rsyslog-be5d462673e70afbe509e10c59b81ca7b86135ac.zip
Merge branch 'v5-stable-newstats' into v5-beta
-rw-r--r--ChangeLog4
-rw-r--r--runtime/msg.c21
-rw-r--r--runtime/ruleset.c10
-rw-r--r--runtime/ruleset.h15
4 files changed, 45 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 2d817343..df4df8e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -130,6 +130,10 @@ Version 5.9.0 [V5-DEVEL] (rgerhards), 2011-06-08
closes: http://bugzilla.adiscon.com/show_bug.cgi?id=236
---------------------------------------------------------------------------
Version 5.8.11 [V5-stable] 2012-04-??
+- bugfix: assigned ruleset was lost when using disk queues
+ This looked quite hard to diagnose for disk-assisted queues, as the
+ pure memory part worked well, but ruleset info was lost for messages
+ stored inside the disk queue.
- bugfix: hostname was not requeried on HUP
Thanks to Per Jessen for reporting this bug and Marius Tomaschewski for
his help in testing the fix.
diff --git a/runtime/msg.c b/runtime/msg.c
index 810a396e..f5c6184c 100644
--- a/runtime/msg.c
+++ b/runtime/msg.c
@@ -1057,6 +1057,12 @@ static rsRetVal MsgSerialize(msg_t *pThis, strm_t *pStrm)
objSerializePTR(pStrm, pCSAPPNAME, CSTR);
objSerializePTR(pStrm, pCSPROCID, CSTR);
objSerializePTR(pStrm, pCSMSGID, CSTR);
+
+ if(pThis->pRuleset != NULL) {
+ rulesetGetName(pThis->pRuleset);
+ CHKiRet(obj.SerializeProp(pStrm, UCHAR_CONSTANT("pszRuleset"), PROPTYPE_PSZ,
+ rulesetGetName(pThis->pRuleset)));
+ }
/* offset must be serialized after pszRawMsg, because we need that to obtain the correct
* MSG size.
@@ -1663,6 +1669,16 @@ void MsgSetRuleset(msg_t *pMsg, ruleset_t *pRuleset)
}
+/* rgerhards 2012-04-18: set associated ruleset (by ruleset name)
+ * If ruleset cannot be found, no update is done.
+ */
+static void
+MsgSetRulesetByName(msg_t *pMsg, cstr_t *rulesetName)
+{
+ rulesetGetRuleset(&(pMsg->pRuleset), rsCStrGetSzStrNoNULL(rulesetName));
+}
+
+
/* set TAG in msg object
* (rewritten 2009-06-18 rgerhards)
*/
@@ -3196,8 +3212,13 @@ rsRetVal MsgSetProperty(msg_t *pThis, var_t *pProp)
memcpy(&pThis->tRcvdAt, &pProp->val.vSyslogTime, sizeof(struct syslogTime));
} else if(isProp("tTIMESTAMP")) {
memcpy(&pThis->tTIMESTAMP, &pProp->val.vSyslogTime, sizeof(struct syslogTime));
+ } else if(isProp("pszRuleset")) {
+ MsgSetRulesetByName(pThis, pProp->val.pStr);
} else if(isProp("pszMSG")) {
dbgprintf("no longer supported property pszMSG silently ignored\n");
+ } else {
+ dbgprintf("unknown supported property '%s' silently ignored\n",
+ rsCStrGetSzStrNoNULL(pProp->pcsName));
}
finalize_it:
diff --git a/runtime/ruleset.c b/runtime/ruleset.c
index 69968a52..2f307f05 100644
--- a/runtime/ruleset.c
+++ b/runtime/ruleset.c
@@ -315,8 +315,8 @@ GetRulesetQueue(ruleset_t *pThis)
/* Find the ruleset with the given name and return a pointer to its object.
*/
-static rsRetVal
-GetRuleset(ruleset_t **ppRuleset, uchar *pszName)
+rsRetVal
+rulesetGetRuleset(ruleset_t **ppRuleset, uchar *pszName)
{
DEFiRet;
assert(ppRuleset != NULL);
@@ -338,7 +338,7 @@ SetDefaultRuleset(uchar *pszName)
DEFiRet;
assert(pszName != NULL);
- CHKiRet(GetRuleset(&pRuleset, pszName));
+ CHKiRet(rulesetGetRuleset(&pRuleset, pszName));
pDfltRuleset = pRuleset;
dbgprintf("default rule set changed to %p: '%s'\n", pRuleset, pszName);
@@ -356,7 +356,7 @@ SetCurrRuleset(uchar *pszName)
DEFiRet;
assert(pszName != NULL);
- CHKiRet(GetRuleset(&pRuleset, pszName));
+ CHKiRet(rulesetGetRuleset(&pRuleset, pszName));
pCurrRuleset = pRuleset;
dbgprintf("current rule set changed to %p: '%s'\n", pRuleset, pszName);
@@ -594,7 +594,7 @@ CODESTARTobjQueryInterface(ruleset)
pIf->SetName = setName;
pIf->DebugPrintAll = debugPrintAll;
pIf->GetCurrent = GetCurrent;
- pIf->GetRuleset = GetRuleset;
+ pIf->GetRuleset = rulesetGetRuleset;
pIf->SetDefaultRuleset = SetDefaultRuleset;
pIf->SetCurrRuleset = SetCurrRuleset;
pIf->GetRulesetQueue = GetRulesetQueue;
diff --git a/runtime/ruleset.h b/runtime/ruleset.h
index b055a71d..52e633eb 100644
--- a/runtime/ruleset.h
+++ b/runtime/ruleset.h
@@ -54,6 +54,7 @@ BEGINinterface(ruleset) /* name must also be changed in ENDinterface macro! */
qqueue_t* (*GetRulesetQueue)(ruleset_t*);
/* v3, 2009-11-04 */
parserList_t* (*GetParserList)(msg_t *);
+ /* v4 */
ENDinterface(ruleset)
#define rulesetCURR_IF_VERSION 4 /* increment whenever you change the interface structure! */
@@ -61,4 +62,18 @@ ENDinterface(ruleset)
/* prototypes */
PROTOTYPEObj(ruleset);
+
+/* Get name associated to ruleset. This function cannot fail (except,
+ * of course, if previously something went really wrong). Returned
+ * pointer is read-only.
+ * rgerhards, 2012-04-18
+ */
+static inline uchar*
+rulesetGetName(ruleset_t *pRuleset)
+{
+ return pRuleset->pszName;
+}
+
+
+rsRetVal rulesetGetRuleset(ruleset_t **ppRuleset, uchar *pszName);
#endif /* #ifndef INCLUDED_RULESET_H */