diff --git a/include/cc_log.h b/include/cc_log.h index 56eda540c..88c48a0c7 100644 --- a/include/cc_log.h +++ b/include/cc_log.h @@ -74,7 +74,12 @@ struct logger *log_create(char *filename, uint32_t buf_cap); void log_destroy(struct logger **logger); -rstatus_i log_reopen(struct logger *logger); +/** + * Reopen the log file. Optional argument backup - if left NULL, log_reopen + * will simply reopen the log file. If specified, log_reopen will rename the + * original log file to the provided backup filename, and reopen the log file. + */ +rstatus_i log_reopen(struct logger *logger, char *backup); /* _log_write returns true if msg written, false if skipped or failed */ bool log_write(struct logger *logger, char *buf, uint32_t len); diff --git a/include/cc_rbuf.h b/include/cc_rbuf.h index 60a622823..2e5db5fcd 100644 --- a/include/cc_rbuf.h +++ b/include/cc_rbuf.h @@ -50,25 +50,25 @@ struct rbuf { #define RBUF_HDR_SIZE offsetof(struct rbuf, data) -inline uint32_t +static inline uint32_t get_rpos(struct rbuf *buf) { return __atomic_load_n(&(buf->rpos), __ATOMIC_RELAXED); } -inline uint32_t +static inline uint32_t get_wpos(struct rbuf *buf) { return __atomic_load_n(&(buf->wpos), __ATOMIC_RELAXED); } -inline void +static inline void set_rpos(struct rbuf *buf, uint32_t rpos) { __atomic_store_n(&(buf->rpos), rpos, __ATOMIC_RELAXED); } -inline void +static inline void set_wpos(struct rbuf *buf, uint32_t wpos) { __atomic_store_n(&(buf->wpos), wpos, __ATOMIC_RELAXED); diff --git a/src/cc_debug.c b/src/cc_debug.c index 7a88d878e..25356c2de 100644 --- a/src/cc_debug.c +++ b/src/cc_debug.c @@ -99,7 +99,7 @@ static void _logrotate(int signo) { log_info("received signal %d, reopen log file", signo); - log_reopen(dlog->logger); + log_reopen(dlog->logger, NULL); } static void diff --git a/src/cc_log.c b/src/cc_log.c index 53340e679..9e7a99095 100644 --- a/src/cc_log.c +++ b/src/cc_log.c @@ -144,10 +144,21 @@ log_destroy(struct logger **l) } rstatus_i -log_reopen(struct logger *logger) +log_reopen(struct logger *logger, char *backup) { + int ret; + if (logger->fd != STDERR_FILENO && logger->fd != STDOUT_FILENO) { close(logger->fd); + + if (backup != NULL) { + ret = rename(logger->name, backup); + if (ret < 0) { + log_stderr("rename old klog file '%s' to '%s' failed, ignored: " + "%s", logger->name, backup, strerror(errno)); + } + } + logger->fd = open(logger->name, O_WRONLY | O_APPEND | O_CREAT, 0644); if (logger->fd < 0) { log_stderr("reopening log file '%s' failed, ignored: %s", logger->name, @@ -282,13 +293,13 @@ log_flush(struct logger *logger) size_t buf_len; if (logger->buf == NULL) { - return; + return 0; } if (logger->fd < 0) { log_stderr("Cannot flush logger %p; invalid file descriptor", logger); INCR(log_metrics, log_flush_ex); - return; + return 0; } buf_len = rbuf_rcap(logger->buf);