Blame SOURCES/0005-workaround-config-changed-signal.patch

ab7d06
From b74457ac82a360feb57c226f7f8a31a2d159ba17 Mon Sep 17 00:00:00 2001
ab7d06
From: Thomas Haller <thaller@redhat.com>
ab7d06
Date: Mon, 7 Sep 2015 10:48:48 +0200
ab7d06
Subject: [PATCH 1/3] config/test: add a test for nm_config_reload() with
ab7d06
 different signals
ab7d06
ab7d06
(cherry picked from commit e6c64af8be89374ed318ed1a395ead7cd00a6753)
ab7d06
(cherry picked from commit ce7687e49900a72dd2cdd9ee7595004e4f3cf4e6)
ab7d06
---
ab7d06
 src/tests/config/test-config.c | 82 ++++++++++++++++++++++++++++++++++++++++++
ab7d06
 1 file changed, 82 insertions(+)
ab7d06
ab7d06
diff --git a/src/tests/config/test-config.c b/src/tests/config/test-config.c
ab7d06
index 8b8028e..a5975c1 100644
ab7d06
--- a/src/tests/config/test-config.c
ab7d06
+++ b/src/tests/config/test-config.c
ab7d06
@@ -396,6 +396,86 @@ test_config_confdir_parse_error (void)
ab7d06
 	g_clear_error (&error);
ab7d06
 }
ab7d06
 
ab7d06
+/*****************************************************************************/
ab7d06
+
ab7d06
+static void
ab7d06
+_test_signal_config_changed_cb (NMConfig *config,
ab7d06
+                                NMConfigData *config_data,
ab7d06
+                                NMConfigChangeFlags changes,
ab7d06
+                                NMConfigData *old_data,
ab7d06
+                                gpointer user_data)
ab7d06
+{
ab7d06
+	const NMConfigChangeFlags *expected = user_data;
ab7d06
+
ab7d06
+	g_assert (changes);
ab7d06
+	g_assert_cmpint (changes, ==, *expected);
ab7d06
+	g_assert (NM_IS_CONFIG (config));
ab7d06
+	g_assert (NM_IS_CONFIG_DATA (config_data));
ab7d06
+
ab7d06
+	g_assert (config_data == old_data);
ab7d06
+	g_assert (config_data == nm_config_get_data (config));
ab7d06
+}
ab7d06
+
ab7d06
+static void
ab7d06
+_test_signal_config_changed_cb2 (NMConfig *config,
ab7d06
+                                 NMConfigData *config_data,
ab7d06
+                                 NMConfigChangeFlags changes,
ab7d06
+                                 NMConfigData *old_data,
ab7d06
+                                 gpointer user_data)
ab7d06
+{
ab7d06
+	const NMConfigChangeFlags *expected = user_data;
ab7d06
+
ab7d06
+	g_assert (changes);
ab7d06
+	g_assert_cmpint (changes, ==, *expected);
ab7d06
+}
ab7d06
+
ab7d06
+static void
ab7d06
+test_config_signal (void)
ab7d06
+{
ab7d06
+	gs_unref_object NMConfig *config = NULL;
ab7d06
+	NMConfigChangeFlags expected;
ab7d06
+	gs_unref_object NMConfigData *config_data_orig = NULL;
ab7d06
+
ab7d06
+	config = setup_config (NULL, SRCDIR "/NetworkManager.conf", "/no/such/dir", NULL);
ab7d06
+
ab7d06
+	config_data_orig = g_object_ref (nm_config_get_data_orig (config));
ab7d06
+
ab7d06
+	g_signal_connect (G_OBJECT (config),
ab7d06
+	                  NM_CONFIG_SIGNAL_CONFIG_CHANGED,
ab7d06
+	                  G_CALLBACK (_test_signal_config_changed_cb),
ab7d06
+	                  &expected);
ab7d06
+
ab7d06
+	expected = NM_CONFIG_CHANGE_SIGUSR1;
ab7d06
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*config: signal SIGUSR1");
ab7d06
+	nm_config_reload (config, SIGUSR1);
ab7d06
+
ab7d06
+	expected = NM_CONFIG_CHANGE_SIGUSR2;
ab7d06
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*config: signal SIGUSR2");
ab7d06
+	nm_config_reload (config, SIGUSR2);
ab7d06
+
ab7d06
+	expected = NM_CONFIG_CHANGE_SIGHUP;
ab7d06
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*config: signal SIGHUP (no changes from disk)*");
ab7d06
+	nm_config_reload (config, SIGHUP);
ab7d06
+
ab7d06
+
ab7d06
+	/* test with subscribing two signals... */
ab7d06
+	g_signal_connect (G_OBJECT (config),
ab7d06
+	                  NM_CONFIG_SIGNAL_CONFIG_CHANGED,
ab7d06
+	                  G_CALLBACK (_test_signal_config_changed_cb2),
ab7d06
+	                  &expected);
ab7d06
+	expected = NM_CONFIG_CHANGE_SIGUSR2;
ab7d06
+	g_test_expect_message ("NetworkManager", G_LOG_LEVEL_MESSAGE, "*config: signal SIGUSR2");
ab7d06
+	nm_config_reload (config, SIGUSR2);
ab7d06
+	g_signal_handlers_disconnect_by_func (config, _test_signal_config_changed_cb2, &expected);
ab7d06
+
ab7d06
+
ab7d06
+	g_signal_handlers_disconnect_by_func (config, _test_signal_config_changed_cb, &expected);
ab7d06
+
ab7d06
+	g_assert (config_data_orig == nm_config_get_data (config));
ab7d06
+}
ab7d06
+
ab7d06
+/*****************************************************************************/
ab7d06
+
ab7d06
 NMTST_DEFINE ();
ab7d06
 
ab7d06
 int
ab7d06
@@ -419,6 +499,8 @@ main (int argc, char **argv)
ab7d06
 	g_test_add_func ("/config/confdir", test_config_confdir);
ab7d06
 	g_test_add_func ("/config/confdir-parse-error", test_config_confdir_parse_error);
ab7d06
 
ab7d06
+	g_test_add_func ("/config/signal", test_config_signal);
ab7d06
+
ab7d06
 	/* This one has to come last, because it leaves its values in
ab7d06
 	 * nm-config.c's global variables, and there's no way to reset
ab7d06
 	 * those to NULL.
ab7d06
-- 
ab7d06
2.4.3
ab7d06
ab7d06
ab7d06
From ac6ed03af5be72b3fe0e6796804129e02043e18e Mon Sep 17 00:00:00 2001
ab7d06
From: Thomas Haller <thaller@redhat.com>
ab7d06
Date: Tue, 8 Sep 2015 21:39:40 +0200
ab7d06
Subject: [PATCH 2/3] config: workaround invocation of "config-changed" signal
ab7d06
ab7d06
There seems to be a bug in glib/ffi that hits on s390x/ppc64 architecture.
ab7d06
It causes @changes in nm-dns-manager.c:config_changed_cb() to be NONE,
ab7d06
although it is clearly set (see the related bug rh #1260577 for glib).
ab7d06
ab7d06
Workaround this, by making the argument type a plain guint.
ab7d06
ab7d06
Note that the ill behavior is caught by test_config_signal() in
ab7d06
"src/tests/config/test-config.c".
ab7d06
ab7d06
Related: https://bugzilla.redhat.com/show_bug.cgi?id=1062301
ab7d06
(cherry picked from commit e7d66f1df61ebdc7652ba34a4e1baddcc86b9e26)
ab7d06
(cherry picked from commit 9aecabe29f39350c5e31a61af4d49062108dfc89)
ab7d06
---
ab7d06
 src/nm-config.c                | 12 +++++++++++-
ab7d06
 src/tests/config/test-config.c |  5 ++++-
ab7d06
 2 files changed, 15 insertions(+), 2 deletions(-)
ab7d06
ab7d06
diff --git a/src/nm-config.c b/src/nm-config.c
ab7d06
index 86b3d92..011e57f 100644
ab7d06
--- a/src/nm-config.c
ab7d06
+++ b/src/nm-config.c
ab7d06
@@ -1214,7 +1214,17 @@ nm_config_class_init (NMConfigClass *config_class)
ab7d06
 	                  G_SIGNAL_RUN_FIRST,
ab7d06
 	                  G_STRUCT_OFFSET (NMConfigClass, config_changed),
ab7d06
 	                  NULL, NULL, NULL,
ab7d06
-	                  G_TYPE_NONE, 3, NM_TYPE_CONFIG_DATA, NM_TYPE_CONFIG_CHANGE_FLAGS, NM_TYPE_CONFIG_DATA);
ab7d06
+	                  G_TYPE_NONE,
ab7d06
+	                  3,
ab7d06
+	                  NM_TYPE_CONFIG_DATA,
ab7d06
+	                  /* Use plain guint type for changes argument. This avoids
ab7d06
+	                   * glib/ffi bug https://bugzilla.redhat.com/show_bug.cgi?id=1260577 */
ab7d06
+	                  /* NM_TYPE_CONFIG_CHANGE_FLAGS, */
ab7d06
+	                  G_TYPE_UINT,
ab7d06
+	                  NM_TYPE_CONFIG_DATA);
ab7d06
+
ab7d06
+	G_STATIC_ASSERT_EXPR (sizeof (guint) == sizeof (NMConfigChangeFlags));
ab7d06
+	G_STATIC_ASSERT_EXPR (((gint64) ((NMConfigChangeFlags) -1)) > ((gint64) 0));
ab7d06
 }
ab7d06
 
ab7d06
 static void
ab7d06
diff --git a/src/tests/config/test-config.c b/src/tests/config/test-config.c
ab7d06
index a5975c1..b973e60 100644
ab7d06
--- a/src/tests/config/test-config.c
ab7d06
+++ b/src/tests/config/test-config.c
ab7d06
@@ -458,7 +458,10 @@ test_config_signal (void)
ab7d06
 	nm_config_reload (config, SIGHUP);
ab7d06
 
ab7d06
 
ab7d06
-	/* test with subscribing two signals... */
ab7d06
+	/* test with subscribing two signals...
ab7d06
+	 *
ab7d06
+	 * This test exposes glib bug https://bugzilla.redhat.com/show_bug.cgi?id=1260577
ab7d06
+	 * for which we however have a workaround in 'nm-config.c' */
ab7d06
 	g_signal_connect (G_OBJECT (config),
ab7d06
 	                  NM_CONFIG_SIGNAL_CONFIG_CHANGED,
ab7d06
 	                  G_CALLBACK (_test_signal_config_changed_cb2),
ab7d06
-- 
ab7d06
2.4.3
ab7d06
ab7d06
ab7d06
From 8bb4c36cdc6033a2216fbe3e8fbac23c9b3bc5f6 Mon Sep 17 00:00:00 2001
ab7d06
From: Thomas Haller <thaller@redhat.com>
ab7d06
Date: Wed, 9 Sep 2015 12:22:16 +0200
ab7d06
Subject: [PATCH 3/3] platform/test: add test for invoking platform signals
ab7d06
ab7d06
There seems to be an issue with glib/ffi that causes failures
ab7d06
to pass enum-typed arguments to signals (related bug rh#1260577).
ab7d06
ab7d06
Add a test for platform signals which, beside NM_CONFIG_SIGNAL_CONFIG_CHANGED,
ab7d06
is the only place where we use enum-typed arguments for signals.
ab7d06
ab7d06
Strangely, this test doesn't cause the failure, so it's unclear why
ab7d06
the workaround was necessary for "config-changed" signal (commit
ab7d06
e7d66f1df61ebdc7652ba34a4e1baddcc86b9e26).
ab7d06
ab7d06
(cherry picked from commit 52cd5ee6120b643aa143cbd439f81a0c02c8313e)
ab7d06
(cherry picked from commit d7970c58eb10e9d59c855d61017299a1a811ee2a)
ab7d06
---
ab7d06
 src/platform/tests/test-link.c | 47 ++++++++++++++++++++++++++++++++++++++++++
ab7d06
 1 file changed, 47 insertions(+)
ab7d06
ab7d06
diff --git a/src/platform/tests/test-link.c b/src/platform/tests/test-link.c
ab7d06
index ce371b7..f9645d8 100644
ab7d06
--- a/src/platform/tests/test-link.c
ab7d06
+++ b/src/platform/tests/test-link.c
ab7d06
@@ -118,6 +118,41 @@ software_add (NMLinkType link_type, const char *name)
ab7d06
 }
ab7d06
 
ab7d06
 static void
ab7d06
+test_link_changed_signal_cb (NMPlatform *platform,
ab7d06
+                             NMPObjectType obj_type,
ab7d06
+                             int ifindex,
ab7d06
+                             const NMPlatformIP4Route *route,
ab7d06
+                             NMPlatformSignalChangeType change_type,
ab7d06
+                             NMPlatformReason reason,
ab7d06
+                             gboolean *p_test_link_changed_signal_arg)
ab7d06
+{
ab7d06
+	/* test invocation of platform signals with multiple listeners
ab7d06
+	 * connected to the signal. Platform signals have enum-typed
ab7d06
+	 * arguments and there seem to be an issue with invoking such
ab7d06
+	 * signals on s390x and ppc64 archs.
ab7d06
+	 * https://bugzilla.redhat.com/show_bug.cgi?id=1260577
ab7d06
+	 *
ab7d06
+	 * As the test shows, the failure is not reproducible for
ab7d06
+	 * platform signals.
ab7d06
+	 */
ab7d06
+	g_assert (NM_IS_PLATFORM (platform));
ab7d06
+	g_assert (platform == NM_PLATFORM_GET);
ab7d06
+
ab7d06
+	g_assert (ifindex > 0);
ab7d06
+	g_assert (route);
ab7d06
+
ab7d06
+	g_assert_cmpint (obj_type, ==, NMP_OBJECT_TYPE_LINK);
ab7d06
+
ab7d06
+	g_assert_cmpint ((gint64) change_type, !=, (gint64) 0);
ab7d06
+	g_assert_cmpint (change_type, !=, NM_PLATFORM_SIGNAL_NONE);
ab7d06
+
ab7d06
+	g_assert_cmpint ((gint64) reason, !=, (gint64) 0);
ab7d06
+	g_assert_cmpint (reason, !=, NM_PLATFORM_REASON_NONE);
ab7d06
+
ab7d06
+	*p_test_link_changed_signal_arg = TRUE;
ab7d06
+}
ab7d06
+
ab7d06
+static void
ab7d06
 test_slave (int master, int type, SignalData *master_changed)
ab7d06
 {
ab7d06
 	int ifindex;
ab7d06
@@ -125,6 +160,8 @@ test_slave (int master, int type, SignalData *master_changed)
ab7d06
 	SignalData *link_changed, *link_removed;
ab7d06
 	char *value;
ab7d06
 	NMLinkType link_type = nm_platform_link_get_type (NM_PLATFORM_GET, master);
ab7d06
+	gboolean test_link_changed_signal_arg1;
ab7d06
+	gboolean test_link_changed_signal_arg2;
ab7d06
 
ab7d06
 	g_assert (NM_IN_SET (link_type, NM_LINK_TYPE_TEAM, NM_LINK_TYPE_BOND, NM_LINK_TYPE_BRIDGE));
ab7d06
 
ab7d06
@@ -158,11 +195,21 @@ test_slave (int master, int type, SignalData *master_changed)
ab7d06
 	else
ab7d06
 		g_assert (!nm_platform_link_is_up (NM_PLATFORM_GET, ifindex));
ab7d06
 
ab7d06
+	test_link_changed_signal_arg1 = FALSE;
ab7d06
+	test_link_changed_signal_arg2 = FALSE;
ab7d06
+	g_signal_connect (NM_PLATFORM_GET, NM_PLATFORM_SIGNAL_LINK_CHANGED, G_CALLBACK (test_link_changed_signal_cb), &test_link_changed_signal_arg1);
ab7d06
+	g_signal_connect (NM_PLATFORM_GET, NM_PLATFORM_SIGNAL_LINK_CHANGED, G_CALLBACK (test_link_changed_signal_cb), &test_link_changed_signal_arg2);
ab7d06
+
ab7d06
 	/* Set master up */
ab7d06
 	g_assert (nm_platform_link_set_up (NM_PLATFORM_GET, master, NULL));
ab7d06
 	g_assert (nm_platform_link_is_up (NM_PLATFORM_GET, master));
ab7d06
 	accept_signals (master_changed, 1, 2);
ab7d06
 
ab7d06
+	g_signal_handlers_disconnect_by_func (NM_PLATFORM_GET, G_CALLBACK (test_link_changed_signal_cb), &test_link_changed_signal_arg1);
ab7d06
+	g_signal_handlers_disconnect_by_func (NM_PLATFORM_GET, G_CALLBACK (test_link_changed_signal_cb), &test_link_changed_signal_arg2);
ab7d06
+	g_assert (test_link_changed_signal_arg1);
ab7d06
+	g_assert (test_link_changed_signal_arg2);
ab7d06
+
ab7d06
 	/* Master with a disconnected slave is disconnected
ab7d06
 	 *
ab7d06
 	 * For some reason, bonding and teaming slaves are automatically set up. We
ab7d06
-- 
ab7d06
2.4.3
ab7d06