mirror of
https://git.yoctoproject.org/poky
synced 2026-01-29 21:08:42 +01:00
systemd-systemctl: fix dead loop when multi services enable each other
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] 826931e95a
(From OE-Core rev: 4c45f975310184a773b25b8e7d7ef50fba2f7bd6)
Signed-off-by: Xiangyu Chen <xiangyu.chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
8112d61720
commit
e31be0b0e6
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user