Blame SOURCES/1001-Revert-policy-track-the-autoconnect-retries-in-devic.patch

2e8179
From a021ee273afeaa5e9324270185bbfe33c64a92cf Mon Sep 17 00:00:00 2001
2e8179
From: Thomas Haller <thaller@redhat.com>
2e8179
Date: Tue, 20 Dec 2022 16:11:16 +0100
2e8179
Subject: [PATCH 1/1] Revert "policy: track the autoconnect retries in devices
2e8179
 for multi-connect"
2e8179
2e8179
With multi-connect enabled, this can cause infinite retries to autoconnect,
2e8179
see [1].
2e8179
2e8179
That has bad consequences for example in initrd, where
2e8179
nm-wait-online-initrd.service would wait up to one hour before failing
2e8179
and blocking boot.
2e8179
2e8179
This reverts commit 1656d82045343b5af5b86cf129d4f2b12540b277.
2e8179
2e8179
[1] https://bugzilla.redhat.com/show_bug.cgi?id=2039734#c5
2e8179
2e8179
Fixes: 1656d8204534 ('policy: track the autoconnect retries in devices for multi-connect')
2e8179
(cherry picked from commit aec7ae8279cc9b3de7e75140b75fe997f43700fc)
2e8179
(cherry picked from commit ba663123669ae1a5670e4a85ce2cf520fea875f6)
2e8179
---
2e8179
 src/core/devices/nm-device.c |  50 ----------------
2e8179
 src/core/devices/nm-device.h |   5 --
2e8179
 src/core/nm-policy.c         | 112 ++++-------------------------------
2e8179
 3 files changed, 10 insertions(+), 157 deletions(-)
2e8179
2e8179
diff --git a/src/core/devices/nm-device.c b/src/core/devices/nm-device.c
2e8179
index 059e31f298a5..056ca34c1c4d 100644
2e8179
--- a/src/core/devices/nm-device.c
2e8179
+++ b/src/core/devices/nm-device.c
2e8179
@@ -96,8 +96,6 @@
2e8179
 #define NM_DEVICE_AUTH_RETRIES_INFINITY -2
2e8179
 #define NM_DEVICE_AUTH_RETRIES_DEFAULT  3
2e8179
 
2e8179
-#define AUTOCONNECT_RESET_RETRIES_TIMER 300
2e8179
-
2e8179
 /*****************************************************************************/
2e8179
 
2e8179
 typedef void (*ActivationHandleFunc)(NMDevice *self);
2e8179
@@ -763,9 +761,6 @@ typedef struct _NMDevicePrivate {
2e8179
 
2e8179
     GVariant *ports_variant; /* Array of port devices D-Bus path */
2e8179
     char     *prop_ip_iface; /* IP interface D-Bus property */
2e8179
-
2e8179
-    int    autoconnect_retries;
2e8179
-    gint32 autoconnect_retries_blocked_until;
2e8179
 } NMDevicePrivate;
2e8179
 
2e8179
 G_DEFINE_ABSTRACT_TYPE(NMDevice, nm_device, NM_TYPE_DBUS_OBJECT)
2e8179
@@ -16881,49 +16876,6 @@ nm_device_get_initial_hw_address(NMDevice *self)
2e8179
     return NM_DEVICE_GET_PRIVATE(self)->hw_addr_initial;
2e8179
 }
2e8179
 
2e8179
-void
2e8179
-nm_device_set_autoconnect_retries(NMDevice *self, int tries)
2e8179
-{
2e8179
-    NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
2e8179
-
2e8179
-    if (priv->autoconnect_retries != tries) {
2e8179
-        _LOGT(LOGD_DEVICE, "autoconnect: retries set %d", tries);
2e8179
-        priv->autoconnect_retries = tries;
2e8179
-    }
2e8179
-
2e8179
-    if (tries)
2e8179
-        priv->autoconnect_retries_blocked_until = 0; /* we are not blocked anymore */
2e8179
-    else
2e8179
-        priv->autoconnect_retries_blocked_until =
2e8179
-            nm_utils_get_monotonic_timestamp_sec() + AUTOCONNECT_RESET_RETRIES_TIMER;
2e8179
-}
2e8179
-
2e8179
-int
2e8179
-nm_device_get_autoconnect_retries(NMDevice *self)
2e8179
-{
2e8179
-    NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
2e8179
-
2e8179
-    return priv->autoconnect_retries;
2e8179
-}
2e8179
-
2e8179
-gint32
2e8179
-nm_device_autoconnect_retries_blocked_until(NMDevice *self)
2e8179
-{
2e8179
-    NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
2e8179
-
2e8179
-    return priv->autoconnect_retries_blocked_until;
2e8179
-}
2e8179
-
2e8179
-void
2e8179
-nm_device_autoconnect_retries_reset(NMDevice *self)
2e8179
-{
2e8179
-    NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
2e8179
-
2e8179
-    /* default value, we will sync. with connection value when needed */
2e8179
-    priv->autoconnect_retries               = -2;
2e8179
-    priv->autoconnect_retries_blocked_until = 0;
2e8179
-}
2e8179
-
2e8179
 /**
2e8179
  * nm_device_spec_match_list:
2e8179
  * @self: an #NMDevice
2e8179
@@ -17675,8 +17627,6 @@ nm_device_init(NMDevice *self)
2e8179
     priv->sys_iface_state_      = NM_DEVICE_SYS_IFACE_STATE_EXTERNAL;
2e8179
 
2e8179
     priv->promisc_reset = NM_OPTION_BOOL_DEFAULT;
2e8179
-
2e8179
-    priv->autoconnect_retries = -2;
2e8179
 }
2e8179
 
2e8179
 static GObject *
2e8179
diff --git a/src/core/devices/nm-device.h b/src/core/devices/nm-device.h
2e8179
index fea46bb78cae..de850e68f2a1 100644
2e8179
--- a/src/core/devices/nm-device.h
2e8179
+++ b/src/core/devices/nm-device.h
2e8179
@@ -464,11 +464,6 @@ const char *nm_device_get_permanent_hw_address_full(NMDevice *self,
2e8179
                                                     gboolean *out_is_fake);
2e8179
 const char *nm_device_get_initial_hw_address(NMDevice *dev);
2e8179
 
2e8179
-void   nm_device_set_autoconnect_retries(NMDevice *self, int tries);
2e8179
-int    nm_device_get_autoconnect_retries(NMDevice *self);
2e8179
-gint32 nm_device_autoconnect_retries_blocked_until(NMDevice *self);
2e8179
-void   nm_device_autoconnect_retries_reset(NMDevice *self);
2e8179
-
2e8179
 NMDhcpConfig *nm_device_get_dhcp_config(NMDevice *dev, int addr_family);
2e8179
 
2e8179
 NML3Cfg *nm_device_get_l3cfg(NMDevice *self);
2e8179
diff --git a/src/core/nm-policy.c b/src/core/nm-policy.c
2e8179
index 518fc596dc88..0c07c29e98eb 100644
2e8179
--- a/src/core/nm-policy.c
2e8179
+++ b/src/core/nm-policy.c
2e8179
@@ -1579,7 +1579,6 @@ nm_policy_unblock_failed_ovs_interfaces(NMPolicy *self)
2e8179
     NMPolicyPrivate             *priv        = NM_POLICY_GET_PRIVATE(self);
2e8179
     NMSettingsConnection *const *connections = NULL;
2e8179
     guint                        i;
2e8179
-    gboolean                     multiconnect = FALSE;
2e8179
 
2e8179
     _LOGT(LOGD_DEVICE, "unblocking failed OVS interfaces");
2e8179
 
2e8179
@@ -1587,13 +1586,6 @@ nm_policy_unblock_failed_ovs_interfaces(NMPolicy *self)
2e8179
     for (i = 0; connections[i]; i++) {
2e8179
         NMSettingsConnection *sett_conn  = connections[i];
2e8179
         NMConnection         *connection = nm_settings_connection_get_connection(sett_conn);
2e8179
-        NMSettingConnection  *s_con      = nm_connection_get_setting_connection(connection);
2e8179
-
2e8179
-        /* Check if any connection is connect multiple */
2e8179
-        if (s_con
2e8179
-            && nm_setting_connection_get_multi_connect(s_con)
2e8179
-                   == NM_CONNECTION_MULTI_CONNECT_MULTIPLE)
2e8179
-            multiconnect = TRUE;
2e8179
 
2e8179
         if (nm_connection_get_setting_ovs_interface(connection)) {
2e8179
             nm_settings_connection_autoconnect_retries_reset(sett_conn);
2e8179
@@ -1603,18 +1595,6 @@ nm_policy_unblock_failed_ovs_interfaces(NMPolicy *self)
2e8179
                 FALSE);
2e8179
         }
2e8179
     }
2e8179
-
2e8179
-    /* There is, at least, one multiconnect connection with an OVS setting.
2e8179
-     * Let's check the OVS devices retries */
2e8179
-    if (multiconnect) {
2e8179
-        NMDevice      *device;
2e8179
-        GHashTableIter h_iter;
2e8179
-        g_hash_table_iter_init(&h_iter, priv->devices);
2e8179
-        while (g_hash_table_iter_next(&h_iter, (gpointer *) &device, NULL)) {
2e8179
-            if (nm_device_get_device_type(device) == NM_DEVICE_TYPE_OVS_INTERFACE)
2e8179
-                nm_device_autoconnect_retries_reset(device);
2e8179
-        }
2e8179
-    }
2e8179
 }
2e8179
 
2e8179
 static gboolean
2e8179
@@ -1626,8 +1606,7 @@ reset_autoconnect_all(
2e8179
     NMPolicyPrivate             *priv        = NM_POLICY_GET_PRIVATE(self);
2e8179
     NMSettingsConnection *const *connections = NULL;
2e8179
     guint                        i;
2e8179
-    gboolean                     changed      = FALSE;
2e8179
-    gboolean                     multiconnect = FALSE;
2e8179
+    gboolean                     changed = FALSE;
2e8179
 
2e8179
     _LOGD(LOGD_DEVICE,
2e8179
           "re-enabling autoconnect for all connections%s%s%s",
2e8179
@@ -1638,8 +1617,6 @@ reset_autoconnect_all(
2e8179
     connections = nm_settings_get_connections(priv->settings, NULL);
2e8179
     for (i = 0; connections[i]; i++) {
2e8179
         NMSettingsConnection *sett_conn = connections[i];
2e8179
-        NMSettingConnection  *s_con =
2e8179
-            nm_connection_get_setting_connection(nm_settings_connection_get_connection(sett_conn));
2e8179
 
2e8179
         if (device
2e8179
             && !nm_device_check_connection_compatible(
2e8179
@@ -1648,11 +1625,6 @@ reset_autoconnect_all(
2e8179
                 NULL))
2e8179
             continue;
2e8179
 
2e8179
-        if (s_con
2e8179
-            && nm_setting_connection_get_multi_connect(s_con)
2e8179
-                   == NM_CONNECTION_MULTI_CONNECT_MULTIPLE)
2e8179
-            multiconnect = TRUE;
2e8179
-
2e8179
         if (only_no_secrets) {
2e8179
             /* we only reset the no-secrets blocked flag. */
2e8179
             if (nm_settings_connection_autoconnect_blocked_reason_set(
2e8179
@@ -1681,20 +1653,6 @@ reset_autoconnect_all(
2e8179
             }
2e8179
         }
2e8179
     }
2e8179
-
2e8179
-    /* There is, at least, one multiconnect connection. Let's check the devices retries */
2e8179
-    if (multiconnect) {
2e8179
-        NMDevice      *device_iter;
2e8179
-        GHashTableIter h_iter;
2e8179
-        g_hash_table_iter_init(&h_iter, priv->devices);
2e8179
-        while (g_hash_table_iter_next(&h_iter, (gpointer *) &device_iter, NULL)) {
2e8179
-            if (nm_device_get_autoconnect_retries(device_iter) != -2) {
2e8179
-                nm_device_autoconnect_retries_reset(device_iter);
2e8179
-                changed = TRUE;
2e8179
-            }
2e8179
-        }
2e8179
-    }
2e8179
-
2e8179
     return changed;
2e8179
 }
2e8179
 
2e8179
@@ -1752,8 +1710,7 @@ reset_connections_retries(gpointer user_data)
2e8179
     NMSettingsConnection *const *connections = NULL;
2e8179
     guint                        i;
2e8179
     gint32                       con_stamp, min_stamp, now;
2e8179
-    gboolean                     changed      = FALSE;
2e8179
-    gboolean                     multiconnect = FALSE;
2e8179
+    gboolean                     changed = FALSE;
2e8179
 
2e8179
     priv->reset_retries_id = 0;
2e8179
 
2e8179
@@ -1762,14 +1719,6 @@ reset_connections_retries(gpointer user_data)
2e8179
     connections = nm_settings_get_connections(priv->settings, NULL);
2e8179
     for (i = 0; connections[i]; i++) {
2e8179
         NMSettingsConnection *connection = connections[i];
2e8179
-        NMSettingConnection  *s_con =
2e8179
-            nm_connection_get_setting_connection(nm_settings_connection_get_connection(connection));
2e8179
-
2e8179
-        /* Check if any connection is connect multiple */
2e8179
-        if (s_con
2e8179
-            && nm_setting_connection_get_multi_connect(s_con)
2e8179
-                   == NM_CONNECTION_MULTI_CONNECT_MULTIPLE)
2e8179
-            multiconnect = TRUE;
2e8179
 
2e8179
         con_stamp = nm_settings_connection_autoconnect_retries_blocked_until(connection);
2e8179
         if (con_stamp == 0)
2e8179
@@ -1782,25 +1731,6 @@ reset_connections_retries(gpointer user_data)
2e8179
             min_stamp = con_stamp;
2e8179
     }
2e8179
 
2e8179
-    /* There is, at least, one multiconnect connection. Let's check the devices retries */
2e8179
-    if (multiconnect) {
2e8179
-        NMDevice      *device;
2e8179
-        GHashTableIter h_iter;
2e8179
-        g_hash_table_iter_init(&h_iter, priv->devices);
2e8179
-        while (g_hash_table_iter_next(&h_iter, (gpointer *) &device, NULL)) {
2e8179
-            con_stamp = nm_device_autoconnect_retries_blocked_until(device);
2e8179
-
2e8179
-            /* default value in device is -2, which means, we do not care */
2e8179
-            if (con_stamp <= 0)
2e8179
-                continue;
2e8179
-            if (con_stamp <= now) {
2e8179
-                nm_device_autoconnect_retries_reset(device);
2e8179
-                changed = TRUE;
2e8179
-            } else if (min_stamp == 0 || min_stamp > con_stamp)
2e8179
-                min_stamp = con_stamp;
2e8179
-        }
2e8179
-    }
2e8179
-
2e8179
     /* Schedule the handler again if there are some stamps left */
2e8179
     if (min_stamp != 0)
2e8179
         priv->reset_retries_id =
2e8179
@@ -1814,31 +1744,21 @@ reset_connections_retries(gpointer user_data)
2e8179
 }
2e8179
 
2e8179
 static void
2e8179
-_connection_autoconnect_retries_set(NMPolicy             *self,
2e8179
-                                    NMSettingsConnection *connection,
2e8179
-                                    NMDevice             *device,
2e8179
-                                    int                   tries)
2e8179
+_connection_autoconnect_retries_set(NMPolicy *self, NMSettingsConnection *connection, int tries)
2e8179
 {
2e8179
-    NMPolicyPrivate     *priv = NM_POLICY_GET_PRIVATE(self);
2e8179
-    NMSettingConnection *s_con;
2e8179
-    gint32               retry_time;
2e8179
+    NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE(self);
2e8179
 
2e8179
     nm_assert(NM_IS_SETTINGS_CONNECTION(connection));
2e8179
     nm_assert(tries >= 0);
2e8179
 
2e8179
-    s_con = nm_connection_get_setting_connection(nm_settings_connection_get_connection(connection));
2e8179
-    if (s_con
2e8179
-        && nm_setting_connection_get_multi_connect(s_con) == NM_CONNECTION_MULTI_CONNECT_MULTIPLE) {
2e8179
-        nm_device_set_autoconnect_retries(device, tries);
2e8179
-        retry_time = nm_device_autoconnect_retries_blocked_until(device);
2e8179
-    } else {
2e8179
-        nm_settings_connection_autoconnect_retries_set(connection, tries);
2e8179
-        retry_time = nm_settings_connection_autoconnect_retries_blocked_until(connection);
2e8179
-    }
2e8179
+    nm_settings_connection_autoconnect_retries_set(connection, tries);
2e8179
 
2e8179
     if (tries == 0) {
2e8179
         /* Schedule a handler to reset retries count */
2e8179
         if (!priv->reset_retries_id) {
2e8179
+            gint32 retry_time =
2e8179
+                nm_settings_connection_autoconnect_retries_blocked_until(connection);
2e8179
+
2e8179
             g_warn_if_fail(retry_time != 0);
2e8179
             priv->reset_retries_id =
2e8179
                 g_timeout_add_seconds(MAX(0, retry_time - nm_utils_get_monotonic_timestamp_sec()),
2e8179
@@ -2100,25 +2020,13 @@ device_state_changed(NMDevice           *device,
2e8179
             }
2e8179
 
2e8179
             if (!blocked) {
2e8179
-                s_con = nm_connection_get_setting_connection(
2e8179
-                    nm_settings_connection_get_connection(sett_conn));
2e8179
-                if (s_con
2e8179
-                    && nm_setting_connection_get_multi_connect(s_con)
2e8179
-                           == NM_CONNECTION_MULTI_CONNECT_MULTIPLE) {
2e8179
-                    if (nm_device_get_autoconnect_retries(device) == -2)
2e8179
-                        nm_device_set_autoconnect_retries(
2e8179
-                            device,
2e8179
-                            nm_settings_connection_autoconnect_retries_get(sett_conn));
2e8179
-
2e8179
-                    tries = nm_device_get_autoconnect_retries(device);
2e8179
-                } else
2e8179
-                    tries = nm_settings_connection_autoconnect_retries_get(sett_conn);
2e8179
+                tries = nm_settings_connection_autoconnect_retries_get(sett_conn);
2e8179
                 if (tries > 0) {
2e8179
                     _LOGD(LOGD_DEVICE,
2e8179
                           "connection '%s' failed to autoconnect; %d tries left",
2e8179
                           nm_settings_connection_get_id(sett_conn),
2e8179
                           tries - 1);
2e8179
-                    _connection_autoconnect_retries_set(self, sett_conn, device, tries - 1);
2e8179
+                    _connection_autoconnect_retries_set(self, sett_conn, tries - 1);
2e8179
                 } else if (tries != 0) {
2e8179
                     _LOGD(LOGD_DEVICE,
2e8179
                           "connection '%s' failed to autoconnect; infinite tries left",
2e8179
-- 
2e8179
2.38.1
2e8179