]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Improve logging locking logic (remove it actually)
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 7 Oct 2019 15:30:55 +0000 (16:30 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 7 Oct 2019 15:30:55 +0000 (16:30 +0100)
src/libserver/worker_util.c
src/libutil/logger.c
src/libutil/logger.h
src/rspamd.c

index cdae2cfd2621591a087476613f6f883c3ce1e686..6c478db6fe1a9b6e88477a280a8f0e3596cb6410 100644 (file)
@@ -867,6 +867,8 @@ rspamd_fork_worker (struct rspamd_main *rspamd_main,
        case 0:
                /* Update pid for logging */
                rspamd_log_update_pid (cf->type, rspamd_main->logger);
+               /* To avoid atomic writes issue */
+               rspamd_log_reopen (rspamd_main->logger);
                wrk->pid = getpid ();
 
                /* Init PRNG after fork */
index 08cc15294afdb9949ccc22729d11fd02bdffc3ff..cb57b6825086aec61e49ed646e27ef9ce31d4495 100644 (file)
@@ -154,6 +154,9 @@ direct_write_log_line (rspamd_logger_t *rspamd_log,
        const gchar *line;
        glong r;
        gint fd;
+       gboolean locked = FALSE;
+
+       iov = (struct iovec *) data;
 
        if (rspamd_log->type == RSPAMD_LOG_CONSOLE) {
 
@@ -173,20 +176,36 @@ direct_write_log_line (rspamd_logger_t *rspamd_log,
        }
 
        if (!rspamd_log->no_lock) {
-#ifndef DISABLE_PTHREAD_MUTEX
-               if (rspamd_log->mtx) {
-                       rspamd_mempool_lock_mutex (rspamd_log->mtx);
+               gsize tlen;
+
+               if (is_iov) {
+                       tlen = 0;
+
+                       for (guint i = 0; i < count; i ++) {
+                               tlen += iov[i].iov_len;
+                       }
                }
                else {
-                       rspamd_file_lock (fd, FALSE);
+                       tlen = count;
                }
+
+               if (tlen > PIPE_BUF) {
+                       locked = TRUE;
+
+#ifndef DISABLE_PTHREAD_MUTEX
+                       if (rspamd_log->mtx) {
+                               rspamd_mempool_lock_mutex (rspamd_log->mtx);
+                       }
+                       else {
+                               rspamd_file_lock (fd, FALSE);
+                       }
 #else
-               rspamd_file_lock (fd, FALSE);
+                       rspamd_file_lock (fd, FALSE);
 #endif
+               }
        }
 
        if (is_iov) {
-               iov = (struct iovec *) data;
                r = writev (fd, iov, count);
        }
        else {
@@ -194,7 +213,7 @@ direct_write_log_line (rspamd_logger_t *rspamd_log,
                r = write (fd, line, count);
        }
 
-       if (!rspamd_log->no_lock) {
+       if (locked) {
 #ifndef DISABLE_PTHREAD_MUTEX
                if (rspamd_log->mtx) {
                        rspamd_mempool_unlock_mutex (rspamd_log->mtx);
@@ -294,6 +313,7 @@ rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
 #ifdef HAVE_SYSLOG_H
                        openlog ("rspamd", LOG_NDELAY | LOG_PID,
                                        rspamd_log->log_facility);
+                       rspamd_log->no_lock = TRUE;
 #endif
                        break;
                case RSPAMD_LOG_FILE:
@@ -302,6 +322,8 @@ rspamd_log_open_priv (rspamd_logger_t *rspamd_log, uid_t uid, gid_t gid)
                        if (rspamd_log->fd == -1) {
                                return -1;
                        }
+
+                       rspamd_log->no_lock = TRUE;
                        break;
                default:
                        return -1;
@@ -1397,22 +1419,6 @@ rspamd_log_counters (rspamd_logger_t *logger)
        return NULL;
 }
 
-void
-rspamd_log_nolock (rspamd_logger_t *logger)
-{
-       if (logger) {
-               logger->no_lock = TRUE;
-       }
-}
-
-void
-rspamd_log_lock (rspamd_logger_t *logger)
-{
-       if (logger) {
-               logger->no_lock = FALSE;
-       }
-}
-
 static gint
 rspamd_log_errlog_cmp (const ucl_object_t **o1, const ucl_object_t **o2)
 {
index e56c37aad6cdcb8031e781c8e789a068f6567324..1dff75211b51fc4dfb1bf2becf0a04df59e66ed6 100644 (file)
@@ -168,16 +168,6 @@ void rspamd_log_debug (rspamd_logger_t *logger);
  */
 void rspamd_log_nodebug (rspamd_logger_t *logger);
 
-/**
- * Turn off locking on logger (useful to avoid races)
- */
-void rspamd_log_nolock (rspamd_logger_t *logger);
-
-/**
- * Turn on locking to avoid log output mix
- */
-void rspamd_log_lock (rspamd_logger_t *logger);
-
 /**
  * Return array of counters (4 numbers):
  * 0 - errors
index 5f0e89414866806ac086989276f44b0523061599..f726865e798937618b16fda542bc52cbce703579 100644 (file)
@@ -957,7 +957,6 @@ rspamd_term_handler (struct ev_loop *loop, ev_signal *w, int revents)
        if (!rspamd_main->wanna_die) {
                rspamd_main->wanna_die = TRUE;
                msg_info_main ("catch termination signal, waiting for children");
-               rspamd_log_nolock (rspamd_main->logger);
                /* Stop srv events to avoid false notifications */
                g_hash_table_foreach (rspamd_main->workers, stop_srv_ev, rspamd_main);
                rspamd_pass_signal (rspamd_main->workers, SIGTERM);
@@ -1075,7 +1074,6 @@ rspamd_cld_handler (EV_P_ ev_child *w, struct rspamd_main *rspamd_main,
 
        /* Turn off locking for logger */
        ev_child_stop (EV_A_ w);
-       rspamd_log_nolock (rspamd_main->logger);
 
        /* Remove dead child form children list */
        g_hash_table_remove (rspamd_main->workers, GSIZE_TO_POINTER (wrk->pid));
@@ -1113,7 +1111,6 @@ rspamd_cld_handler (EV_P_ ev_child *w, struct rspamd_main *rspamd_main,
                                wrk->pid);
                rspamd_check_core_limits (rspamd_main);
                rspamd_fork_delayed (wrk->cf, wrk->index, rspamd_main);
-               rspamd_log_lock (rspamd_main->logger);
        }
        else {
                msg_info_main ("do not respawn process %s after found terminated process with pid %P",