diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2009-12-16 15:30:45 +0100 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2009-12-16 15:30:45 +0100 |
commit | b61be5dccaacfdfa7878e5e497022e073081f5f8 (patch) | |
tree | 00dc3d049b77685d9a672eccab6c6abfb98aa4bf | |
parent | 42ff3e6bc13cbece7a2959935aa9200e6cbe1051 (diff) | |
download | rsyslog-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.
-rw-r--r-- | action.c | 22 | ||||
-rw-r--r-- | doc/action_state.dot | 1 |
2 files changed, 21 insertions, 2 deletions
@@ -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 diff --git a/doc/action_state.dot b/doc/action_state.dot index d56d9da0..2f36d8da 100644 --- a/doc/action_state.dot +++ b/doc/action_state.dot @@ -20,6 +20,7 @@ digraph msgState { susp [label="suspended"] rdy -> itx [label="transaction begins"] + rdy -> rtry [label="begin tx\nerror"] itx -> itx [label="success"] itx -> comm [label="commit\n(caller or auto)"] itx -> rtry [label="error"] |