diff mbox series

systemd-systemctl: fix dead loop when multi services enable each other

Message ID 20240221072942.3521748-1-xiangyu.chen@eng.windriver.com
State Accepted, archived
Commit 4c45f975310184a773b25b8e7d7ef50fba2f7bd6
Headers show
Series systemd-systemctl: fix dead loop when multi services enable each other | expand

Commit Message

Xiangyu Chen Feb. 21, 2024, 7:29 a.m. UTC
From: Xiangyu Chen <xiangyu.chen@windriver.com>

libvirt has added a feature that all sockets for a service being enabled when a single
one of them is enabled since 9.9.x[1], it likes serviceA enable serviceB, serviceB enable
serviceA, that cause our systemctl script trap into a dead loop in postinstall stage,
the error message as below:

Traceback (most recent call last):
  File "/usr/lib/python3.8/pathlib.py", line 722, in __str__
    return self._str
AttributeError: _str

During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "recipe-sysroot-native/usr/bin/systemctl", line 255, in enable
    SystemdUnit(self.root, also).enable(unit)
  File "recipe-sysroot-native/usr/bin/systemctl", line 255, in enable
    SystemdUnit(self.root, also).enable(unit)
  File "recipe-sysroot-native/usr/bin/systemctl", line 255, in enable
    SystemdUnit(self.root, also).enable(unit)
  [Previous line repeated 988 more times]
......
RecursionError: maximum recursion depth exceeded while calling a Python object

Here using an array to record the services which has been enabled to filter the duplicates.

Ref:
[1] https://github.com/libvirt/libvirt/commit/826931e95a38af8322f8ad069dc89117c6404a00

Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com>
---
 meta/recipes-core/systemd/systemd-systemctl/systemctl | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)
diff mbox series

Patch

diff --git a/meta/recipes-core/systemd/systemd-systemctl/systemctl b/meta/recipes-core/systemd/systemd-systemctl/systemctl
index 7fe751b397..2229bc7b6d 100755
--- a/meta/recipes-core/systemd/systemd-systemctl/systemctl
+++ b/meta/recipes-core/systemd/systemd-systemctl/systemctl
@@ -209,7 +209,7 @@  class SystemdUnit():
         except KeyError:
             pass
 
-    def enable(self, caller_unit=None):
+    def enable(self, units_enabled=[]):
         # if we're enabling an instance, first extract the actual instance
         # then figure out what the template unit is
         template = re.match(r"[^@]+@(?P<instance>[^\.]*)\.", self.unit)
@@ -248,8 +248,9 @@  class SystemdUnit():
         try:
             for also in config.get('Install', 'Also'):
                 try:
-                    if caller_unit != also:
-                        SystemdUnit(self.root, also).enable(unit)
+                     units_enabled.append(unit)
+                     if also not in units_enabled:
+                        SystemdUnit(self.root, also).enable(units_enabled)
                 except SystemdUnitNotFoundError as e:
                     sys.exit("Error: Systemctl also enable issue with  %s (%s)" % (service, e.unit))