summaryrefslogtreecommitdiffstats
path: root/runtime/stream.c
diff options
context:
space:
mode:
authorRainer Gerhards <rgerhards@adiscon.com>2010-03-10 07:36:38 +0100
committerRainer Gerhards <rgerhards@adiscon.com>2010-03-10 07:36:38 +0100
commit5996414f04118dec4f1dcc12c88ee8c68f6e89ad (patch)
tree15dc13ca78aec4cfd0c7f222729815b50d9d8705 /runtime/stream.c
parent3d80d6ba301e4d26b646c84d621ebe880ebc513f (diff)
downloadrsyslog-5996414f04118dec4f1dcc12c88ee8c68f6e89ad.tar.gz
rsyslog-5996414f04118dec4f1dcc12c88ee8c68f6e89ad.tar.xz
rsyslog-5996414f04118dec4f1dcc12c88ee8c68f6e89ad.zip
bugfixes and testbench improvement
- improved testbench - bugfix: potential data loss during file stream shutdown - bugfix: potential problems during file stream shutdown The shutdown/close sequence was not clean, what potentially (but unlikely) could lead to some issues. We have not been able to describe any fatal cases, but there was some bug potential. Sequence has now been straighted out.
Diffstat (limited to 'runtime/stream.c')
-rw-r--r--runtime/stream.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/runtime/stream.c b/runtime/stream.c
index 82718099..5396bae0 100644
--- a/runtime/stream.c
+++ b/runtime/stream.c
@@ -306,20 +306,22 @@ strmWaitAsyncWriterDone(strm_t *pThis)
/* close a strm file
* Note that the bDeleteOnClose flag is honored. If it is set, the file will be
* deleted after close. This is in support for the qRead thread.
+ * Note: it is valid to call this function when the physical file is closed. If so,
+ * strmCloseFile() will still check if there is any unwritten data inside buffers
+ * (this may be the case) and, if so, will open the file, write the data, and then
+ * close it again (this is done via strmFlush and friends).
*/
static rsRetVal strmCloseFile(strm_t *pThis)
{
DEFiRet;
ASSERT(pThis != NULL);
- ASSERT(pThis->fd != -1);
dbgoprint((obj_t*) pThis, "file %d closing\n", pThis->fd);
if(!pThis->bInClose && pThis->tOperationsMode != STREAMMODE_READ) {
pThis->bInClose = 1;
+ strmFlush(pThis);
if(pThis->bAsyncWrite) {
- strmFlush(pThis);
- } else {
strmWaitAsyncWriterDone(pThis);
}
pThis->bInClose = 0;
@@ -685,8 +687,10 @@ CODESTARTobjDestruct(strm)
/* Note: mutex will be unlocked in stopWriter! */
d_pthread_mutex_lock(&pThis->mut);
- if(pThis->tOperationsMode != STREAMMODE_READ)
- strmFlush(pThis);
+ /* strmClose() will handle read-only files as well as need to open
+ * files that have unwritten buffers. -- rgerhards, 2010-03-09
+ */
+ strmCloseFile(pThis);
if(pThis->bAsyncWrite) {
stopWriter(pThis);
@@ -705,9 +709,6 @@ CODESTARTobjDestruct(strm)
* IMPORTANT: we MUST free this only AFTER the ansyncWriter has been stopped, else
* we get random errors...
*/
- if(pThis->fd != -1)
- strmCloseFile(pThis);
-
free(pThis->pszDir);
free(pThis->pZipBuf);
free(pThis->pszCurrFName);