summaryrefslogtreecommitdiff
path: root/src/core/unit-dependency-atom.c
diff options
context:
space:
mode:
authorPeter Morrow <pemorrow@linux.microsoft.com>2021-09-23 16:54:32 +0100
committerPeter Morrow <pemorrow@linux.microsoft.com>2021-12-13 11:25:57 +0000
commitcdebedb4d40277aad62a7734ba920b4033228197 (patch)
tree7523417a1b08669301aa1dafacab30342f54e5b6 /src/core/unit-dependency-atom.c
parenta0630d46a59d5c8296c71413eb50c2572e20f046 (diff)
downloadsystemd-cdebedb4d40277aad62a7734ba920b4033228197.tar.gz
service: pass service exit status to spawned On{Failure,Success}= dependency
When a service exits and triggers either an OnFailure= or OnSuccess= dependency we now set a new environment variable for the ExecStart= and ExecStartPre= process. This variable $MONITOR_METADATA exposes the metadata relating to the service which triggered the dependency. MONITOR_METADATA takes the following form: MONITOR_METADATA="SERVICE_RESULT=<result-string0>,EXIT_CODE=<exit-code0>,EXIT_STATUS=<exit-status0>,INVOCATION_ID=<id>,UNIT=<triggering-unit0.service>;SERVICE_RESULT=<result-stringN>,EXIT_CODE=<exit-codeN>,=EXIT_STATUS=<exit-statusN>,INVOCATION_ID=<id>,UNIT=<triggering-unitN.service>" MONITOR_METADATA is space separated set of metadata relating to the service(s) which triggered the dependency. This is a list since if we have 2 services which trigger the same dependency then the dependency start job may be merged. In this case we need to pass both service metadata to the triggered service. If there is no job merging then MONITOR_METADATA will be a single entry. For example, in the case we had a service "failer.service" which triggers "failer-handler.service", the following variable is exported to the ExecStart= and ExecStartPre= processes in failer-handler.service: MONITOR_METADATA="SERVICE_RESULT=exit-code,EXIT_CODE=exited,EXIT_STATUS=1,INVOCATION_ID=67c657ed7b34466ea369abdf994c6393,UNIT=failer.service" In another example where we have failer.service and failer2.service which both also trigger failer-handler.service then the start job for failer-handler.service may be merged and we might get the following: MONITOR_METADATA="SERVICE_RESULT=exit-code,EXIT_CODE=exited,EXIT_STATUS=1,INVOCATION_ID=16a93ad196c94109990fb8b9aa5eef5f,UNIT=failer.service;SERVICE_RESULT=exit-code,EXIT_CODE=exited,EXIT_STATUS=1,INVOCATION_ID=ff70131e4cc145e994fb621de25a3e8f,UNIT=failer2.service"
Diffstat (limited to 'src/core/unit-dependency-atom.c')
-rw-r--r--src/core/unit-dependency-atom.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/core/unit-dependency-atom.c b/src/core/unit-dependency-atom.c
index 761835828a..333eea6c3d 100644
--- a/src/core/unit-dependency-atom.c
+++ b/src/core/unit-dependency-atom.c
@@ -82,11 +82,15 @@ static const UnitDependencyAtom atom_map[_UNIT_DEPENDENCY_MAX] = {
[UNIT_PROPAGATES_STOP_TO] = UNIT_ATOM_RETROACTIVE_STOP_ON_STOP |
UNIT_ATOM_PROPAGATE_STOP,
+ [UNIT_ON_FAILURE] = UNIT_ATOM_ON_FAILURE |
+ UNIT_ATOM_BACK_REFERENCE_IMPLIED,
+
+ [UNIT_ON_SUCCESS] = UNIT_ATOM_ON_SUCCESS |
+ UNIT_ATOM_BACK_REFERENCE_IMPLIED,
+
/* These are simple dependency types: they consist of a single atom only */
[UNIT_BEFORE] = UNIT_ATOM_BEFORE,
[UNIT_AFTER] = UNIT_ATOM_AFTER,
- [UNIT_ON_SUCCESS] = UNIT_ATOM_ON_SUCCESS,
- [UNIT_ON_FAILURE] = UNIT_ATOM_ON_FAILURE,
[UNIT_TRIGGERS] = UNIT_ATOM_TRIGGERS,
[UNIT_TRIGGERED_BY] = UNIT_ATOM_TRIGGERED_BY,
[UNIT_PROPAGATES_RELOAD_TO] = UNIT_ATOM_PROPAGATES_RELOAD_TO,
@@ -196,6 +200,16 @@ UnitDependency unit_dependency_from_unique_atom(UnitDependencyAtom atom) {
case UNIT_ATOM_PROPAGATE_STOP_FAILURE:
return UNIT_CONFLICTED_BY;
+ case UNIT_ATOM_ON_FAILURE |
+ UNIT_ATOM_BACK_REFERENCE_IMPLIED:
+ case UNIT_ATOM_ON_FAILURE:
+ return UNIT_ON_FAILURE;
+
+ case UNIT_ATOM_ON_SUCCESS |
+ UNIT_ATOM_BACK_REFERENCE_IMPLIED:
+ case UNIT_ATOM_ON_SUCCESS:
+ return UNIT_ON_SUCCESS;
+
/* And now, the simple ones */
case UNIT_ATOM_BEFORE:
@@ -204,12 +218,6 @@ UnitDependency unit_dependency_from_unique_atom(UnitDependencyAtom atom) {
case UNIT_ATOM_AFTER:
return UNIT_AFTER;
- case UNIT_ATOM_ON_SUCCESS:
- return UNIT_ON_SUCCESS;
-
- case UNIT_ATOM_ON_FAILURE:
- return UNIT_ON_FAILURE;
-
case UNIT_ATOM_TRIGGERS:
return UNIT_TRIGGERS;