From a1a03e3075316e2376176fc54c74e071adc9d71a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 7 Sep 2012 23:20:28 +0200 Subject: [PATCH] journal: add call to determine current journal file disk usage --- Makefile.am | 1 + TODO | 2 - man/journalctl.xml | 8 +++ man/sd-journal.xml | 4 +- man/sd_journal_get_usage.xml | 104 +++++++++++++++++++++++++++++ src/journal/journal-file.c | 5 ++ src/journal/journalctl.c | 25 ++++++- src/journal/libsystemd-journal.sym | 5 ++ src/journal/sd-journal.c | 23 +++++++ src/systemd/sd-journal.h | 2 + 10 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 man/sd_journal_get_usage.xml diff --git a/Makefile.am b/Makefile.am index f88d193b4..7ccec6713 100644 --- a/Makefile.am +++ b/Makefile.am @@ -513,6 +513,7 @@ MANPAGES = \ man/sd_journal_get_cutoff_realtime_usec.3 \ man/sd_journal_get_cursor.3 \ man/sd_journal_get_fd.3 \ + man/sd_journal_get_usage.3 \ man/sd_journal_add_match.3 \ man/sd_journal_seek_head.3 diff --git a/TODO b/TODO index 30e2f8e24..de7639e86 100644 --- a/TODO +++ b/TODO @@ -126,8 +126,6 @@ Features: * add _SYSTEMD_USER_UNIT= field to journal entries -* journal: expose current disk usage - * dracut-shutdown needs to be ordered before unmounting /boot * wiki: document new logind LockSessions() call diff --git a/man/journalctl.xml b/man/journalctl.xml index 296e3fd2f..9800cf30e 100644 --- a/man/journalctl.xml +++ b/man/journalctl.xml @@ -320,6 +320,14 @@ accessed. + + + + Shows the current disk + usage of all + journal files. + + diff --git a/man/sd-journal.xml b/man/sd-journal.xml index b6241a176..773689c69 100644 --- a/man/sd-journal.xml +++ b/man/sd-journal.xml @@ -78,7 +78,8 @@ sd_journal_add_match3, sd_journal_seek_head3, sd_journal_get_cursor3, - sd_journal_cutoff_realtime_usec3 + sd_journal_cutoff_realtime_usec3, + sd_journal_get_usage3 and sd_journal_get_fd3 for more information about the functions @@ -116,6 +117,7 @@ sd_journal_seek_head3, sd_journal_get_cursor3, sd_journal_cutoff_realtime_usec3, + sd_journal_get_usage3, journalctl1, sd-id1283, pkg-config1 diff --git a/man/sd_journal_get_usage.xml b/man/sd_journal_get_usage.xml new file mode 100644 index 000000000..14eb1e2b7 --- /dev/null +++ b/man/sd_journal_get_usage.xml @@ -0,0 +1,104 @@ + + + + + + + + + sd_journal_get_usage + systemd + + + + Developer + Lennart + Poettering + lennart@poettering.net + + + + + + sd_journal_get_usage + 3 + + + + sd_journal_get_usage + Journal disk usage + + + + + #include <systemd/sd-journal.h> + + + int sd_journal_get_usage + sd_journal* j + uint64_t* bytes + + + + + + + Description + + sd_journal_get_usage() + determines the total disk space currently used up by + journal files. If + SD_JOURNAL_LOCAL_ONLY has been + passed when opening the journal files this value will + only reflect the size of journal files of the local + host, otherwise of all hosts. + + + + Return Value + + sd_journal_get_usage() + returns 0 on success or a negative errno-style error + code. + + + + Notes + + The sd_journal_get_usage() + interface is available as shared library, which can be + compiled and linked to with the + libsystemd-journal + pkg-config1 + file. + + + + See Also + + + systemd1, + sd-journal3, + sd_journal_open3, + + + + diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index 697e7f360..06de2acc5 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -1906,6 +1906,8 @@ fail: void journal_file_print_header(JournalFile *f) { char a[33], b[33], c[33]; char x[FORMAT_TIMESTAMP_MAX], y[FORMAT_TIMESTAMP_MAX]; + struct stat st; + char bytes[FORMAT_BYTES_MAX]; assert(f); @@ -1970,6 +1972,9 @@ void journal_file_print_header(JournalFile *f) { if (JOURNAL_HEADER_CONTAINS(f->header, n_entry_arrays)) printf("Entry Array Objects: %llu\n", (unsigned long long) le64toh(f->header->n_entry_arrays)); + + if (fstat(f->fd, &st) >= 0) + printf("Disk usage: %s\n", format_bytes(bytes, sizeof(bytes), (off_t) st.st_blocks * 512ULL)); } int journal_file_open( diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 1a6464d5e..e2600542f 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -72,7 +72,8 @@ static enum { ACTION_NEW_ID128, ACTION_PRINT_HEADER, ACTION_SETUP_KEYS, - ACTION_VERIFY + ACTION_VERIFY, + ACTION_DISK_USAGE, } arg_action = ACTION_SHOW; static int help(void) { @@ -96,6 +97,7 @@ static int help(void) { "Commands:\n" " --new-id128 Generate a new 128 Bit ID\n" " --header Show journal header information\n" + " --disk-usage Show total disk usage\n" #ifdef HAVE_GCRYPT " --setup-keys Generate new FSS key pair\n" " --interval=TIME Time interval for changing the FSS sealing key\n" @@ -118,7 +120,8 @@ static int parse_argv(int argc, char *argv[]) { ARG_SETUP_KEYS, ARG_INTERVAL, ARG_VERIFY, - ARG_VERIFY_KEY + ARG_VERIFY_KEY, + ARG_DISK_USAGE }; static const struct option options[] = { @@ -141,6 +144,7 @@ static int parse_argv(int argc, char *argv[]) { { "interval", required_argument, NULL, ARG_INTERVAL }, { "verify", no_argument, NULL, ARG_VERIFY }, { "verify-key", required_argument, NULL, ARG_VERIFY_KEY }, + { "disk-usage", no_argument, NULL, ARG_DISK_USAGE }, { NULL, 0, NULL, 0 } }; @@ -224,6 +228,10 @@ static int parse_argv(int argc, char *argv[]) { arg_action = ACTION_VERIFY; break; + case ARG_DISK_USAGE: + arg_action = ACTION_DISK_USAGE; + break; + #ifdef HAVE_GCRYPT case ARG_SETUP_KEYS: arg_action = ACTION_SETUP_KEYS; @@ -746,6 +754,19 @@ int main(int argc, char *argv[]) { goto finish; } + if (arg_action == ACTION_DISK_USAGE) { + uint64_t bytes; + char sbytes[FORMAT_BYTES_MAX]; + + r = sd_journal_get_usage(j, &bytes); + if (r < 0) + goto finish; + + printf("Journals take up %s on disk.\n", format_bytes(sbytes, sizeof(sbytes), bytes)); + r = 0; + goto finish; + } + #ifdef HAVE_ACL if (access("/var/log/journal", F_OK) < 0 && geteuid() != 0 && in_group("adm") <= 0) { log_error("Unprivileged users can't see messages unless persistent log storage is enabled. Users in the group 'adm' can always see messages."); diff --git a/src/journal/libsystemd-journal.sym b/src/journal/libsystemd-journal.sym index 27fdcdda0..7dfae2625 100644 --- a/src/journal/libsystemd-journal.sym +++ b/src/journal/libsystemd-journal.sym @@ -70,3 +70,8 @@ global: sd_journal_perror; sd_journal_perror_with_location; } LIBSYSTEMD_JOURNAL_187; + +LIBSYSTEMD_JOURNAL_190 { +global: + sd_journal_get_usage; +} LIBSYSTEMD_JOURNAL_188; diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 0f7c02ce6..b4d35eeba 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -2062,6 +2062,29 @@ void journal_print_header(sd_journal *j) { } } +_public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) { + Iterator i; + JournalFile *f; + uint64_t sum = 0; + + if (!j) + return -EINVAL; + if (!bytes) + return -EINVAL; + + HASHMAP_FOREACH(f, j->files, i) { + struct stat st; + + if (fstat(f->fd, &st) < 0) + return -errno; + + sum += (uint64_t) st.st_blocks * 512ULL; + } + + *bytes = sum; + return 0; +} + /* _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { */ /* if (!j) */ /* return -EINVAL; */ diff --git a/src/systemd/sd-journal.h b/src/systemd/sd-journal.h index de1c8f38f..6c18c8942 100644 --- a/src/systemd/sd-journal.h +++ b/src/systemd/sd-journal.h @@ -108,6 +108,8 @@ int sd_journal_get_cursor(sd_journal *j, char **cursor); int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, uint64_t *to); int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, const sd_id128_t boot_id, uint64_t *from, uint64_t *to); +int sd_journal_get_usage(sd_journal *j, uint64_t *bytes); + /* int sd_journal_query_unique(sd_journal *j, const char *field); /\* missing *\/ */ /* int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l); /\* missing *\/ */ /* void sd_journal_restart_unique(sd_journal *j); /\* missing *\/ */ -- 2.30.2