ovs: ignore failures of patch interfaces

When there are two patch ports connected, each of them must reference
the other; however they can't be created in a single transaction
because they are part of different bridges (so, different
connections). Therefore, the first patch that gets activated will
always fail with "No usable peer $x exists in 'system' datapath" until
the second patch exists.

In theory we could also match the error message, however this doesn't
seem very robust as the message may slightly change in the future.

(cherry picked from commit ffeac35f04)
(cherry picked from commit 75cbf21738)
(cherry picked from commit 399aad15bf)
This commit is contained in:
Beniamino Galvani 2020-06-09 10:44:01 +02:00 committed by Thomas Haller
parent 166ad887f9
commit 692689ead8
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728

View file

@ -155,15 +155,40 @@ ovsdb_interface_failed (NMOvsdb *ovsdb,
{
NMDevice *device = NULL;
NMSettingsConnection *connection = NULL;
_LOGI (name, connection_uuid, "ovs interface \"%s\" (%s) failed: %s", name, connection_uuid, error);
NMConnection *c;
const char *type;
NMSettingOvsInterface *s_ovs_int;
gboolean is_patch = FALSE;
gboolean ignore;
device = nm_manager_get_device (nm_manager_get (), name, NM_DEVICE_TYPE_OVS_INTERFACE);
if (!device)
return;
if (device && connection_uuid) {
connection = nm_settings_get_connection_by_uuid (nm_device_get_settings (device),
connection_uuid);
}
if (connection_uuid)
connection = nm_settings_get_connection_by_uuid (nm_device_get_settings (device), connection_uuid);
/* The patch interface which gets created first is expected to
* fail because the second patch doesn't exist yet. Ignore all
* failures of patch interfaces. */
if ( connection
&& (c = nm_settings_connection_get_connection (connection))
&& (type = nm_connection_get_connection_type (c))
&& nm_streq0 (type, NM_SETTING_OVS_INTERFACE_SETTING_NAME)
&& (s_ovs_int = nm_connection_get_setting_ovs_interface (c))
&& nm_streq0 (nm_setting_ovs_interface_get_interface_type (s_ovs_int), "patch"))
is_patch = TRUE;
ignore = !device || is_patch;
_NMLOG (ignore ? LOGL_DEBUG : LOGL_INFO,
name, connection_uuid,
"ovs interface \"%s\" (%s) failed%s: %s",
name, connection_uuid,
ignore ? " (ignored)" : "",
error);
if (ignore)
return;
if (connection) {
nm_settings_connection_autoconnect_blocked_reason_set (connection,