cloud-setup: merge branch 'th/cloud-setup-error-handling'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/593
This commit is contained in:
Thomas Haller 2020-07-30 09:22:53 +02:00
commit 94e2348c54
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
3 changed files with 61 additions and 54 deletions

View file

@ -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),

View file

@ -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

View file

@ -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),