[systemd-devel] network/openvswitch dependency loop/deadlock
Ian Pilcher
arequipeno at gmail.com
Thu Feb 7 07:55:01 PST 2013
On 02/07/2013 06:13 AM, Colin Guthrie wrote:
> 'Twas brillig, and Ian Pilcher at 06/02/13 22:27 did gyre and gimble:
>> * systemd sees "Before=... network.target" in openvswitch.service and
>> waits for the network service to complete -- which will never happen,
>> because the network service is waiting for the openvswitch servicr to
>> start.
>>
>> * DEADLOCK!
>
> This last step shouldn't (in theory) be a problem as far as I understand
> it. Before=network.target doesn't imply it that has to wait for
> network.service to complete - it should only imply that both
> network.service and openvswitch.service are both have to start before
> network.target is considered reached. If it said After=network.target
> then I would see an obvious deadlock, but with both saying Before= they
> should be able to work fine.
Well it would help if my brain worked a bit better. openvswitch.service
does, in fact, contain:
After=syslog.target network.target
So there's the "obvious deadlock".
>> Assuming that the answer is yes, what is the best way to work around
>> this?
>>
>> * Removing network.target from the Before=... line in
>> openvswitch.service is not an option. See comment #1 of that bug.
>>
>> * Changing the network startup script (ifup-ovs) to use "systemctl
>> --ignore-dependencies start openvswitch.service" appears to work, but
>> the man page discourages its use for anything but debugging.
>
> Depending on how the daemon is used, it might make more sense to use
> --no-block. This will return control to the command line straight away,
> but obviously the daemon may not be "ready" for communications yet and
> the script may fail.
--no-block is not going to be an option. The script is trying to bring
up an Open vSwitch bridge, and it can't do so without a running daemon.
> I'm not familiar with the daemon or what it does and how any IPC may
> work (i.e. how you talk to the daemon).
The script uses ovs-vsctl to talk to ovs-vswitchd.
> I get the feeling I'm perhaps misinterpreting something. I think the
> real reason for the deadlock would be good to track down. It could be
> that it is being artificially held back from completing or some other
> dep is causing the problem.
You made the mistake of believing what I wrote.
> Also re the initscripts tweaks and the if statement proposed in the bug,
> there is a SYSTEMCTL_IGNORE_DEPENDENCIES=1 env var you can export that
> will make "service openvswitch start" pass the --ignore-dependencies
> argument if it redirects to systemctl. That's likely cleaner than the if
> [ -x /usr/bin/systemctl ] check. Obviously as this is arguably not the
> right fix anyway, it's perhaps a moot point.
Cool.
So given that it is in fact "After=... network.target" (in
openvswitch.service) that is causing the problem, do you see a better
solution than using SYSTEMCTL_IGNORE_DEPENDENCIES?
Is there any chance that this would work?
After=syslog.target
Requires=network.target
(While not breaking the use case in comment #34 of the bug.)
I'm very unclear on what Requires=network.target would actually mean.
Thanks for your help, and sorry about the brain-cramp!
--
========================================================================
Ian Pilcher arequipeno at gmail.com
Sometimes there's nothing left to do but crash and burn...or die trying.
========================================================================
More information about the systemd-devel
mailing list