diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2011-05-11 10:16:07 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2011-05-11 10:16:07 +0200 |
commit | 702bac6dd6b391fbbd7ef9b74a1e171d6a62c144 (patch) | |
tree | 2259862e63f141dbd637b18a641d843d0dae0cea | |
parent | 1d41b9540ccf8b6714135737855ab71ee75f4364 (diff) | |
parent | cdae37d737cae680a96dead7a322b2ee975c92a1 (diff) | |
download | rsyslog-702bac6dd6b391fbbd7ef9b74a1e171d6a62c144.tar.gz rsyslog-702bac6dd6b391fbbd7ef9b74a1e171d6a62c144.tar.xz rsyslog-702bac6dd6b391fbbd7ef9b74a1e171d6a62c144.zip |
Merge branch 'v4-stable' into v4-devel
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | runtime/queue.c | 8 |
2 files changed, 16 insertions, 2 deletions
@@ -74,6 +74,16 @@ Version 4.7.0 [v4-devel] (rgerhards), 2010-04-14 Thanks to varmojfekoj for the patch [imported from 4.5.8] --------------------------------------------------------------------------- Version 4.6.6 [v4-stable] (rgerhards), 2010-11-?? +- bugfix: invalid processing in QUEUE_FULL condition + If the the multi-submit interface was used and a QUEUE_FULL condition + occured, the failed message was properly destructed. However, the + rest of the input batch, if it existed, was not processed. So this + lead to potential loss of messages and a memory leak. The potential + loss of messages was IMHO minor, because they would have been dropped + in most cases due to the queue remaining full, but very few lucky ones + from the batch may have made it. Anyhow, this has now been changed so + that the rest of the batch is properly tried to be enqueued and, if + not possible, destructed. - bugfix: invalid storage type for config variables - bugfix: stream driver mode was not correctly set on tcp ouput on big endian systems. diff --git a/runtime/queue.c b/runtime/queue.c index 0c9d863f..9c7f96d0 100644 --- a/runtime/queue.c +++ b/runtime/queue.c @@ -2209,6 +2209,7 @@ qqueueEnqObj(qqueue_t *pThis, flowControl_t flowCtlType, void *pUsr) objDestruct(pUsr); ABORT_FINALIZE(RS_RET_QUEUE_FULL); } + dbgoprint((obj_t*) pThis, "enqueueMsg: wait solved queue full condition, enqueing\n"); } /* and finally enqueue the message */ @@ -2295,6 +2296,7 @@ doEnqSingleObj(qqueue_t *pThis, flowControl_t flowCtlType, void *pUsr) objDestruct(pUsr); ABORT_FINALIZE(RS_RET_QUEUE_FULL); } + dbgoprint((obj_t*) pThis, "enqueueMsg: wait solved queue full condition, enqueing\n"); } /* and finally enqueue the message */ @@ -2318,6 +2320,7 @@ qqueueMultiEnqObj(qqueue_t *pThis, multi_submit_t *pMultiSub) { int iCancelStateSave; int i; + rsRetVal localRet; DEFiRet; ISOBJ_TYPE_assert(pThis, qqueue); @@ -2329,8 +2332,9 @@ qqueueMultiEnqObj(qqueue_t *pThis, multi_submit_t *pMultiSub) } for(i = 0 ; i < pMultiSub->nElem ; ++i) { -dbgprintf("queueMultiEnq: %d\n", i); - CHKiRet(doEnqSingleObj(pThis, pMultiSub->ppMsgs[i]->flowCtlType, (void*)pMultiSub->ppMsgs[i])); + localRet = doEnqSingleObj(pThis, pMultiSub->ppMsgs[i]->flowCtlType, (void*)pMultiSub->ppMsgs[i]); + if(localRet != RS_RET_OK && localRet != RS_RET_QUEUE_FULL) + ABORT_FINALIZE(localRet); } finalize_it: |