summaryrefslogtreecommitdiffstats
path: root/action.c
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2009-12-16 15:30:45 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2009-12-16 15:30:45 +0100
commitb61be5dccaacfdfa7878e5e497022e073081f5f8 (patch)
tree00dc3d049b77685d9a672eccab6c6abfb98aa4bf /action.c
parent42ff3e6bc13cbece7a2959935aa9200e6cbe1051 (diff)
downloadrsyslog-b61be5dccaacfdfa7878e5e497022e073081f5f8.tar.gz
rsyslog-b61be5dccaacfdfa7878e5e497022e073081f5f8.tar.xz
rsyslog-b61be5dccaacfdfa7878e5e497022e073081f5f8.zip
bugfix: error during beginTransaction() was not properly handled
Suspension during beginTransaction() did not properly cause the action to be suspended, thus we entered an endless loop.
Diffstat (limited to 'action.c')
-rw-r--r--action.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/action.c b/action.c
index 9178b991..5724de2f 100644
--- a/action.c
+++ b/action.c
@@ -491,14 +491,17 @@ static rsRetVal actionDoRetry(action_t *pThis, time_t ttNow)
ASSERT(pThis != NULL);
+dbgprintf("XXX: we are doing a retry, action state %d\n", pThis->eState);
iRetries = 0;
while(pThis->eState == ACT_STATE_RTRY) {
iRet = pThis->pMod->tryResume(pThis->pModData);
+dbgprintf("XXX: result of tryResume %d\n", iRet);
if(iRet == RS_RET_OK) {
actionSetState(pThis, ACT_STATE_RDY);
} else if(iRet == RS_RET_SUSPENDED) {
/* max retries reached? */
if((pThis->iResumeRetryCount != -1 && iRetries >= pThis->iResumeRetryCount)) {
+dbgprintf("XXX: action suspeneded!\n");
actionSuspend(pThis, ttNow);
} else {
++pThis->iNbrResRtry;
@@ -530,6 +533,7 @@ static rsRetVal actionTryResume(action_t *pThis)
ASSERT(pThis != NULL);
+dbgprintf("XXX: actionTryResume, action state %d\n", pThis->eState);
if(pThis->eState == ACT_STATE_SUSP) {
/* if we are suspended, we need to check if the timeout expired.
* for this handling, we must always obtain a fresh timestamp. We used
@@ -575,8 +579,20 @@ static rsRetVal actionPrepare(action_t *pThis)
* action state accordingly
*/
if(pThis->eState == ACT_STATE_RDY) {
- CHKiRet(pThis->pMod->mod.om.beginTransaction(pThis->pModData));
- actionSetState(pThis, ACT_STATE_ITX);
+ iRet = pThis->pMod->mod.om.beginTransaction(pThis->pModData);
+dbgprintf("XXX: actionPrepare, result of beginTranscation %d\n", iRet);
+ switch(iRet) {
+ case RS_RET_OK:
+ actionSetState(pThis, ACT_STATE_ITX);
+ break;
+ case RS_RET_SUSPENDED:
+ actionRetry(pThis);
+ break;
+ case RS_RET_DISABLE_ACTION:
+ actionDisable(pThis);
+ break;
+ default:FINALIZE;
+ }
}
finalize_it:
@@ -701,6 +717,7 @@ actionCallDoAction(action_t *pThis, msg_t *pMsg)
pThis->bHadAutoCommit = 0;
iRet = pThis->pMod->mod.om.doAction(pThis->ppMsgs, pMsg->msgFlags, pThis->pModData);
+dbgprintf("XXX: result of doAction: %d\n", iRet);
switch(iRet) {
case RS_RET_OK:
actionCommitted(pThis);
@@ -891,6 +908,7 @@ submitBatch(action_t *pAction, batch_t *pBatch, int nElem, int *pbShutdownImmedi
bDone = 0;
do {
localRet = tryDoAction(pAction, pBatch, &nElem, pbShutdownImmediate);
+dbgprintf("submitBatch: localRet %d\n", localRet);
if(localRet == RS_RET_FORCE_TERM)
FINALIZE;
if( localRet == RS_RET_OK