summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2022-08-31 10:55:56 +0200
committerLubomir Rintel <lkundrak@v3.sk>2022-09-01 12:36:54 +0200
commit7a8cfd1467b4fff93ca7b1c186bd322912b126a3 (patch)
treeeed3e93f342ef210a41e1a4a6b7560148a075492
parent7dccb5f548c5e31c5e4527be73df3481a2829d4a (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.c20
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