From: Daan De Meyer Date: Fri, 21 Oct 2022 12:25:23 +0000 (+0200) Subject: log: Add ratelimit argument to ratelimit log macros X-Git-Tag: v253-rc1~512^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0f06e64c3de06d535bd36365993eab8170a09dcb;p=thirdparty%2Fsystemd.git log: Add ratelimit argument to ratelimit log macros Allows configuring the ratelimit per logging statement. --- diff --git a/src/basic/log.h b/src/basic/log.h index 8a828c1d2d5..8912be233df 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -375,15 +375,12 @@ typedef struct LogRateLimit { RateLimit ratelimit; } LogRateLimit; -#define log_ratelimit_internal(_level, _error, _format, _file, _line, _func, ...) \ +#define log_ratelimit_internal(_level, _error, _ratelimit, _format, _file, _line, _func, ...) \ ({ \ int _log_ratelimit_error = (_error); \ int _log_ratelimit_level = (_level); \ static LogRateLimit _log_ratelimit = { \ - .ratelimit = { \ - .interval = 1 * USEC_PER_SEC, \ - .burst = 1, \ - }, \ + .ratelimit = (_ratelimit), \ }; \ unsigned _num_dropped_errors = ratelimit_num_dropped(&_log_ratelimit.ratelimit); \ if (_log_ratelimit_error != _log_ratelimit.error || _log_ratelimit_level != _log_ratelimit.level) { \ @@ -398,14 +395,14 @@ typedef struct LogRateLimit { _log_ratelimit_error; \ }) -#define log_ratelimit_full_errno(level, error, format, ...) \ +#define log_ratelimit_full_errno(level, error, _ratelimit, format, ...) \ ({ \ int _level = (level), _e = (error); \ _e = (log_get_max_level() >= LOG_PRI(_level)) \ - ? log_ratelimit_internal(_level, _e, format, PROJECT_FILE, __LINE__, __func__, ##__VA_ARGS__) \ + ? log_ratelimit_internal(_level, _e, _ratelimit, format, PROJECT_FILE, __LINE__, __func__, ##__VA_ARGS__) \ : -ERRNO_VALUE(_e); \ _e < 0 ? _e : -ESTRPIPE; \ }) -#define log_ratelimit_full(level, format, ...) \ - log_ratelimit_full_errno(level, 0, format, ##__VA_ARGS__) +#define log_ratelimit_full(level, _ratelimit, format, ...) \ + log_ratelimit_full_errno(level, 0, _ratelimit, format, ##__VA_ARGS__) diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index c02d73bdc2d..b508c441526 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -83,6 +83,8 @@ #define IDLE_TIMEOUT_USEC (30*USEC_PER_SEC) +#define FAILED_TO_WRITE_ENTRY_RATELIMIT ((RateLimit) { .interval = 1 * USEC_PER_SEC, .burst = 1 }) + static int determine_path_usage( Server *s, const char *path, @@ -874,14 +876,18 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, size_t n } if (vacuumed || !shall_try_append_again(f->file, r)) { - log_ratelimit_full_errno(LOG_ERR, r, "Failed to write entry (%zu items, %zu bytes), ignoring: %m", n, IOVEC_TOTAL_SIZE(iovec, n)); + log_ratelimit_full_errno(LOG_ERR, r, FAILED_TO_WRITE_ENTRY_RATELIMIT, + "Failed to write entry (%zu items, %zu bytes), ignoring: %m", + n, IOVEC_TOTAL_SIZE(iovec, n)); return; } if (r == -E2BIG) log_debug("Journal file %s is full, rotating to a new file", f->file->path); else - log_ratelimit_full_errno(LOG_INFO, r, "Failed to write entry to %s (%zu items, %zu bytes), rotating before retrying: %m", f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n)); + log_ratelimit_full_errno(LOG_INFO, r, FAILED_TO_WRITE_ENTRY_RATELIMIT, + "Failed to write entry to %s (%zu items, %zu bytes), rotating before retrying: %m", + f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n)); server_rotate(s); server_vacuum(s, false); @@ -893,7 +899,9 @@ static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, size_t n log_debug("Retrying write."); r = journal_file_append_entry(f->file, &ts, NULL, iovec, n, &s->seqnum, NULL, NULL); if (r < 0) - log_ratelimit_full_errno(LOG_ERR, r, "Failed to write entry to %s (%zu items, %zu bytes) despite vacuuming, ignoring: %m", f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n)); + log_ratelimit_full_errno(LOG_ERR, r, FAILED_TO_WRITE_ENTRY_RATELIMIT, + "Failed to write entry to %s (%zu items, %zu bytes) despite vacuuming, ignoring: %m", + f->file->path, n, IOVEC_TOTAL_SIZE(iovec, n)); else server_schedule_sync(s, priority); }