summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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