diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2013-11-14 15:51:52 +0100 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2013-11-14 15:51:52 +0100 |
commit | 2387c9281d847b68f9c6268c1ba5e557e78f906c (patch) | |
tree | a4052fc66312709b4d7c25ed56d462f2c889c602 | |
parent | f6e6e5edf172a06a20305895bcf0bf8509f08261 (diff) | |
download | rsyslog-2387c9281d847b68f9c6268c1ba5e557e78f906c.tar.gz rsyslog-2387c9281d847b68f9c6268c1ba5e557e78f906c.tar.bz2 rsyslog-2387c9281d847b68f9c6268c1ba5e557e78f906c.zip |
fix: ruleset queues were activated too early
This does not cause issues in v7, but here we have the problem
that the total number of actions, which now is required for wti sizing,
is not available at that early stage. So we needed to delay queue
startup until everything is processed (just as it should have been
already!). Note the previously we could have a segfault on first message
when ruleset queues were used.
-rw-r--r-- | dirty.h | 1 | ||||
-rw-r--r-- | runtime/rsconf.c | 9 | ||||
-rw-r--r-- | runtime/ruleset.c | 22 | ||||
-rw-r--r-- | runtime/ruleset.h | 1 | ||||
-rw-r--r-- | tools/syslogd.c | 9 |
5 files changed, 38 insertions, 4 deletions
@@ -36,6 +36,7 @@ rsRetVal logmsgInternal(int iErr, int pri, uchar *msg, int flags); rsRetVal __attribute__((deprecated)) parseAndSubmitMessage(uchar *hname, uchar *hnameIP, uchar *msg, int len, int flags, flowControl_t flowCtlTypeu, prop_t *pInputName, struct syslogTime *stTime, time_t ttGenTime, ruleset_t *pRuleset); rsRetVal diagGetMainMsgQSize(int *piSize); /* for imdiag */ rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct nvlst *lst); +rsRetVal startMainQueue(qqueue_t *pQueue); extern int MarkInterval; extern qqueue_t *pMsgQueue; /* the main message queue */ diff --git a/runtime/rsconf.c b/runtime/rsconf.c index c855779e..f2feb989 100644 --- a/runtime/rsconf.c +++ b/runtime/rsconf.c @@ -679,8 +679,12 @@ activateMainQueue() mainqCnfObj = glbl.GetmainqCnfObj(); DBGPRINTF("activateMainQueue: mainq cnf obj ptr is %p\n", mainqCnfObj); /* create message queue */ - CHKiRet_Hdlr(createMainQueue(&pMsgQueue, UCHAR_CONSTANT("main Q"), - (mainqCnfObj == NULL) ? NULL : mainqCnfObj->nvlst)) { + iRet = createMainQueue(&pMsgQueue, UCHAR_CONSTANT("main Q"), + (mainqCnfObj == NULL) ? NULL : mainqCnfObj->nvlst); + if(iRet == RS_RET_OK) { + iRet = startMainQueue(pMsgQueue); + } + if(iRet != RS_RET_OK) { /* no queue is fatal, we need to give up in that case... */ fprintf(stderr, "fatal error %d: could not create message queue - rsyslogd can not run!\n", iRet); FINALIZE; @@ -743,6 +747,7 @@ activate(rsconf_t *cnf) tellModulesActivateConfig(); startInputModules(); CHKiRet(activateActions()); + CHKiRet(activateRulesetQueues()); CHKiRet(activateMainQueue()); /* finally let the inputs run... */ runInputModules(); diff --git a/runtime/ruleset.c b/runtime/ruleset.c index 2e8d1f0f..e217b3e0 100644 --- a/runtime/ruleset.c +++ b/runtime/ruleset.c @@ -161,6 +161,28 @@ finalize_it: RETiRet; } +/* driver to iterate over all rulesets */ +DEFFUNC_llExecFunc(doActivateRulesetQueues) +{ + DEFiRet; + ruleset_t* pThis = (ruleset_t*) pData; + dbgprintf("Activating Ruleset Queue[%p] for Ruleset %s\n", + pThis->pQueue, pThis->pszName); + if(pThis->pQueue != NULL) + startMainQueue(pThis->pQueue); + RETiRet; +} +/* activate all ruleset queues */ +rsRetVal +activateRulesetQueues() +{ + DEFiRet; + + llExecFunc(&(runConf->rulesets.llRulesets), doActivateRulesetQueues, NULL); + + RETiRet; +} + static void execAct(struct cnfstmt *stmt, msg_t *pMsg, wti_t *pWti) diff --git a/runtime/ruleset.h b/runtime/ruleset.h index 0af3578c..d3dfd664 100644 --- a/runtime/ruleset.h +++ b/runtime/ruleset.h @@ -105,6 +105,7 @@ rulesetHasQueue(ruleset_t *pRuleset) rsRetVal rulesetGetRuleset(rsconf_t *conf, ruleset_t **ppRuleset, uchar *pszName); rsRetVal rulesetOptimizeAll(rsconf_t *conf); rsRetVal rulesetProcessCnf(struct cnfobj *o); +rsRetVal activateRulesetQueues(void); /* Set a current rule set to already-known pointer */ static inline void diff --git a/tools/syslogd.c b/tools/syslogd.c index 7543d338..052a9329 100644 --- a/tools/syslogd.c +++ b/tools/syslogd.c @@ -1121,9 +1121,14 @@ rsRetVal createMainQueue(qqueue_t **ppQueue, uchar *pszQueueName, struct nvlst * qqueueSetDefaultsRulesetQueue(*ppQueue); qqueueApplyCnfParam(*ppQueue, lst); } + RETiRet; +} - /* ... and finally start the queue! */ - CHKiRet_Hdlr(qqueueStart(*ppQueue)) { +rsRetVal +startMainQueue(qqueue_t *pQueue) +{ + DEFiRet; + CHKiRet_Hdlr(qqueueStart(pQueue)) { /* no queue is fatal, we need to give up in that case... */ errmsg.LogError(0, iRet, "could not start (ruleset) main message queue"); \ } |