X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournald.c;h=8f00aef5bd41a313994b65629677d57bd5fccd9a;hb=71fa6f006f92831c0c02e844b4c35e4b7197c6d6;hp=2402f7f6d083d92c9782329fbf5ab77889f741f6;hpb=b8156be03f71c53072c7126bb418410acbef6c81;p=elogind.git diff --git a/src/journal/journald.c b/src/journal/journald.c index 2402f7f6d..8f00aef5b 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -460,6 +460,63 @@ static char *shortened_cgroup_path(pid_t pid) { return path; } +static void write_to_journal(Server *s, uid_t uid, struct iovec *iovec, unsigned n) { + JournalFile *f; + bool vacuumed = false; + int r; + + assert(s); + assert(iovec); + assert(n > 0); + + f = find_journal(s, uid); + if (!f) + return; + + if (journal_file_rotate_suggested(f)) { + log_info("Journal header limits reached or header out-of-date, rotating."); + server_rotate(s); + server_vacuum(s); + vacuumed = true; + } + + for (;;) { + r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL); + if (r >= 0) + return; + + if (vacuumed || + (r != -E2BIG && /* hit limit */ + r != -EFBIG && /* hit fs limit */ + r != -EDQUOT && /* quota hit */ + r != -ENOSPC && /* disk full */ + r != -EBADMSG && /* corrupted */ + r != -ENODATA && /* truncated */ + r != -EHOSTDOWN && /* other machine */ + r != -EPROTONOSUPPORT && /* unsupported feature */ + r != -EBUSY && /* unclean shutdown */ + r != -ESHUTDOWN /* already archived */)) { + log_error("Failed to write entry, ignoring: %s", strerror(-r)); + return; + } + + if (r == -E2BIG || r == -EFBIG || r == EDQUOT || r == ENOSPC) + log_info("Allocation limit reached, rotating."); + else if (r == -EHOSTDOWN) + log_info("Journal file from other machine, rotating."); + else if (r == -EBUSY) + log_info("Unlcean shutdown, rotating."); + else + log_warning("Journal file corrupted, rotating."); + + server_rotate(s); + server_vacuum(s); + vacuumed = true; + + log_info("Retrying write."); + } +} + static void dispatch_message_real( Server *s, struct iovec *iovec, unsigned n, unsigned m, @@ -480,8 +537,6 @@ static void dispatch_message_real( int r; char *t; uid_t loginuid = 0, realuid = 0; - JournalFile *f; - bool vacuumed = false; assert(s); assert(iovec); @@ -626,37 +681,7 @@ static void dispatch_message_real( assert(n <= m); -retry: - f = find_journal(s, realuid == 0 ? 0 : loginuid); - if (f) { - r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL); - - if ((r == -E2BIG || /* hit limit */ - r == -EFBIG || /* hit fs limit */ - r == -EDQUOT || /* quota hit */ - r == -ENOSPC || /* disk full */ - r == -EBADMSG || /* corrupted */ - r == -ENODATA || /* truncated */ - r == -EHOSTDOWN || /* other machine */ - r == -EPROTONOSUPPORT) && /* unsupported feature */ - !vacuumed) { - - if (r == -E2BIG) - log_info("Allocation limit reached, rotating."); - else - log_warning("Journal file corrupted, rotating."); - - server_rotate(s); - server_vacuum(s); - vacuumed = true; - - log_info("Retrying write."); - goto retry; - } - - if (r < 0) - log_error("Failed to write entry, ignoring: %s", strerror(-r)); - } + write_to_journal(s, realuid == 0 ? 0 : loginuid, iovec, n); free(pid); free(uid); @@ -1976,7 +2001,7 @@ static int system_journal_open(Server *s) { (void) mkdir(fn, 0755); free(fn); - fn = join("/var/log/journal/", ids, "/system.journal", NULL); + fn = strjoin("/var/log/journal/", ids, "/system.journal", NULL); if (!fn) return -ENOMEM; @@ -2002,7 +2027,7 @@ static int system_journal_open(Server *s) { if (!s->runtime_journal && (s->storage != STORAGE_NONE)) { - fn = join("/run/log/journal/", ids, "/system.journal", NULL); + fn = strjoin("/run/log/journal/", ids, "/system.journal", NULL); if (!fn) return -ENOMEM;