core: path: Re-enter waiting if target is deactivating
Previously, path units would remain in the running state while their target unit is deactivating. This left a window of time where the target unit is no longer operational (i.e. it is busy deactivating/cleaning up/etc) but the path unit would continue to ignore inotify events. In short: any inotify event that occurs while the target unit deactivates would be completely lost. With this commit, the path will go back into a waiting state when the target unit starts deactivating. This means that any inotify event that occurs while the target unit deactivates will queue a start job.
This commit is contained in:
committed by
Luca Boccassi
parent
1c62c4fe0b
commit
720c618397
+3
-3
@@ -582,7 +582,7 @@ static void path_enter_waiting(Path *p, bool initial, bool from_trigger_notify)
|
||||
|
||||
/* If the triggered unit is already running, so are we */
|
||||
trigger = UNIT_TRIGGER(UNIT(p));
|
||||
if (trigger && !UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(trigger))) {
|
||||
if (trigger && !UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(trigger))) {
|
||||
path_set_state(p, PATH_RUNNING);
|
||||
path_unwatch(p);
|
||||
return;
|
||||
@@ -853,11 +853,11 @@ static void path_trigger_notify_impl(Unit *u, Unit *other, bool on_defer) {
|
||||
return;
|
||||
|
||||
if (p->state == PATH_RUNNING &&
|
||||
UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other))) {
|
||||
UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other))) {
|
||||
if (!on_defer)
|
||||
log_unit_debug(u, "Got notified about unit deactivation.");
|
||||
} else if (p->state == PATH_WAITING &&
|
||||
!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other))) {
|
||||
!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other))) {
|
||||
if (!on_defer)
|
||||
log_unit_debug(u, "Got notified about unit activation.");
|
||||
} else
|
||||
|
||||
Reference in New Issue
Block a user