Skip to content

Commit

Permalink
unit: when JobTimeoutSec= is turned off, implicitly turn off JobRunni…
Browse files Browse the repository at this point in the history
…ngTimeoutSec= too

We added JobRunningTimeoutSec= late, and Dracut configured only
JobTimeoutSec= to turn of root device timeouts before. With this change
we'll propagate a reset of JobTimeoutSec= into JobRunningTimeoutSec=,
but only if the latter wasn't set explicitly.

This should restore compatibility with older systemd versions.

Fixes: systemd#6402
  • Loading branch information
poettering committed Sep 27, 2017
1 parent dab9698 commit bfb52ed
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/basic/time-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1082,7 +1082,11 @@ int parse_sec(const char *t, usec_t *usec) {
}

int parse_sec_fix_0(const char *t, usec_t *usec) {
assert(t);
assert(usec);

t += strspn(t, WHITESPACE);

if (streq(t, "0")) {
*usec = USEC_INFINITY;
return 0;
Expand Down
4 changes: 2 additions & 2 deletions src/core/load-fragment-gperf.gperf.m4
Original file line number Diff line number Diff line change
Expand Up @@ -209,8 +209,8 @@ Unit.OnFailureJobMode, config_parse_job_mode, 0,
Unit.OnFailureIsolate, config_parse_job_mode_isolate, 0, offsetof(Unit, on_failure_job_mode)
Unit.IgnoreOnIsolate, config_parse_bool, 0, offsetof(Unit, ignore_on_isolate)
Unit.IgnoreOnSnapshot, config_parse_warn_compat, DISABLED_LEGACY, 0
Unit.JobTimeoutSec, config_parse_sec_fix_0, 0, offsetof(Unit, job_timeout)
Unit.JobRunningTimeoutSec, config_parse_sec_fix_0, 0, offsetof(Unit, job_running_timeout)
Unit.JobTimeoutSec, config_parse_job_timeout_sec, 0, 0
Unit.JobRunningTimeoutSec, config_parse_job_running_timeout_sec, 0, 0
Unit.JobTimeoutAction, config_parse_emergency_action, 0, offsetof(Unit, job_timeout_action)
Unit.JobTimeoutRebootArgument, config_parse_unit_string_printf, 0, offsetof(Unit, job_timeout_reboot_arg)
Unit.StartLimitIntervalSec, config_parse_sec, 0, offsetof(Unit, start_limit.interval)
Expand Down
74 changes: 74 additions & 0 deletions src/core/load-fragment.c
Original file line number Diff line number Diff line change
Expand Up @@ -4165,6 +4165,80 @@ int config_parse_protect_system(

DEFINE_CONFIG_PARSE_ENUM(config_parse_exec_keyring_mode, exec_keyring_mode, ExecKeyringMode, "Failed to parse keyring mode");

int config_parse_job_timeout_sec(
const char* unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {

Unit *u = data;
usec_t usec;
int r;

assert(filename);
assert(lvalue);
assert(rvalue);
assert(u);

r = parse_sec_fix_0(rvalue, &usec);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse JobTimeoutSec= parameter, ignoring: %s", rvalue);
return 0;
}

if (usec == USEC_INFINITY) {
/* If the user explicitly unset JobTimeoutSec= also unset JobRunningTimeoutSec=, for compatibility with
* old versions. If JobRunningTimeoutSec= was explicitly set, avoid this however as whatever the usec
* picked should count. */

if (!u->job_running_timeout_set)
u->job_running_timeout = USEC_INFINITY;
}

u->job_timeout = usec;

return 0;
}

int config_parse_job_running_timeout_sec(
const char* unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {

Unit *u = data;
usec_t usec;
int r;

assert(filename);
assert(lvalue);
assert(rvalue);
assert(u);

r = parse_sec_fix_0(rvalue, &usec);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse JobRunningTimeoutSec= parameter, ignoring: %s", rvalue);
return 0;
}

u->job_running_timeout = usec;
u->job_running_timeout_set = true;

return 0;
}

#define FOLLOW_MAX 8

static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {
Expand Down
2 changes: 2 additions & 0 deletions src/core/load-fragment.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ int config_parse_user_group_strv(const char *unit, const char *filename, unsigne
int config_parse_restrict_namespaces(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_bind_paths(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_exec_keyring_mode(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_job_timeout_sec(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_job_running_timeout_sec(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);

/* gperf prototypes */
const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
Expand Down
1 change: 1 addition & 0 deletions src/core/unit.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ struct Unit {
/* Job timeout and action to take */
usec_t job_timeout;
usec_t job_running_timeout;
bool job_running_timeout_set:1;
EmergencyAction job_timeout_action;
char *job_timeout_reboot_arg;

Expand Down

0 comments on commit bfb52ed

Please sign in to comment.