summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2011-05-11 10:16:07 +0200
committerRainer Gerhards <rgerhards@adiscon.com>2011-05-11 10:16:07 +0200
commit702bac6dd6b391fbbd7ef9b74a1e171d6a62c144 (patch)
tree2259862e63f141dbd637b18a641d843d0dae0cea
parent1d41b9540ccf8b6714135737855ab71ee75f4364 (diff)
parentcdae37d737cae680a96dead7a322b2ee975c92a1 (diff)
downloadrsyslog-702bac6dd6b391fbbd7ef9b74a1e171d6a62c144.tar.gz
rsyslog-702bac6dd6b391fbbd7ef9b74a1e171d6a62c144.tar.xz
rsyslog-702bac6dd6b391fbbd7ef9b74a1e171d6a62c144.zip
Merge branch 'v4-stable' into v4-devel
-rw-r--r--ChangeLog10
-rw-r--r--runtime/queue.c8
2 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 197c8bc2..def49c8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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: