summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2011-02-11 17:47:30 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2011-02-11 17:47:30 +0100
commitf3d354da3e373f9c4890a78e5274a6ba02f1c8cb (patch)
tree9fd7c964af36dfa1802bf08173fefca2a9453a4e
parent6a18d25cbec2676a7910ff038170716293abe89f (diff)
downloadrsyslog-f3d354da3e373f9c4890a78e5274a6ba02f1c8cb.tar.gz
rsyslog-f3d354da3e373f9c4890a78e5274a6ba02f1c8cb.tar.xz
rsyslog-f3d354da3e373f9c4890a78e5274a6ba02f1c8cb.zip
bugfix: very long running actions could prevent shutdown under some circumstances
This has now been solved, at least for common situations.
-rw-r--r--ChangeLog3
-rw-r--r--plugins/imfile/imfile.c6
-rw-r--r--runtime/queue.c2
-rw-r--r--threads.c6
4 files changed, 11 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 6e34a436..7d2bbc20 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -11,6 +11,9 @@ Version 5.7.4 [V5-BETA] (rgerhards), 2011-02-??
when in disk-assisted mode. This especially affected imfile, which
created unnecessarily queue files if a large set of input file data was
to process.
+- bugfix: very long running actions could prevent shutdown under some
+ circumstances. This has now been solved, at least for common
+ situations.
---------------------------------------------------------------------------
Version 5.7.3 [V5-BETA] (rgerhards), 2011-02-07
- added support for processing multi-line messages in imfile
diff --git a/plugins/imfile/imfile.c b/plugins/imfile/imfile.c
index 7f6b9c24..c71e425e 100644
--- a/plugins/imfile/imfile.c
+++ b/plugins/imfile/imfile.c
@@ -291,13 +291,13 @@ CODESTARTrunInput
pthread_cleanup_push(inputModuleCleanup, NULL);
while(glbl.GetGlobalInputTermState() == 0) {
do {
- if(glbl.GetGlobalInputTermState() == 1)
- break; /* terminate input! */
bHadFileData = 0;
for(i = 0 ; i < iFilPtr ; ++i) {
+ if(glbl.GetGlobalInputTermState() == 1)
+ break; /* terminate input! */
pollFile(&files[i], &bHadFileData);
}
- } while(iFilPtr > 1 && bHadFileData == 1); /* warning: do...while()! */
+ } while(iFilPtr > 1 && bHadFileData == 1 && glbl.GetGlobalInputTermState() == 0); /* warning: do...while()! */
/* Note: the additional 10ns wait is vitally important. It guards rsyslog against totally
* hogging the CPU if the users selects a polling interval of 0 seconds. It doesn't hurt any
diff --git a/runtime/queue.c b/runtime/queue.c
index 9f63a338..76327f6a 100644
--- a/runtime/queue.c
+++ b/runtime/queue.c
@@ -1497,7 +1497,7 @@ DequeueConsumable(qqueue_t *pThis, wti_t *pWti)
* now that we dequeue batches of pointers, this is much less an issue...
* rgerhards, 2009-04-22
*/
- if(iQueueSize < pThis->iFullDlyMrk / 2) {
+ if(iQueueSize < pThis->iFullDlyMrk / 2 || glbl.GetGlobalInputTermState() == 1) {
pthread_cond_broadcast(&pThis->belowFullDlyWtrMrk);
}
diff --git a/threads.c b/threads.c
index d4e14527..fcafce4b 100644
--- a/threads.c
+++ b/threads.c
@@ -101,12 +101,14 @@ thrdTerminateNonCancel(thrdInfo_t *pThis)
do {
d_pthread_mutex_lock(&pThis->mutThrd);
pthread_kill(pThis->thrdID, SIGTTIN);
- timeoutComp(&tTimeout, 10); /* a fixed 10ms timeout, do after lock (may take long!) */
+ timeoutComp(&tTimeout, 1000); /* a fixed 1sec timeout */
ret = d_pthread_cond_timedwait(&pThis->condThrdTerm, &pThis->mutThrd, &tTimeout);
d_pthread_mutex_unlock(&pThis->mutThrd);
if(Debug) {
if(ret == ETIMEDOUT) {
- dbgprintf("input thread term: had a timeout waiting on thread termination\n");
+ dbgprintf("input thread term: timeout expired waiting on thread termination - canceling\n");
+ pthread_cancel(pThis->thrdID);
+ pThis->bIsActive = 0;
} else if(ret == 0) {
dbgprintf("input thread term: thread returned normally and is terminated\n");
} else {