summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2013-11-14 15:51:52 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2013-11-14 15:51:52 +0100
commit2387c9281d847b68f9c6268c1ba5e557e78f906c (patch)
treea4052fc66312709b4d7c25ed56d462f2c889c602
parentf6e6e5edf172a06a20305895bcf0bf8509f08261 (diff)
downloadrsyslog-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.h1
-rw-r--r--runtime/rsconf.c9
-rw-r--r--runtime/ruleset.c22
-rw-r--r--runtime/ruleset.h1
-rw-r--r--tools/syslogd.c9
5 files changed, 38 insertions, 4 deletions
diff --git a/dirty.h b/dirty.h
index e0a6e26e..3f8e30d5 100644
--- a/dirty.h
+++ b/dirty.h
@@ -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"); \
}