mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-09 06:30:21 +01:00
team: fix teamd startup code (rh #1184923)
Since03a5a85d, NMDeviceTeam was trying to use priv->teamd_pid to decide whether a teamd_dbus_vanished() call indicated "teamd hasn't been started yet" or "teamd was previously started and has now exited". But this resulted in a race condition, where at startup, a device could call g_dbus_watch_name(), then launch teamd (causing teamd_pid to get set), and then have gdbus report that teamd hasn't been started yet before the newly-launched teamd managed to grab the bus name. Since teamd_pid would already be set when teamd_dbus_vanished() was called, it would decide that this meant "teamd was previously started and has now exited", so it would call teamd_cleanup(), killing the just-started teamd process. Fix this by having teamd_dbus_vanished() check priv->tdc instead, which doesn't get set until after the first teamd_dbus_appeared() call. (cherry picked from commitf0e74622cc)
This commit is contained in:
parent
293a507fa8
commit
4638529b46
1 changed files with 4 additions and 7 deletions
|
|
@ -352,14 +352,11 @@ teamd_dbus_vanished (GDBusConnection *connection,
|
|||
|
||||
g_return_if_fail (priv->teamd_dbus_watch);
|
||||
|
||||
if (!priv->teamd_pid) {
|
||||
if (!priv->tdc) {
|
||||
/* g_bus_watch_name will always raise an initial signal, to indicate whether the
|
||||
* name exists/not exists initially. Do not take this as a failure, until the
|
||||
* startup timeout is over.
|
||||
*
|
||||
* Note that g_bus_watch_name is guaranteed to alternate vanished/appeared signals,
|
||||
* so we won't hit this condition again (because the next signal is either 'appeared'
|
||||
* or 'timeout'). */
|
||||
* name exists/not exists initially. Do not take this as a failure if it hadn't
|
||||
* previously appeared.
|
||||
*/
|
||||
_LOGD (LOGD_TEAM, "teamd not on D-Bus (ignored)");
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue