The current plock logging is limited due a in-memory log buffer which
can be dumped via dlm_contol log_plock functionality. To trace plock
performance issues it's necessary to log plock activity in a bigger log
buffer such as a file. This patch will add functionality that plock
logging information will be appended into a log file.

WARNING: depending on plock activity the resulting log file can be
resulting in enormous file size. This option should be used for
debugging purpose only.
---
 dlm_controld/dlm_daemon.h |  4 ++++
 dlm_controld/logging.c    | 39 +++++++++++++++++++++++++++++++--------
 dlm_controld/main.c       |  5 +++++
 3 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/dlm_controld/dlm_daemon.h b/dlm_controld/dlm_daemon.h
index f0bad90f..c74f684a 100644
--- a/dlm_controld/dlm_daemon.h
+++ b/dlm_controld/dlm_daemon.h
@@ -76,10 +76,12 @@
 
 #define RUN_FILE_NAME            "dlm_controld.pid"
 #define LOG_FILE_NAME            "dlm_controld.log"
+#define PLOCK_LOG_FILE_NAME      "plock.log"
 #define CONF_FILE_NAME           "dlm.conf"
 
 #define RUN_FILE_PATH            RUNDIR "/" RUN_FILE_NAME
 #define LOG_FILE_PATH            LOGDIR "/" LOG_FILE_NAME
+#define PLOCK_LOG_FILE_PATH      LOGDIR "/" PLOCK_LOG_FILE_NAME
 #define CONF_FILE_PATH           CONFDIR "/" CONF_FILE_NAME
 
 #define DEFAULT_LOG_MODE         LOG_MODE_OUTPUT_FILE | LOG_MODE_OUTPUT_SYSLOG
@@ -87,6 +89,7 @@
 #define DEFAULT_SYSLOG_PRIORITY  LOG_INFO
 #define DEFAULT_LOGFILE_PRIORITY LOG_INFO
 #define DEFAULT_LOGFILE          LOG_FILE_PATH
+#define DEFAULT_PLOCK_LOGFILE   PLOCK_LOG_FILE_PATH
 
 #define DEFAULT_NETLINK_RCVBUF (2 * 1024 * 1024)
 
@@ -110,6 +113,7 @@ enum {
         enable_fscontrol_ind,
         enable_plock_ind,
         plock_debug_ind,
+        plock_debug_logfile_ind,
         plock_rate_limit_ind,
         plock_ownership_ind,
         drop_resources_time_ind,
diff --git a/dlm_controld/logging.c b/dlm_controld/logging.c
index 3298ef99..83de2da4 100644
--- a/dlm_controld/logging.c
+++ b/dlm_controld/logging.c
@@ -12,7 +12,9 @@ static int syslog_facility;
 static int syslog_priority;
 static int logfile_priority;
 static char logfile[PATH_MAX];
+static char plock_logfile[PATH_MAX];
 static FILE *logfile_fp;
+static FILE *plock_logfile_fp;
 
 /* logfile_priority is the only one of these options that
    can be controlled from command line, environment variable
@@ -35,6 +37,7 @@ void init_logging(void)
        syslog_priority = DEFAULT_SYSLOG_PRIORITY;
        logfile_priority = DEFAULT_LOGFILE_PRIORITY;
        strcpy(logfile, DEFAULT_LOGFILE);
+       strcpy(plock_logfile, DEFAULT_PLOCK_LOGFILE);
 
        set_logfile_priority();
 
@@ -66,6 +69,15 @@ void init_logging(void)
                }
        }
 
+       if (dlm_options[plock_debug_logfile_ind].use_int &&
+           plock_logfile[0]) {
+               plock_logfile_fp = fopen(plock_logfile, "a+");
+               if (plock_logfile_fp != NULL) {
+                       int fd = fileno(plock_logfile_fp);
+                       fcntl(fd, F_SETFD, fcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
+               }
+       }
+
 skip_logfile:
        openlog(DAEMON_NAME, LOG_CONS | LOG_PID, syslog_facility);
 }
@@ -75,6 +87,8 @@ void close_logging(void)
        closelog();
        if (logfile_fp)
                fclose(logfile_fp);
+       if (plock_logfile_fp)
+               fclose(plock_logfile_fp);
 }
 
 #define NAME_ID_SIZE 32
@@ -151,6 +165,16 @@ static void log_save_str(int len, char *log_buf, unsigned 
int *point,
        *wrap = w;
 }
 
+static void log_str_to_file(FILE *fp)
+{
+       time_t logtime = time(NULL);
+       char tbuf[64];
+
+       strftime(tbuf, sizeof(tbuf), "%b %d %T", localtime(&logtime));
+       fprintf(fp, "%s %s", tbuf, log_str);
+       fflush(fp);
+}
+
 void log_level(char *name_in, uint32_t level_in, const char *fmt, ...)
 {
        va_list ap;
@@ -191,19 +215,18 @@ void log_level(char *name_in, uint32_t level_in, const 
char *fmt, ...)
 
        if (level < LOG_NONE)
                log_save_str(pos - 1, log_dump, &log_point, &log_wrap);
-       if (plock)
+       if (plock) {
                log_save_str(pos - 1, log_dump_plock, &log_point_plock, 
&log_wrap_plock);
 
+               if (plock_logfile_fp)
+                       log_str_to_file(plock_logfile_fp);
+       }
+
        if (level <= syslog_priority)
                syslog(level, "%s", log_str);
 
-       if (level <= logfile_priority && logfile_fp) {
-               time_t logtime = time(NULL);
-               char tbuf[64];
-               strftime(tbuf, sizeof(tbuf), "%b %d %T", localtime(&logtime));
-               fprintf(logfile_fp, "%s %s", tbuf, log_str);
-               fflush(logfile_fp);
-       }
+       if (level <= logfile_priority && logfile_fp)
+               log_str_to_file(logfile_fp);
 
        if (!dlm_options[daemon_debug_ind].use_int)
                return;
diff --git a/dlm_controld/main.c b/dlm_controld/main.c
index c9d1c5f1..8e8d4038 100644
--- a/dlm_controld/main.c
+++ b/dlm_controld/main.c
@@ -1854,6 +1854,11 @@ static void set_opt_defaults(void)
                        0, NULL, 0, 1,
                        "enable plock debugging");
 
+       set_opt_default(plock_debug_logfile_ind,
+                       "plock_debug_logfile", 'O', req_arg_bool,
+                       0, NULL, 0, 1,
+                       "write plock debugging to log file. Note: resulting log 
file can take enormous space.");
+
        set_opt_default(plock_rate_limit_ind,
                        "plock_rate_limit", 'l', req_arg_int,
                        0, NULL, 0, 1,
-- 
2.31.1

Reply via email to