return f;
}
+static int do_rotate(Server *s, JournalFile **f, const char* name,
+ bool seal, uint32_t uid) {
+ int r;
+ assert(s);
+
+ if (!*f)
+ return -EINVAL;
+
+ r = journal_file_rotate(f, s->compress, seal);
+ if (r < 0)
+ if (*f)
+ log_error("Failed to rotate %s: %s",
+ (*f)->path, strerror(-r));
+ else
+ log_error("Failed to create new %s journal: %s",
+ name, strerror(-r));
+ else
+ server_fix_perms(s, *f, uid);
+ return r;
+}
+
void server_rotate(Server *s) {
JournalFile *f;
void *k;
log_debug("Rotating...");
- if (s->runtime_journal) {
- r = journal_file_rotate(&s->runtime_journal, s->compress, false);
- if (r < 0)
- if (s->runtime_journal)
- log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
- else
- log_error("Failed to create new runtime journal: %s", strerror(-r));
- else
- server_fix_perms(s, s->runtime_journal, 0);
- }
-
- if (s->system_journal) {
- r = journal_file_rotate(&s->system_journal, s->compress, s->seal);
- if (r < 0)
- if (s->system_journal)
- log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
- else
- log_error("Failed to create new system journal: %s", strerror(-r));
-
- else
- server_fix_perms(s, s->system_journal, 0);
- }
+ do_rotate(s, &s->runtime_journal, "runtime", false, 0);
+ do_rotate(s, &s->system_journal, "system", s->seal, 0);
HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
- r = journal_file_rotate(&f, s->compress, s->seal);
- if (r < 0)
- if (f)
- log_error("Failed to rotate %s: %s", f->path, strerror(-r));
- else {
- log_error("Failed to create user journal: %s", strerror(-r));
- hashmap_remove(s->user_journals, k);
- }
- else {
+ r = do_rotate(s, &f, "user", s->seal, PTR_TO_UINT32(k));
+ if (r >= 0)
hashmap_replace(s->user_journals, k, f);
- server_fix_perms(s, f, PTR_TO_UINT32(k));
- }
+ else if (!f)
+ /* Old file has been closed and deallocated */
+ hashmap_remove(s->user_journals, k);
}
}
s->sync_scheduled = false;
}
+static void do_vacuum(Server *s, char *ids, JournalFile *f, const char* path,
+ JournalMetrics *metrics) {
+ char *p;
+ int r;
+
+ if (!f)
+ return;
+
+ p = strappenda(path, ids);
+ r = journal_directory_vacuum(p, metrics->max_use, s->max_retention_usec, &s->oldest_file_usec);
+ if (r < 0 && r != -ENOENT)
+ log_error("Failed to vacuum %s: %s", p, strerror(-r));
+}
+
void server_vacuum(Server *s) {
char ids[33];
sd_id128_t machine;
log_error("Failed to get machine ID: %s", strerror(-r));
return;
}
-
sd_id128_to_string(machine, ids);
- if (s->system_journal) {
- char *p = strappenda("/var/log/journal/", ids);
-
- r = journal_directory_vacuum(p, s->system_metrics.max_use, s->max_retention_usec, &s->oldest_file_usec);
- if (r < 0 && r != -ENOENT)
- log_error("Failed to vacuum %s: %s", p, strerror(-r));
- }
-
- if (s->runtime_journal) {
- char *p = strappenda("/run/log/journal/", ids);
-
- r = journal_directory_vacuum(p, s->runtime_metrics.max_use, s->max_retention_usec, &s->oldest_file_usec);
- if (r < 0 && r != -ENOENT)
- log_error("Failed to vacuum %s: %s", p, strerror(-r));
- }
+ do_vacuum(s, ids, s->system_journal, "/var/log/journal/", &s->system_metrics);
+ do_vacuum(s, ids, s->runtime_journal, "/run/log/journal/", &s->runtime_metrics);
s->cached_available_space_timestamp = 0;
}