mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-06 12:38:10 +02:00
cloud-setup: merge branch 'th/cloud-setup-fix-cancellation'
https://bugzilla.redhat.com/show_bug.cgi?id=2207812 https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1654 (cherry picked from commit7e6a6dd275) (cherry picked from commit268819367e)
This commit is contained in:
commit
d2e1c8bee0
2 changed files with 35 additions and 16 deletions
|
|
@ -15,6 +15,12 @@
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GCancellable *cancellable;
|
||||||
|
gboolean enabled;
|
||||||
|
gboolean signal_received;
|
||||||
|
} SigTermData;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GMainLoop *main_loop;
|
GMainLoop *main_loop;
|
||||||
GCancellable *cancellable;
|
GCancellable *cancellable;
|
||||||
|
|
@ -444,7 +450,7 @@ _nmc_mangle_connection(NMDevice *device,
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_config_one(GCancellable *sigterm_cancellable,
|
_config_one(SigTermData *sigterm_data,
|
||||||
NMClient *nmc,
|
NMClient *nmc,
|
||||||
const NMCSProviderGetConfigResult *result,
|
const NMCSProviderGetConfigResult *result,
|
||||||
guint idx)
|
guint idx)
|
||||||
|
|
@ -464,7 +470,7 @@ _config_one(GCancellable *sigterm_cancellable,
|
||||||
|
|
||||||
g_main_context_iteration(NULL, FALSE);
|
g_main_context_iteration(NULL, FALSE);
|
||||||
|
|
||||||
if (g_cancellable_is_cancelled(sigterm_cancellable))
|
if (g_cancellable_is_cancelled(sigterm_data->cancellable))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
device = nm_g_object_ref(_nmc_get_device_by_hwaddr(nmc, hwaddr));
|
device = nm_g_object_ref(_nmc_get_device_by_hwaddr(nmc, hwaddr));
|
||||||
|
|
@ -498,7 +504,7 @@ try_again:
|
||||||
g_clear_error(&error);
|
g_clear_error(&error);
|
||||||
|
|
||||||
applied_connection = nmcs_device_get_applied_connection(device,
|
applied_connection = nmcs_device_get_applied_connection(device,
|
||||||
sigterm_cancellable,
|
sigterm_data->cancellable,
|
||||||
&applied_version_id,
|
&applied_version_id,
|
||||||
&error);
|
&error);
|
||||||
if (!applied_connection) {
|
if (!applied_connection) {
|
||||||
|
|
@ -560,8 +566,12 @@ try_again:
|
||||||
* during package upgrade. */
|
* during package upgrade. */
|
||||||
maybe_no_preserved_external_ip = TRUE;
|
maybe_no_preserved_external_ip = TRUE;
|
||||||
|
|
||||||
|
/* Once we start reconfiguring the system, we cannot abort in the middle. From now on,
|
||||||
|
* any SIGTERM gets ignored until we are done. */
|
||||||
|
sigterm_data->enabled = FALSE;
|
||||||
|
|
||||||
if (!nmcs_device_reapply(device,
|
if (!nmcs_device_reapply(device,
|
||||||
sigterm_cancellable,
|
NULL,
|
||||||
applied_connection,
|
applied_connection,
|
||||||
applied_version_id,
|
applied_version_id,
|
||||||
maybe_no_preserved_external_ip,
|
maybe_no_preserved_external_ip,
|
||||||
|
|
@ -592,15 +602,13 @@ try_again:
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_config_all(GCancellable *sigterm_cancellable,
|
_config_all(SigTermData *sigterm_data, NMClient *nmc, const NMCSProviderGetConfigResult *result)
|
||||||
NMClient *nmc,
|
|
||||||
const NMCSProviderGetConfigResult *result)
|
|
||||||
{
|
{
|
||||||
gboolean any_changes = FALSE;
|
gboolean any_changes = FALSE;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
for (i = 0; i < result->n_iface_datas; i++) {
|
for (i = 0; i < result->n_iface_datas; i++) {
|
||||||
if (_config_one(sigterm_cancellable, nmc, result, i))
|
if (_config_one(sigterm_data, nmc, result, i))
|
||||||
any_changes = TRUE;
|
any_changes = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -612,13 +620,16 @@ _config_all(GCancellable *sigterm_cancellable,
|
||||||
static gboolean
|
static gboolean
|
||||||
sigterm_handler(gpointer user_data)
|
sigterm_handler(gpointer user_data)
|
||||||
{
|
{
|
||||||
GCancellable *sigterm_cancellable = user_data;
|
SigTermData *sigterm_data = user_data;
|
||||||
|
|
||||||
if (!g_cancellable_is_cancelled(sigterm_cancellable)) {
|
_LOGD("SIGTERM received (%s) (%s)",
|
||||||
_LOGD("SIGTERM received");
|
sigterm_data->signal_received ? "first time" : "again",
|
||||||
g_cancellable_cancel(user_data);
|
sigterm_data->enabled ? "cancel operation" : "ignore");
|
||||||
} else
|
|
||||||
_LOGD("SIGTERM received (again)");
|
sigterm_data->signal_received = TRUE;
|
||||||
|
|
||||||
|
if (sigterm_data->enabled)
|
||||||
|
g_cancellable_cancel(sigterm_data->cancellable);
|
||||||
return G_SOURCE_CONTINUE;
|
return G_SOURCE_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -633,6 +644,7 @@ main(int argc, const char *const *argv)
|
||||||
gs_unref_object NMClient *nmc = NULL;
|
gs_unref_object NMClient *nmc = NULL;
|
||||||
nm_auto_free_nmcs_provider_get_config_result NMCSProviderGetConfigResult *result = NULL;
|
nm_auto_free_nmcs_provider_get_config_result NMCSProviderGetConfigResult *result = NULL;
|
||||||
gs_free_error GError *error = NULL;
|
gs_free_error GError *error = NULL;
|
||||||
|
SigTermData sigterm_data;
|
||||||
|
|
||||||
_nm_logging_enabled_init(g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_LOG")));
|
_nm_logging_enabled_init(g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_LOG")));
|
||||||
|
|
||||||
|
|
@ -645,7 +657,12 @@ main(int argc, const char *const *argv)
|
||||||
|
|
||||||
sigterm_cancellable = g_cancellable_new();
|
sigterm_cancellable = g_cancellable_new();
|
||||||
|
|
||||||
sigterm_source = nm_g_unix_signal_add_source(SIGTERM, sigterm_handler, sigterm_cancellable);
|
sigterm_data = (SigTermData){
|
||||||
|
.cancellable = sigterm_cancellable,
|
||||||
|
.enabled = TRUE,
|
||||||
|
.signal_received = FALSE,
|
||||||
|
};
|
||||||
|
sigterm_source = nm_g_unix_signal_add_source(SIGTERM, sigterm_handler, &sigterm_data);
|
||||||
|
|
||||||
provider = _provider_detect(sigterm_cancellable);
|
provider = _provider_detect(sigterm_cancellable);
|
||||||
if (!provider)
|
if (!provider)
|
||||||
|
|
@ -676,7 +693,7 @@ main(int argc, const char *const *argv)
|
||||||
if (!result)
|
if (!result)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (_config_all(sigterm_cancellable, nmc, result))
|
if (_config_all(&sigterm_data, nmc, result))
|
||||||
_LOGI("some changes were applied for provider %s", nmcs_provider_get_name(provider));
|
_LOGI("some changes were applied for provider %s", nmcs_provider_get_name(provider));
|
||||||
else
|
else
|
||||||
_LOGD("no changes were applied for provider %s", nmcs_provider_get_name(provider));
|
_LOGD("no changes were applied for provider %s", nmcs_provider_get_name(provider));
|
||||||
|
|
|
||||||
|
|
@ -833,6 +833,8 @@ nmcs_device_reapply(NMDevice *device,
|
||||||
NMDeviceReapplyFlags reapply_flags = NM_DEVICE_REAPPLY_FLAGS_PRESERVE_EXTERNAL_IP;
|
NMDeviceReapplyFlags reapply_flags = NM_DEVICE_REAPPLY_FLAGS_PRESERVE_EXTERNAL_IP;
|
||||||
|
|
||||||
again:
|
again:
|
||||||
|
g_clear_error(&data.error);
|
||||||
|
|
||||||
nm_device_reapply_async(device,
|
nm_device_reapply_async(device,
|
||||||
connection,
|
connection,
|
||||||
version_id,
|
version_id,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue