mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
journalctl: consider shut down namespaced sd-journald instance synced
If the namespaced systemd-journald instance was shut down due to inactivity, we can consider it synchronized, so avoid throwing an error in such case. This should help with the random TEST-44-LOG-NAMESPACE fails where we might try to sync the namespace just after it was shut down: [ 7.682941] H testsuite-44.sh[381]: + systemd-run --wait -p LogNamespace=foobaz echo 'hello world' [ 7.693916] H systemd-journald[389]: Failed to open /dev/kmsg, ignoring: Operation not permitted [ 7.693983] H systemd-journald[389]: Collecting audit messages is disabled. [ 7.725511] H systemd[1]: Started systemd-journald@foobar.service. [ 7.726496] H systemd[1]: Listening on systemd-journald-varlink@foobaz.socket. [ 7.726808] H systemd[1]: Listening on systemd-journald@foobaz.socket. [ 7.750774] H systemd[1]: Started run-u3.service. [ 7.795122] H systemd[1]: run-u3.service: Deactivated successfully. [ 7.842042] H testsuite-44.sh[390]: Running as unit: run-u3.service; invocation ID: 56380adeb36940a8a170d9ffd2e1e433 [ 7.842561] H systemd[1]: systemd-journald-varlink@foobaz.socket: Deactivated successfully. [ 7.842762] H systemd[1]: Closed systemd-journald-varlink@foobaz.socket. [ 7.846394] H systemd[1]: systemd-journald@foobaz.socket: Deactivated successfully. [ 7.846566] H systemd[1]: Closed systemd-journald@foobaz.socket. [ 7.852983] H testsuite-44.sh[390]: Finished with result: success [ 7.852983] H testsuite-44.sh[390]: Main processes terminated with: code=exited/status=0 [ 7.852983] H testsuite-44.sh[390]: Service runtime: 44ms [ 7.852983] H testsuite-44.sh[390]: CPU time consumed: 8ms [ 7.852983] H testsuite-44.sh[390]: Memory peak: 880.0K [ 7.852983] H testsuite-44.sh[390]: Memory swap peak: 0B [ 7.853785] H testsuite-44.sh[381]: + journalctl --namespace=foobar --sync [ 7.860095] H systemd-journald[389]: Received client request to sync journal. [ 7.862119] H testsuite-44.sh[381]: + journalctl --namespace=foobaz --sync [ 7.868381] H journalctl[396]: Failed to connect to /run/systemd/journal.foobaz/io.systemd.journal: Connection refused [ 7.871498] H systemd[1]: testsuite-44.service: Main process exited, code=exited, status=1/FAILURE [ 7.871642] H systemd[1]: testsuite-44.service: Failed with result 'exit-code'. [ 7.930772] H systemd[1]: Failed to start testsuite-44.service.
This commit is contained in:
committed by
Luca Boccassi
parent
f14686c1d2
commit
b9f880d528
@@ -1915,47 +1915,93 @@ static int verify(sd_journal *j, bool verbose) {
|
||||
return r;
|
||||
}
|
||||
|
||||
static int simple_varlink_call(const char *option, const char *method) {
|
||||
_cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL;
|
||||
const char *fn;
|
||||
static int varlink_connect_journal(Varlink **ret_link) {
|
||||
const char *address;
|
||||
int r;
|
||||
|
||||
if (arg_machine)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "%s is not supported in conjunction with --machine=.", option);
|
||||
address = arg_namespace ?
|
||||
strjoina("/run/systemd/journal.", arg_namespace, "/io.systemd.journal") :
|
||||
"/run/systemd/journal/io.systemd.journal";
|
||||
|
||||
fn = arg_namespace ?
|
||||
strjoina("/run/systemd/journal.", arg_namespace, "/io.systemd.journal") :
|
||||
"/run/systemd/journal/io.systemd.journal";
|
||||
|
||||
r = varlink_connect_address(&link, fn);
|
||||
r = varlink_connect_address(ret_link, address);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to connect to %s: %m", fn);
|
||||
return r;
|
||||
|
||||
(void) varlink_set_description(link, "journal");
|
||||
(void) varlink_set_relative_timeout(link, USEC_INFINITY);
|
||||
(void) varlink_set_description(*ret_link, "journal");
|
||||
(void) varlink_set_relative_timeout(*ret_link, USEC_INFINITY);
|
||||
|
||||
return varlink_call_and_log(link, method, /* parameters= */ NULL, /* ret_parameters= */ NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int flush_to_var(void) {
|
||||
_cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL;
|
||||
int r;
|
||||
|
||||
if (arg_machine || arg_namespace)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
|
||||
"--flush is not supported in conjunction with %s.",
|
||||
arg_machine ? "--machine=" : "--namespace=");
|
||||
|
||||
if (access("/run/systemd/journal/flushed", F_OK) >= 0)
|
||||
return 0; /* Already flushed, no need to contact journald */
|
||||
if (errno != ENOENT)
|
||||
return log_error_errno(errno, "Unable to check for existence of /run/systemd/journal/flushed: %m");
|
||||
|
||||
return simple_varlink_call("--flush", "io.systemd.Journal.FlushToVar");
|
||||
r = varlink_connect_journal(&link);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to connect to Varlink socket: %m");
|
||||
|
||||
return varlink_call_and_log(link, "io.systemd.Journal.FlushToVar", /* parameters= */ NULL, /* ret_parameters= */ NULL);
|
||||
}
|
||||
|
||||
static int relinquish_var(void) {
|
||||
return simple_varlink_call("--relinquish-var/--smart-relinquish-var", "io.systemd.Journal.RelinquishVar");
|
||||
_cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL;
|
||||
int r;
|
||||
|
||||
if (arg_machine || arg_namespace)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
|
||||
"--(smart-)relinquish-var is not supported in conjunction with %s.",
|
||||
arg_machine ? "--machine=" : "--namespace=");
|
||||
|
||||
r = varlink_connect_journal(&link);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to connect to Varlink socket: %m");
|
||||
|
||||
return varlink_call_and_log(link, "io.systemd.Journal.RelinquishVar", /* parameters= */ NULL, /* ret_parameters= */ NULL);
|
||||
}
|
||||
|
||||
static int rotate(void) {
|
||||
return simple_varlink_call("--rotate", "io.systemd.Journal.Rotate");
|
||||
_cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL;
|
||||
int r;
|
||||
|
||||
if (arg_machine)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
|
||||
"--rotate is not supported in conjunction with --machine=.");
|
||||
|
||||
r = varlink_connect_journal(&link);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to connect to Varlink socket: %m");
|
||||
|
||||
return varlink_call_and_log(link, "io.systemd.Journal.Rotate", /* parameters= */ NULL, /* ret_parameters= */ NULL);
|
||||
}
|
||||
|
||||
static int sync_journal(void) {
|
||||
return simple_varlink_call("--sync", "io.systemd.Journal.Synchronize");
|
||||
_cleanup_(varlink_flush_close_unrefp) Varlink *link = NULL;
|
||||
int r;
|
||||
|
||||
if (arg_machine)
|
||||
return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP),
|
||||
"--sync is not supported in conjunction with --machine=.");
|
||||
|
||||
r = varlink_connect_journal(&link);
|
||||
if (ERRNO_IS_NEG_DISCONNECT(r) && arg_namespace)
|
||||
/* If the namespaced sd-journald instance was shut down due to inactivity, it should already
|
||||
* be synchronized */
|
||||
return 0;
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to connect to Varlink socket: %m");
|
||||
|
||||
return varlink_call_and_log(link, "io.systemd.Journal.Synchronize", /* parameters= */ NULL, /* ret_parameters= */ NULL);
|
||||
}
|
||||
|
||||
static int action_list_fields(sd_journal *j) {
|
||||
|
||||
Reference in New Issue
Block a user