logger: allow polling time control through config 40/230840/5
authorMichal Bloch <m.bloch@samsung.com>
Wed, 22 Apr 2020 18:18:08 +0000 (20:18 +0200)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Fri, 24 Apr 2020 05:35:13 +0000 (05:35 +0000)
"epoll_time_ms" entry.

Change-Id: I0c911978902d18b2d922663a24fe1caeb6d330e8
Signed-off-by: Michal Bloch <m.bloch@samsung.com>
configs/dlog.conf
src/logger/logger.c
src/logger/logger_internal.h

index 6702bc6..f50a6fd 100644 (file)
@@ -63,6 +63,12 @@ syslog_size=1048576
 # This only affects some "external" buffers not populated by libdlog, currently only kmsg.
 handle_kmsg=1
 
+# epoll delay, meaning how often the daemon wakes up to do bookkeeping
+# and flush passive logging files when no new logs are incoming.
+# Higher values mean lower CPU usage, but can also mean some log delay
+# for continuous dlogutil instances.
+epoll_time_ms=1000
+
 # Syslog handling currently disabled in the daemon - not needed in Tizen.
 #dlog_logger_conf_syslog=dlogutil -b syslog -r 256 -n 1 -f /var/log/dlog/syslog -v recv_realtime
 
index 23737f4..07378ba 100644 (file)
@@ -56,6 +56,8 @@ static struct {
        .reader_init = NULL
 };
 
+static const int DEFAULT_EPOLL_TIME_MS = 1000;
+
 /**
  * @brief Parse permissions
  * @details Parse a string representation of permissions to the internal integral one
@@ -1760,6 +1762,7 @@ static int logger_create(struct logger_config_data *data, struct logger *l)
        l->epollfd = epoll_create1(0);
        if (l->epollfd == -1)
                return -errno;
+       l->epolltime = data->epoll_time;
 
        l->buf_params = data->buf_params;
 
@@ -1931,12 +1934,13 @@ static int do_logger(struct logger* server)
        int r = initialize_epoll_size(&events, &events_size);
        if (r < 0)
                return r;
+
        while (g_logger_run) {
                clock_gettime(CLOCK_MONOTONIC, &server->now);
 
                ensure_epoll_size(&events, &events_size, server->epollcnt);
 
-               int nfds = epoll_wait(server->epollfd, events, events_size, 1000);
+               int nfds = epoll_wait(server->epollfd, events, events_size, server->epolltime);
                if (nfds < 0 && errno == EINTR) // TODO: This is *almost* TEMP_FAILURE_RETRY. Is it equivalent?
                        continue;
 
@@ -2100,6 +2104,8 @@ int prepare_config_data(struct logger_config_data *data)
                g_backend.logger_device_throttling[i] = max_int(1, log_config_get_int(&conf, key, throttling_default));
        }
 
+       data->epoll_time = log_config_get_int(&conf, "epoll_time_ms", DEFAULT_EPOLL_TIME_MS);
+
        memset(data->is_buffer_enabled, 0, sizeof(data->is_buffer_enabled));
        if (!strcmp(backend, "pipe")) {
                data->is_buffer_enabled[LOG_ID_MAIN] =
index 4a13150..c32dd62 100644 (file)
@@ -204,6 +204,7 @@ struct buf_params {
 struct logger {
        int                 epollfd;
        unsigned            epollcnt;
+       int                 epolltime;
        list_head           writers;
        list_head           extra_readers;
        struct log_buffer*  buffers[LOG_ID_MAX];
@@ -227,6 +228,7 @@ struct buffer_config_data {
 struct logger_config_data {
        struct buf_params buf_params;
        list_head logfile_configs;
+       int epoll_time;
        int is_buffer_enabled[LOG_ID_MAX];
        struct buffer_config_data buffers[LOG_ID_MAX];
 };