diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2022-08-31 10:55:56 +0200 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2022-09-01 12:36:54 +0200 |
commit | 7a8cfd1467b4fff93ca7b1c186bd322912b126a3 (patch) | |
tree | eed3e93f342ef210a41e1a4a6b7560148a075492 | |
parent | 7dccb5f548c5e31c5e4527be73df3481a2829d4a (diff) |
team: back off a little when re-spawning teamdteamd-respawn-backoff
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.
-rw-r--r-- | src/core/devices/team/nm-device-team.c | 20 |
1 files 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 |