From 365020c5c0823c91a8011e34597f970a7cfb4fb3 Mon Sep 17 00:00:00 2001 From: Tusa Viktor Date: Wed, 23 Apr 2014 17:10:58 +0000 Subject: [PATCH] logwriter: still free the unconsumed item during reloading configuration Upstream-Status: Backport Otherwise we have no chance to free this stuff. Reported-by: Xufeng Zhang Signed-off-by: Tusa Viktor Signed-off-by: Gergely Nagy --- lib/logproto/logproto-client.h | 2 +- lib/logproto/logproto-text-client.c | 11 +++++++++++ lib/logwriter.c | 9 +++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/logproto/logproto-client.h b/lib/logproto/logproto-client.h index 254ecf9..5adc917 100644 --- a/lib/logproto/logproto-client.h +++ b/lib/logproto/logproto-client.h @@ -47,7 +47,6 @@ void log_proto_client_options_defaults(LogProtoClientOptions *options); void log_proto_client_options_init(LogProtoClientOptions *options, GlobalConfig *cfg); void log_proto_client_options_destroy(LogProtoClientOptions *options); - struct _LogProtoClient { LogProtoStatus status; @@ -107,6 +106,7 @@ log_proto_client_reset_error(LogProtoClient *s) gboolean log_proto_client_validate_options(LogProtoClient *self); void log_proto_client_init(LogProtoClient *s, LogTransport *transport, const LogProtoClientOptions *options); void log_proto_client_free(LogProtoClient *s); +void log_proto_client_free_method(LogProtoClient *s); #define DEFINE_LOG_PROTO_CLIENT(prefix) \ static gpointer \ diff --git a/lib/logproto/logproto-text-client.c b/lib/logproto/logproto-text-client.c index 3248759..a5100f3 100644 --- a/lib/logproto/logproto-text-client.c +++ b/lib/logproto/logproto-text-client.c @@ -146,12 +146,23 @@ log_proto_text_client_post(LogProtoClient *s, guchar *msg, gsize msg_len, gboole } void +log_proto_text_client_free(LogProtoClient *s) +{ + LogProtoTextClient *self = (LogProtoTextClient *)s; + if (self->partial_free) + self->partial_free(self->partial); + self->partial = NULL; + log_proto_client_free_method(s); +}; + +void log_proto_text_client_init(LogProtoTextClient *self, LogTransport *transport, const LogProtoClientOptions *options) { log_proto_client_init(&self->super, transport, options); self->super.prepare = log_proto_text_client_prepare; self->super.flush = log_proto_text_client_flush; self->super.post = log_proto_text_client_post; + self->super.free_fn = log_proto_text_client_free; self->super.transport = transport; self->next_state = -1; } diff --git a/lib/logwriter.c b/lib/logwriter.c index 3292e31..470bcdb 100644 --- a/lib/logwriter.c +++ b/lib/logwriter.c @@ -1063,8 +1063,13 @@ log_writer_flush(LogWriter *self, LogWriterFlushMode flush_mode) } else { - /* push back to the queue */ - log_queue_push_head(self->queue, lm, &path_options); + if (flush_mode == LW_FLUSH_QUEUE) + log_msg_unref(lm); + else + { + /* push back to the queue */ + log_queue_push_head(self->queue, lm, &path_options); + } msg_set_context(NULL); log_msg_refcache_stop(); break; -- 1.7.10.4