core: delay startup complete while we have pending DNS updates

While we have DNS updates pending, we cannot reach startup complete.
This commit is contained in:
Thomas Haller
2022-04-08 12:01:51 +02:00
parent 6e35cf4a7d
commit 6c27e58d8d

View File

@@ -146,6 +146,7 @@ typedef struct {
NMPlatform *platform; NMPlatform *platform;
NMDnsManager *dns_mgr; NMDnsManager *dns_mgr;
gulong dns_mgr_update_pending_signal_id;
GArray *capabilities; GArray *capabilities;
@@ -349,6 +350,9 @@ static NMActiveConnection *_new_active_connection(NMManager *self,
static void policy_activating_ac_changed(GObject *object, GParamSpec *pspec, gpointer user_data); static void policy_activating_ac_changed(GObject *object, GParamSpec *pspec, gpointer user_data);
static void device_has_pending_action_changed(NMDevice *device, GParamSpec *pspec, NMManager *self);
static void check_if_startup_complete(NMManager *self);
static gboolean find_master(NMManager *self, static gboolean find_master(NMManager *self,
NMConnection *connection, NMConnection *connection,
NMDevice *device, NMDevice *device,
@@ -1604,7 +1608,11 @@ manager_device_state_changed(NMDevice *device,
nm_settings_device_added(priv->settings, device); nm_settings_device_added(priv->settings, device);
} }
static void device_has_pending_action_changed(NMDevice *device, GParamSpec *pspec, NMManager *self); static void
_dns_mgr_update_pending_cb(NMDevice *device, GParamSpec *pspec, NMManager *self)
{
check_if_startup_complete(self);
}
static void static void
check_if_startup_complete(NMManager *self) check_if_startup_complete(NMManager *self)
@@ -1619,6 +1627,20 @@ check_if_startup_complete(NMManager *self)
if (!priv->devices_inited) if (!priv->devices_inited)
return; return;
if (nm_dns_manager_get_update_pending(nm_manager_get_dns_manager(self))) {
if (priv->dns_mgr_update_pending_signal_id == 0) {
priv->dns_mgr_update_pending_signal_id =
g_signal_connect(nm_manager_get_dns_manager(self),
"notify::" NM_DNS_MANAGER_UPDATE_PENDING,
G_CALLBACK(_dns_mgr_update_pending_cb),
self);
}
return;
}
nm_clear_g_signal_handler(nm_manager_get_dns_manager(self),
&priv->dns_mgr_update_pending_signal_id);
c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) { c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) {
reason = nm_device_has_pending_action_reason(device); reason = nm_device_has_pending_action_reason(device);
if (reason) { if (reason) {
@@ -8275,6 +8297,7 @@ dispose(GObject *object)
g_clear_object(&priv->concheck_mgr); g_clear_object(&priv->concheck_mgr);
} }
nm_clear_g_signal_handler(priv->dns_mgr, &priv->dns_mgr_update_pending_signal_id);
g_clear_object(&priv->dns_mgr); g_clear_object(&priv->dns_mgr);
if (priv->auth_mgr) { if (priv->auth_mgr) {