From 7a8cfd1467b4fff93ca7b1c186bd322912b126a3 Mon Sep 17 00:00:00 2001 From: Lubomir Rintel Date: Wed, 31 Aug 2022 10:55:56 +0200 Subject: team: back off a little when re-spawning teamd It might have dropped off for a reason (e.g. D-Bus itself has gone away, because the system is transitioning from initrd to real root). Give things a few seconds to cool off, just to be nice. That shouldn't be a big deal, the link should still be operational. --- src/core/devices/team/nm-device-team.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/devices/team/nm-device-team.c b/src/core/devices/team/nm-device-team.c index e6d34266b1..2428368893 100644 --- a/src/core/devices/team/nm-device-team.c +++ b/src/core/devices/team/nm-device-team.c @@ -39,6 +39,7 @@ typedef struct { guint teamd_process_watch; guint teamd_timeout; guint teamd_read_timeout; + guint teamd_backoff; guint teamd_dbus_watch; bool kill_in_progress : 1; GFileMonitor *usock_monitor; @@ -312,6 +313,7 @@ teamd_cleanup(NMDeviceTeam *self, gboolean free_tdc) nm_clear_g_source(&priv->teamd_process_watch); nm_clear_g_source(&priv->teamd_timeout); nm_clear_g_source(&priv->teamd_read_timeout); + nm_clear_g_source(&priv->teamd_backoff); if (priv->teamd_pid > 0) { priv->kill_in_progress = TRUE; @@ -406,9 +408,10 @@ teamd_ready(NMDeviceTeam *self) nm_device_activate_schedule_stage1_device_prepare(device, FALSE); } -static void -teamd_gone(NMDeviceTeam *self) +static gboolean +teamd_backoff_cb(gpointer user_data) { + NMDeviceTeam *self = NM_DEVICE_TEAM(user_data); NMDevice *device = NM_DEVICE(self); NMDeviceState state; @@ -423,6 +426,19 @@ teamd_gone(NMDeviceTeam *self) NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED); } } + + return G_SOURCE_REMOVE; +} + +static void +teamd_gone(NMDeviceTeam *self) +{ + /* Wait a little before respawning. Something unexpected has happened + * causing teamd to disappear and we need to be careful. Maybe a clumsy + * supervisor is just killing off all processes and it's not too nice + * if we respawn too quickly. */ + NM_DEVICE_TEAM_GET_PRIVATE(self)->teamd_backoff = + g_timeout_add_seconds(5, teamd_backoff_cb, self); } static void -- cgit v1.2.1