File syslog-ng-logwriter-100-CPU-usage.diff of Package syslog-ng

From ab0b9b75a2f69e9e66fe5727fe6c5a4ca4acac99 Mon Sep 17 00:00:00 2001
From: Balazs Scheidler <bazsi@balabit.hu>
Date: Mon, 5 Oct 2009 12:33:07 +0200
Subject: [PATCH 2/2] [logwriter] fixed a 100% CPU usage if a udp destination is down

Sometimes when a UDP destination is down we get POLLERR from poll. This
was not always propagated to the dispatch handler by GLib if
pollfd.events was 0.

This patch makes sure that at least G_IO_ERR is present in the "events"
field in logreader/logwriter.

Reported-By: Sandor Geller
---
 src/logreader.c |    4 ++--
 src/logwriter.c |    7 +++----
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/logreader.c b/src/logreader.c
index 9ca53a0..58ee2aa 100644
--- a/src/logreader.c
+++ b/src/logreader.c
@@ -62,7 +62,7 @@ log_reader_fd_prepare(GSource *source,
 #endif
 
   self->pollfd.revents = 0;
-  self->pollfd.events = 0;
+  self->pollfd.events = G_IO_ERR;
   
   /* never indicate readability if flow control prevents us from sending messages */
   
@@ -83,7 +83,7 @@ log_reader_fd_prepare(GSource *source,
       return FALSE;
     }
   
-  self->pollfd.events = G_IO_IN;
+  self->pollfd.events |= G_IO_IN;
   return FALSE;
 }
 
diff --git a/src/logwriter.c b/src/logwriter.c
index 7a5fcf7..79e1a0a 100644
--- a/src/logwriter.c
+++ b/src/logwriter.c
@@ -50,12 +50,14 @@ log_writer_fd_prepare(GSource *source,
   LogWriterWatch *self = (LogWriterWatch *) source;
   gint num_elements = self->writer->queue->length / 2;
 
+  self->pollfd.events = G_IO_ERR;
+  self->pollfd.revents = 0;
   if (self->writer->partial ||
       (self->writer->options->flush_lines == 0 && num_elements != 0) ||
       (self->writer->options->flush_lines > 0  && num_elements >= self->writer->options->flush_lines))
     {
       /* we need to flush our buffers */
-      self->pollfd.events = self->fd->cond;
+      self->pollfd.events |= self->fd->cond;
     }
   else if (num_elements)
     {
@@ -96,13 +98,10 @@ log_writer_fd_prepare(GSource *source,
         }
       return FALSE;
     }
-  else
-    self->pollfd.events = 0;
   
   if (self->writer->flags & LW_DETECT_EOF)
     self->pollfd.events |= G_IO_HUP | G_IO_IN;
   self->flush_waiting_for_timeout = FALSE;
-  self->pollfd.revents = 0;
   return FALSE;
 }
 
-- 
1.6.4.2

openSUSE Build Service is sponsored by