diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2012-06-01 16:09:59 +0200 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2012-06-01 16:09:59 +0200 |
commit | 1b6d14f8aba6ee302c9fe063ddf900305eaefeb3 (patch) | |
tree | 719aee5e69ff1dd9dcd1ae3add59febda1c86499 /runtime/queue.c | |
parent | f4ec11fa779e7348f68ece1b3b50d499a0526ace (diff) | |
parent | 9020647cdcdb0ef132491838e36c870f4e4e90ea (diff) | |
download | rsyslog-1b6d14f8aba6ee302c9fe063ddf900305eaefeb3.tar.gz rsyslog-1b6d14f8aba6ee302c9fe063ddf900305eaefeb3.tar.xz rsyslog-1b6d14f8aba6ee302c9fe063ddf900305eaefeb3.zip |
Merge branch 'v5-stable' into v5-beta
Conflicts:
runtime/queue.c
Diffstat (limited to 'runtime/queue.c')
-rw-r--r-- | runtime/queue.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/runtime/queue.c b/runtime/queue.c index 50c65c5e..94cc1fcd 100644 --- a/runtime/queue.c +++ b/runtime/queue.c @@ -2385,21 +2385,27 @@ doEnqSingleObj(qqueue_t *pThis, flowControl_t flowCtlType, void *pUsr) while( (pThis->iMaxQueueSize > 0 && pThis->iQueueSize >= pThis->iMaxQueueSize) || (pThis->qType == QUEUETYPE_DISK && pThis->sizeOnDiskMax != 0 && pThis->tVars.disk.sizeOnDisk > pThis->sizeOnDiskMax)) { - DBGOPRINT((obj_t*) pThis, "enqueueMsg: queue FULL - waiting to drain.\n"); - if(glbl.GetGlobalInputTermState()) { - DBGOPRINT((obj_t*) pThis, "enqueueMsg: queue FULL, discard due to FORCE_TERM.\n"); - ABORT_FINALIZE(RS_RET_FORCE_TERM); - } - timeoutComp(&t, pThis->toEnq); STATSCOUNTER_INC(pThis->ctrFull, pThis->mutCtrFull); -// TODO : handle enqOnly => discard! - if(pthread_cond_timedwait(&pThis->notFull, pThis->mut, &t) != 0) { - DBGOPRINT((obj_t*) pThis, "enqueueMsg: cond timeout, dropping message!\n"); + if(pThis->toEnq == 0 || pThis->bEnqOnly) { + DBGOPRINT((obj_t*) pThis, "enqueueMsg: queue FULL - configured for immediate discarding.\n"); STATSCOUNTER_INC(pThis->ctrFDscrd, pThis->mutCtrFDscrd); objDestruct(pUsr); ABORT_FINALIZE(RS_RET_QUEUE_FULL); - } + } else { + DBGOPRINT((obj_t*) pThis, "enqueueMsg: queue FULL - waiting %dms to drain.\n", pThis->toEnq); + if(glbl.GetGlobalInputTermState()) { + DBGOPRINT((obj_t*) pThis, "enqueueMsg: queue FULL, discard due to FORCE_TERM.\n"); + ABORT_FINALIZE(RS_RET_FORCE_TERM); + } + timeoutComp(&t, pThis->toEnq); + if(pthread_cond_timedwait(&pThis->notFull, pThis->mut, &t) != 0) { + DBGOPRINT((obj_t*) pThis, "enqueueMsg: cond timeout, dropping message!\n"); + STATSCOUNTER_INC(pThis->ctrFDscrd, pThis->mutCtrFDscrd); + 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 */ |