From b61be5dccaacfdfa7878e5e497022e073081f5f8 Mon Sep 17 00:00:00 2001 From: Rainer Gerhards Date: Wed, 16 Dec 2009 15:30:45 +0100 Subject: 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. --- action.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'action.c') 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 -- cgit