[patches] Re: [commits] [tarantool] 01/01: log: Fix log rotation is not async signal safe

Konstantin Osipov kostja at tarantool.org
Tue Jan 30 22:47:53 MSK 2018


* IlyaMarkovMipt <markovilya197 at gmail.com> [18/01/24 13:34]:
> commit a254d2b1cd8fb316ac3ad3ae36d59686d86cc8e8
> Author: IlyaMarkovMipt <markovilya197 at gmail.com>
> AuthorDate: Tue Jan 23 16:23:29 2018 +0300
> 
>     log: Fix log rotation is not async signal safe
>     
>     * Refactor signal handling with ev_signal.
>     * Add another signal watcher in main.
>     
>     We claim multiple loggers non-thread-safe,
>     so concurrency in logrotate signal handler
>     should not be considered.

I'd be very cautious to make log rotation non-asynchronous. 
If we run out of disk space, and the logger goes to a file,
write() can be completely stuck until there is available disk
space. In this case the entire event loop will be stuck, and
the system will sit in a dead lock.
>     
>     Relates #3015
> ---
>  src/lua/log.lua | 8 ++++++--
>  src/main.cc     | 3 ++-
>  src/say.c       | 7 ++++---
>  src/say.h       | 5 ++++-
>  4 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/src/lua/log.lua b/src/lua/log.lua
> index b90eb88..0ac0e8f 100644
> --- a/src/lua/log.lua
> +++ b/src/lua/log.lua
> @@ -12,7 +12,11 @@ ffi.cdef[[
>  
>  
>      extern sayfunc_t _say;
> -    extern void say_logrotate(int);
> +    extern struct ev_loop;
> +    extern struct ev_signal;
> +
> +    extern void
> +    say_logrotate(struct ev_loop *, struct ev_signal *, int);
>  
>      enum say_level {
>          S_FATAL,
> @@ -104,7 +108,7 @@ local function say_closure(lvl)
>  end
>  
>  local function log_rotate()
> -    ffi.C.say_logrotate(0)
> +    ffi.C.say_logrotate(nil, nil, 0)
>  end
>  
>  local function log_level(level)
> diff --git a/src/main.cc b/src/main.cc
> index ec06103..1682bae 100644
> --- a/src/main.cc
> +++ b/src/main.cc
> @@ -83,7 +83,7 @@ static char *pid_file = NULL;
>  static char **main_argv;
>  static int main_argc;
>  /** Signals handled after start as part of the event loop. */
> -static ev_signal ev_sigs[5];
> +static ev_signal ev_sigs[6];
>  static const int ev_sig_count = sizeof(ev_sigs)/sizeof(*ev_sigs);
>  
>  static double start_time;
> @@ -335,6 +335,7 @@ signal_init(void)
>  	ev_signal_init(&ev_sigs[2], signal_cb, SIGTERM);
>  	ev_signal_init(&ev_sigs[3], signal_cb, SIGHUP);
>  	ev_signal_init(&ev_sigs[4], signal_sigwinch_cb, SIGWINCH);
> +	ev_signal_init(&ev_sigs[5], say_logrotate, SIGHUP);
>  	for (int i = 0; i < ev_sig_count; i++)
>  		ev_signal_start(loop(), &ev_sigs[i]);
>  
> diff --git a/src/say.c b/src/say.c
> index 65c1872..394e6b3 100644
> --- a/src/say.c
> +++ b/src/say.c
> @@ -269,9 +269,11 @@ log_rotate(const struct log *log)
>  }
>  
>  void
> -say_logrotate(int signo)
> +say_logrotate(struct ev_loop *loop, struct ev_signal *w, int revents)
>  {
> -	(void) signo;
> +	(void) loop;
> +	(void) w;
> +	(void) revents;
>  	int saved_errno = errno;
>  	struct log *log;
>  	rlist_foreach_entry(log, &log_rotate_list, in_log_list) {
> @@ -535,7 +537,6 @@ say_logger_init(const char *init_str, int level, int nonblock,
>  	say_set_log_level(level);
>  	log_background = background;
>  	log_pid = log_default->pid;
> -	signal(SIGHUP, say_logrotate);
>  	say_set_log_format(say_format_by_name(format));
>  
>  	if (background) {
> diff --git a/src/say.h b/src/say.h
> index 1b63229..46e6976 100644
> --- a/src/say.h
> +++ b/src/say.h
> @@ -185,8 +185,11 @@ say_set_log_format(enum say_format format);
>  enum say_format
>  say_format_by_name(const char *format);
>  
> +struct ev_loop;
> +struct ev_signal;
> +
>  void
> -say_logrotate(int /* signo */);
> +say_logrotate(struct ev_loop *, struct ev_signal *, int /* revents */);
>  
>  /** Init default logger. */
>  void
> 
> -- 
> To stop receiving notification emails like this one, please contact
> the administrator of this repository.

-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.org - www.twitter.com/kostja_osipov



More information about the Tarantool-patches mailing list