mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-09 09:14:57 +00:00
qemu: Ignore nwfilter binding instantiation issues during reconnect
https://bugzilla.redhat.com/show_bug.cgi?id=1607202 It's essentially stated in the nwfilterBindingDelete that we will allow the admin to shoot themselves in the foot by deleting the nwfilter binding which then allows them to undefine the nwfilter that is in use for the running guest... However, by allowing this we cause a problem for libvirtd restart reconnect processing which would then try to recreate the missing binding attempting to use the deleted filter resulting in an error and thus shutting the guest down. So rather than keep adding virDomainConfNWFilterInstantiate flags to "ignore" specific error conditions, modify the logic to ignore, but VIR_WARN errors other than ignoreExists. This will at least allow the guest to not shutdown for only nwfilter binding errors that we can now perhaps recover from since we have the binding create/delete capability. Signed-off-by: John Ferlan <jferlan@redhat.com> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
5165ff0971
commit
9e52c64966
@ -3167,20 +3167,29 @@ qemuProcessNotifyNets(virDomainDefPtr def)
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
qemuProcessFiltersInstantiate(virDomainDefPtr def, bool ignoreExists)
|
||||
/* Attempt to instantiate the filters. Ignore failures because it's
|
||||
* possible that someone deleted a filter binding and the associated
|
||||
* filter while the guest was running and we don't want that action
|
||||
* to cause failure to keep the guest running during the reconnection
|
||||
* processing. Nor do we necessarily want other failures to do the
|
||||
* same. We'll just log the error conditions other than of course
|
||||
* ignoreExists possibility (e.g. the true flag) */
|
||||
static void
|
||||
qemuProcessFiltersInstantiate(virDomainDefPtr def)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < def->nnets; i++) {
|
||||
virDomainNetDefPtr net = def->nets[i];
|
||||
if ((net->filter) && (net->ifname)) {
|
||||
if (virDomainConfNWFilterInstantiate(def->name, def->uuid, net, ignoreExists) < 0)
|
||||
return 1;
|
||||
if (virDomainConfNWFilterInstantiate(def->name, def->uuid, net,
|
||||
true) < 0) {
|
||||
VIR_WARN("filter '%s' instantiation for '%s' failed '%s'",
|
||||
net->filter, net->ifname, virGetLastErrorMessage());
|
||||
virResetLastError();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
@ -7893,8 +7902,7 @@ qemuProcessReconnect(void *opaque)
|
||||
|
||||
qemuProcessNotifyNets(obj->def);
|
||||
|
||||
if (qemuProcessFiltersInstantiate(obj->def, true))
|
||||
goto error;
|
||||
qemuProcessFiltersInstantiate(obj->def);
|
||||
|
||||
if (qemuProcessRefreshDisks(driver, obj, QEMU_ASYNC_JOB_NONE) < 0)
|
||||
goto error;
|
||||
|
Loading…
Reference in New Issue
Block a user