diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c index 71d4f2bc11..3c7bbe5f1d 100644 --- a/clients/cloud-setup/nmcs-provider-azure.c +++ b/clients/cloud-setup/nmcs-provider-azure.c @@ -103,7 +103,6 @@ typedef struct { NMCSProviderGetConfigTaskData *config_data; guint n_ifaces_pending; GError *error; - bool success:1; } AzureData; typedef struct { @@ -126,30 +125,34 @@ _get_config_maybe_task_return (AzureData *azure_data, GError *error_take) { NMCSProviderGetConfigTaskData *config_data = azure_data->config_data; - gs_free_error GError *azure_error = NULL; if (error_take) { - nm_clear_error (&azure_data->error); - azure_data->error = error_take; + if (!azure_data->error) + azure_data->error = error_take; + else if ( !nm_utils_error_is_cancelled (azure_data->error) + && nm_utils_error_is_cancelled (error_take)) { + nm_clear_error (&azure_data->error); + azure_data->error = error_take; + } else + g_error_free (error_take); } if (azure_data->n_ifaces_pending > 0) return; - azure_error = azure_data->error; - - if (azure_error) { - if (nm_utils_error_is_cancelled (azure_error)) + if (azure_data->error) { + if (nm_utils_error_is_cancelled (azure_data->error)) _LOGD ("get-config: cancelled"); else - _LOGD ("get-config: failed: %s", azure_error->message); - g_task_return_error (config_data->task, g_steal_pointer (&azure_error)); + _LOGD ("get-config: failed: %s", azure_data->error->message); + g_task_return_error (config_data->task, g_steal_pointer (&azure_data->error)); } else { _LOGD ("get-config: success"); g_task_return_pointer (config_data->task, g_hash_table_ref (config_data->result_dict), (GDestroyNotify) g_hash_table_unref); } + nm_g_slice_free (azure_data); g_object_unref (config_data->task); } @@ -218,7 +221,6 @@ _get_config_fetch_done_cb (NMHttpClient *http_client, iface_get_config->cidr_prefix = tmp_prefix; iface_get_config->has_cidr = TRUE; } - azure_data->success = TRUE; } done: @@ -533,7 +535,6 @@ get_config (NMCSProvider *provider, *azure_data = (AzureData) { .config_data = get_config_data, .n_ifaces_pending = 0, - .success = FALSE, }; nm_http_client_poll_get (nmcs_provider_get_http_client (provider), diff --git a/clients/cloud-setup/nmcs-provider-ec2.c b/clients/cloud-setup/nmcs-provider-ec2.c index 1578a33bed..3439a1680c 100644 --- a/clients/cloud-setup/nmcs-provider-ec2.c +++ b/clients/cloud-setup/nmcs-provider-ec2.c @@ -141,30 +141,43 @@ detect (NMCSProvider *provider, typedef struct { NMCSProviderGetConfigTaskData *get_config_data; + GError *error; GCancellable *cancellable; gulong cancelled_id; guint n_pending; } GetConfigIfaceData; static void -_get_config_task_return (GetConfigIfaceData *iface_data, - GError *error_take) +_get_config_task_maybe_return (GetConfigIfaceData *iface_data, + GError *error_take) { NMCSProviderGetConfigTaskData *get_config_data = iface_data->get_config_data; + if (error_take) { + if (!iface_data->error) + iface_data->error = error_take; + else if ( !nm_utils_error_is_cancelled (iface_data->error) + && nm_utils_error_is_cancelled (error_take)) { + nm_clear_error (&iface_data->error); + iface_data->error = error_take; + } else + g_error_free (error_take); + } + + if (iface_data->n_pending > 0) + return; + nm_clear_g_cancellable_disconnect (g_task_get_cancellable (get_config_data->task), &iface_data->cancelled_id); nm_clear_g_cancellable (&iface_data->cancellable); - nm_g_slice_free (iface_data); - - if (error_take) { - if (nm_utils_error_is_cancelled (error_take)) + if (iface_data->error) { + if (nm_utils_error_is_cancelled (iface_data->error)) _LOGD ("get-config: cancelled"); else - _LOGD ("get-config: failed: %s", error_take->message); - g_task_return_error (get_config_data->task, error_take); + _LOGD ("get-config: failed: %s", iface_data->error->message); + g_task_return_error (get_config_data->task, g_steal_pointer (&iface_data->error)); } else { _LOGD ("get-config: success"); g_task_return_pointer (get_config_data->task, @@ -172,6 +185,7 @@ _get_config_task_return (GetConfigIfaceData *iface_data, (GDestroyNotify) g_hash_table_unref); } + nm_g_slice_free (iface_data); g_object_unref (get_config_data->task); } @@ -194,9 +208,6 @@ _get_config_fetch_done_cb (NMHttpClient *http_client, &response_data, &error); - if (nm_utils_error_is_cancelled (error)) - return; - if (!error) { NMCSProviderGetConfigIfaceData *config_iface_data; in_addr_t tmp_addr; @@ -240,10 +251,8 @@ _get_config_fetch_done_cb (NMHttpClient *http_client, } } - if (--iface_data->n_pending > 0) - return; - - _get_config_task_return (iface_data, NULL); + iface_data->n_pending--; + _get_config_task_maybe_return (iface_data, g_steal_pointer (&error)); } static void @@ -272,8 +281,8 @@ _get_config_fetch_cancelled_cb (GObject *object, gpointer user_data) nm_clear_g_signal_handler (g_task_get_cancellable (iface_data->get_config_data->task), &iface_data->cancelled_id); - _get_config_task_return (iface_data, - nm_utils_error_new_cancelled (FALSE, NULL)); + _get_config_task_maybe_return (iface_data, + nm_utils_error_new_cancelled (FALSE, NULL)); } typedef struct { @@ -317,16 +326,16 @@ _get_config_metadata_ready_cb (GObject *source, }; if (nm_utils_error_is_cancelled (error)) { - _get_config_task_return (iface_data, g_steal_pointer (&error)); + _get_config_task_maybe_return (iface_data, g_steal_pointer (&error)); return; } /* We ignore errors. Only if we got no response at all, it's a problem. * Otherwise, we proceed with whatever we could fetch. */ if (!response_parsed) { - _get_config_task_return (iface_data, - nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN, - "meta data for interfaces not found")); + _get_config_task_maybe_return (iface_data, + nm_utils_error_new (NM_UTILS_ERROR_UNKNOWN, + "meta data for interfaces not found")); return; } @@ -339,8 +348,8 @@ _get_config_metadata_ready_cb (GObject *source, iface_data, NULL); if (cancelled_id == 0) { - _get_config_task_return (iface_data, - nm_utils_error_new_cancelled (FALSE, NULL)); + _get_config_task_maybe_return (iface_data, + nm_utils_error_new_cancelled (FALSE, NULL)); return; } @@ -411,8 +420,7 @@ _get_config_metadata_ready_cb (GObject *source, nm_utils_user_data_pack (iface_data, hwaddr)); } - if (iface_data->n_pending == 0) - _get_config_task_return (iface_data, NULL); + _get_config_task_maybe_return (iface_data, NULL); } static gboolean diff --git a/clients/cloud-setup/nmcs-provider-gcp.c b/clients/cloud-setup/nmcs-provider-gcp.c index 7a8f3ef893..8517530288 100644 --- a/clients/cloud-setup/nmcs-provider-gcp.c +++ b/clients/cloud-setup/nmcs-provider-gcp.c @@ -99,7 +99,6 @@ typedef struct { NMCSProviderGetConfigTaskData *config_data; guint n_ifaces_pending; GError *error; - bool success:1; } GCPData; typedef struct { @@ -114,26 +113,27 @@ _get_config_maybe_task_return (GCPData *gcp_data, GError *error_take) { NMCSProviderGetConfigTaskData *config_data = gcp_data->config_data; - gs_free_error GError *gcp_error = NULL; if (error_take) { - nm_clear_error (&gcp_data->error); - gcp_data->error = error_take; + if (!gcp_data->error) + gcp_data->error = error_take; + else if ( !nm_utils_error_is_cancelled (gcp_data->error) + && nm_utils_error_is_cancelled (error_take)) { + nm_clear_error (&gcp_data->error); + gcp_data->error = error_take; + } else + g_error_free (error_take); } - if (gcp_data->n_ifaces_pending) + if (gcp_data->n_ifaces_pending > 0) return; - gcp_error = gcp_data->error; - - if (!gcp_data->success) { - nm_assert (gcp_error); - - if (nm_utils_error_is_cancelled (gcp_error)) + if (gcp_data->error) { + if (nm_utils_error_is_cancelled (gcp_data->error)) _LOGD ("get-config: cancelled"); else - _LOGD ("get-config: failed: %s", gcp_error->message); - g_task_return_error (config_data->task, g_steal_pointer (&gcp_error)); + _LOGD ("get-config: failed: %s", gcp_data->error->message); + g_task_return_error (config_data->task, g_steal_pointer (&gcp_data->error)); } else { _LOGD ("get-config: success"); g_task_return_pointer (config_data->task, @@ -199,15 +199,15 @@ _get_config_fip_cb (GObject *source, g_variant_new_string ("local")); routes_arr[iface_get_config->iproutes_len] = route_new; ++iface_get_config->iproutes_len; - gcp_data->success = TRUE; iface_done: --iface_data->n_fips_pending; if (iface_data->n_fips_pending == 0) { nm_g_slice_free (iface_data); --gcp_data->n_ifaces_pending; - _get_config_maybe_task_return (gcp_data, g_steal_pointer (&error)); } + + _get_config_maybe_task_return (gcp_data, g_steal_pointer (&error)); } static void @@ -450,7 +450,6 @@ _get_net_ifaces_list_cb (GObject *source, NULL, _get_config_iface_cb, data); - } if (ifaces_arr->len == 0) { @@ -473,7 +472,6 @@ get_config (NMCSProvider *provider, .config_data = get_config_data, .n_ifaces_pending = 0, .error = NULL, - .success = FALSE, }; nm_http_client_poll_get (nmcs_provider_get_http_client (provider),