[PATCH 0/8] Do more cleaning up after network objects upon start

This was initially inspired by https://issues.redhat.com/browse/RHEL-50968 which does things behind our back. However, I have found some other things when digging into the aforemention bug. I rebased, changed, rebased, refactored, and rebased again this branch so many times there might be a bunch of weird stuff I forgot to remove before posting. I hope I did not miss any, but one can never be sure ;) Martin Kletzander (8): network: Do not update network ports for inactive networks network: Do not call virNetworkObjUnsetDefTransient on start cleanup network: Move port deletion into the shutdown function network: Don't check if network is active in networkShutdownNetwork network: Clean up after inactive objects during start network: Try to read dnsmasq PIDs for inactive networks too network: Separate cleanup from networkRemoveInactive network: Clean up after disappeared transient inactive networks src/network/bridge_driver.c | 62 ++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 12 deletions(-) -- 2.46.0

The semantic does not change since inside networkUpdatePort() (well, networkNotifyPort, for which the former is a wrapper) exits for inactive networks, but with an error we can easily avoid with this patch. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 915211d1b590..5b510a222cd2 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -489,7 +489,8 @@ networkUpdateState(virNetworkObj *obj, return -1; } - virNetworkObjPortForEach(obj, networkUpdatePort, obj); + if (virNetworkObjIsActive(obj)) + virNetworkObjPortForEach(obj, networkUpdatePort, obj); /* Try and read dnsmasq pids of active networks */ if (virNetworkObjIsActive(obj) && def->ips && (def->nips > 0)) { -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
The semantic does not change since inside networkUpdatePort() (well, networkNotifyPort, for which the former is a wrapper) exits for inactive networks, but with an error we can easily avoid with this patch.
(which normally wouldn't happen, *except* when a network's bridge device has disappeared causing us to mark the network inactive *during* networkUpdate state. Yep.)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
--- src/network/bridge_driver.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 915211d1b590..5b510a222cd2 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -489,7 +489,8 @@ networkUpdateState(virNetworkObj *obj, return -1; }
- virNetworkObjPortForEach(obj, networkUpdatePort, obj); + if (virNetworkObjIsActive(obj)) + virNetworkObjPortForEach(obj, networkUpdatePort, obj);
/* Try and read dnsmasq pids of active networks */ if (virNetworkObjIsActive(obj) && def->ips && (def->nips > 0)) {

The function networkShutdownNetwork already does that. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 5b510a222cd2..b16d524aa181 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2387,7 +2387,6 @@ networkStartNetwork(virNetworkDriverState *driver, virErrorPtr save_err; virErrorPreserveLast(&save_err); - virNetworkObjUnsetDefTransient(obj); networkShutdownNetwork(driver, obj); virErrorRestore(&save_err); } -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
The function networkShutdownNetwork already does that.
(Harmless, but redundant)(or am I missing something?)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
--- src/network/bridge_driver.c | 1 - 1 file changed, 1 deletion(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 5b510a222cd2..b16d524aa181 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2387,7 +2387,6 @@ networkStartNetwork(virNetworkDriverState *driver, virErrorPtr save_err;
virErrorPreserveLast(&save_err); - virNetworkObjUnsetDefTransient(obj); networkShutdownNetwork(driver, obj); virErrorRestore(&save_err); }

It will be more useful in there when calling from new places. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index b16d524aa181..d27a7e9b88c4 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2447,6 +2447,8 @@ networkShutdownNetwork(virNetworkDriverState *driver, return -1; } + virNetworkObjDeleteAllPorts(obj, cfg->stateDir); + /* now that we know it's stopped call the hook if present */ networkRunHook(obj, NULL, VIR_HOOK_NETWORK_OP_STOPPED, VIR_HOOK_SUBOP_END); @@ -3458,8 +3460,6 @@ networkDestroy(virNetworkPtr net) if ((ret = networkShutdownNetwork(driver, obj)) < 0) goto cleanup; - virNetworkObjDeleteAllPorts(obj, cfg->stateDir); - /* @def replaced in virNetworkObjUnsetDefTransient */ def = virNetworkObjGetDef(obj); -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
It will be more useful in there when calling from new places.
(and also the extra call to virNetworkObjDeleteAllPorts() that this creates in the error cleanup of networkStartNetwork() is harmless)
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
--- src/network/bridge_driver.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index b16d524aa181..d27a7e9b88c4 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2447,6 +2447,8 @@ networkShutdownNetwork(virNetworkDriverState *driver, return -1; }
+ virNetworkObjDeleteAllPorts(obj, cfg->stateDir); + /* now that we know it's stopped call the hook if present */ networkRunHook(obj, NULL, VIR_HOOK_NETWORK_OP_STOPPED, VIR_HOOK_SUBOP_END); @@ -3458,8 +3460,6 @@ networkDestroy(virNetworkPtr net) if ((ret = networkShutdownNetwork(driver, obj)) < 0) goto cleanup;
- virNetworkObjDeleteAllPorts(obj, cfg->stateDir); - /* @def replaced in virNetworkObjUnsetDefTransient */ def = virNetworkObjGetDef(obj);

It skips the cleanup from networkStartNetwork and the only other path already checks if the network is active or not. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index d27a7e9b88c4..e507dcd4c5c9 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2405,9 +2405,6 @@ networkShutdownNetwork(virNetworkDriverState *driver, VIR_INFO("Shutting down network '%s'", def->name); - if (!virNetworkObjIsActive(obj)) - return 0; - stateFile = virNetworkConfigFile(cfg->stateDir, def->name); if (!stateFile) return -1; -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
It skips the cleanup from networkStartNetwork and the only other path> already checks if the network is active or not.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
--- src/network/bridge_driver.c | 3 --- 1 file changed, 3 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index d27a7e9b88c4..e507dcd4c5c9 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2405,9 +2405,6 @@ networkShutdownNetwork(virNetworkDriverState *driver,
VIR_INFO("Shutting down network '%s'", def->name);
- if (!virNetworkObjIsActive(obj)) - return 0; - stateFile = virNetworkConfigFile(cfg->stateDir, def->name); if (!stateFile) return -1;

Once networkUpdateState() identifies a dead network it should clean up after it as well. Resolves: https://issues.redhat.com/browse/RHEL-50968 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index e507dcd4c5c9..ebdb39d0743b 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -510,6 +510,12 @@ networkUpdateState(virNetworkObj *obj, virNetworkObjSetDnsmasqPid(obj, dnsmasqPid); } + /* Clean up after networks which were active but we have found out they are + * actually down */ + if (!virNetworkObjIsActive(obj)) { + networkShutdownNetwork(driver, obj); + } + return 0; } -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
Once networkUpdateState() identifies a dead network it should clean up after it as well.
Resolves: https://issues.redhat.com/browse/RHEL-50968 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index e507dcd4c5c9..ebdb39d0743b 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -510,6 +510,12 @@ networkUpdateState(virNetworkObj *obj, virNetworkObjSetDnsmasqPid(obj, dnsmasqPid); }
+ /* Clean up after networks which were active but we have found out they are + * actually down */ + if (!virNetworkObjIsActive(obj)) { + networkShutdownNetwork(driver, obj); + } +
The good part of this is that it will properly/completely clean up the remnants of any network that has somehow failed (e.g. the bridge device gets deleted by someone else). The bad part is that it means we end up calling all of the cleanup stuff (e.g. birNetDevBandwidthClear(), deleting the bridge device) even for networks that *were* properly shutdown (and so shouldn't have any of that stuff done). Aside from taking extra time (especially if someone has dozen's of inactive networks), this could be problematic if, for example, someone has two virtual networks that they've hand-configured to use the same bridge device (but obey their own policy to never start both at the same time). I *think* calling networkShutdownNetwork on the inactive network then would end up deleting the bridge device that's in use by the active network. (Arguably it's not a good idea to have configs like that when you could just use different bridge names for each, but I can think of at least one esoteric situation where someone might want to do it). Maybe this could be solved by having 3 states instead of 2 - "active" (should be working), "inactive" (definitely confirmed down, all teardown completed), and "zombie" (something has gone wrong with the network, but it hasn't been completely destroyed yet). Then you would only go ahead with the Shutdown if the network was "active" or "zombie", but skip it if the network was "inactive". Or something like that.
return 0; }

Aha! Here's the message that I couldn't find! I accidentally sent it from my personal email address, and it showed up only in my personal inbox (and not in the libvirt folder). Anyway, as I said in the reply to 0/8 - completely disregard what I said here. Again, I have *no idea* what I thought I saw and how I misunderstood it so badly :-/ On 9/16/24 12:02 PM, Laine Stump wrote:
On 9/3/24 10:36 AM, Martin Kletzander wrote:
Once networkUpdateState() identifies a dead network it should clean up after it as well.
Resolves: https://issues.redhat.com/browse/RHEL-50968 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index e507dcd4c5c9..ebdb39d0743b 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -510,6 +510,12 @@ networkUpdateState(virNetworkObj *obj, virNetworkObjSetDnsmasqPid(obj, dnsmasqPid); } + /* Clean up after networks which were active but we have found out they are + * actually down */ + if (!virNetworkObjIsActive(obj)) { + networkShutdownNetwork(driver, obj); + } +
The good part of this is that it will properly/completely clean up the remnants of any network that has somehow failed (e.g. the bridge device gets deleted by someone else).
The bad part is that it means we end up calling all of the cleanup stuff (e.g. birNetDevBandwidthClear(), deleting the bridge device) even for networks that *were* properly shutdown (and so shouldn't have any of that stuff done). Aside from taking extra time (especially if someone has dozen's of inactive networks), this could be problematic if, for example, someone has two virtual networks that they've hand-configured to use the same bridge device (but obey their own policy to never start both at the same time). I *think* calling networkShutdownNetwork on the inactive network then would end up deleting the bridge device that's in use by the active network. (Arguably it's not a good idea to have configs like that when you could just use different bridge names for each, but I can think of at least one esoteric situation where someone might want to do it).
Maybe this could be solved by having 3 states instead of 2 - "active" (should be working), "inactive" (definitely confirmed down, all teardown completed), and "zombie" (something has gone wrong with the network, but it hasn't been completely destroyed yet). Then you would only go ahead with the Shutdown if the network was "active" or "zombie", but skip it if the network was "inactive". Or something like that.
return 0; }

Just in case one needs a clean up. Resolves: https://issues.redhat.com/browse/RHEL-50968 Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index ebdb39d0743b..3ef3444da241 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -492,8 +492,9 @@ networkUpdateState(virNetworkObj *obj, if (virNetworkObjIsActive(obj)) virNetworkObjPortForEach(obj, networkUpdatePort, obj); - /* Try and read dnsmasq pids of active networks */ - if (virNetworkObjIsActive(obj) && def->ips && (def->nips > 0)) { + /* Try and read dnsmasq pids of both active and inactive networks, just in + * case a network became inactive and we need to clean up. */ + if (def->ips && (def->nips > 0)) { const char *binpath = NULL; pid_t dnsmasqPid; -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
Just in case one needs a clean up.
Resolves: https://issues.redhat.com/browse/RHEL-50968 Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
--- src/network/bridge_driver.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index ebdb39d0743b..3ef3444da241 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -492,8 +492,9 @@ networkUpdateState(virNetworkObj *obj, if (virNetworkObjIsActive(obj)) virNetworkObjPortForEach(obj, networkUpdatePort, obj);
- /* Try and read dnsmasq pids of active networks */ - if (virNetworkObjIsActive(obj) && def->ips && (def->nips > 0)) { + /* Try and read dnsmasq pids of both active and inactive networks, just in + * case a network became inactive and we need to clean up. */ + if (def->ips && (def->nips > 0)) { const char *binpath = NULL; pid_t dnsmasqPid;

The new function (networkCleanupInactive) can be called from an iterator over the list of networks without the risk of deadlock. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 3ef3444da241..0e8057e24aed 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -325,10 +325,10 @@ networkDnsmasqConfigFileName(virNetworkDriverConfig *cfg, } -/* do needed cleanup steps and remove the network from the list */ +/* do needed cleanup steps */ static int -networkRemoveInactive(virNetworkDriverState *driver, - virNetworkObj *obj) +networkCleanupInactive(virNetworkDriverState *driver, + virNetworkObj *obj) { g_autoptr(virNetworkDriverConfig) cfg = virNetworkDriverGetConfig(driver); g_autofree char *leasefile = NULL; @@ -372,6 +372,18 @@ networkRemoveInactive(virNetworkDriverState *driver, /* remove status file */ unlink(statusfile); + return 0; +} + + +/* do needed cleanup steps and remove the network from the list */ +static int +networkRemoveInactive(virNetworkDriverState *driver, + virNetworkObj *obj) +{ + if (networkCleanupInactive(driver, obj) < 0) + return -1; + /* remove the network definition */ virNetworkObjRemoveInactive(driver->networks, obj); -- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
The new function (networkCleanupInactive) can be called from an iterator over the list of networks without the risk of deadlock.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: Laine Stump <laine@redhat.com>
--- src/network/bridge_driver.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 3ef3444da241..0e8057e24aed 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -325,10 +325,10 @@ networkDnsmasqConfigFileName(virNetworkDriverConfig *cfg, }
-/* do needed cleanup steps and remove the network from the list */ +/* do needed cleanup steps */ static int -networkRemoveInactive(virNetworkDriverState *driver, - virNetworkObj *obj) +networkCleanupInactive(virNetworkDriverState *driver, + virNetworkObj *obj) { g_autoptr(virNetworkDriverConfig) cfg = virNetworkDriverGetConfig(driver); g_autofree char *leasefile = NULL; @@ -372,6 +372,18 @@ networkRemoveInactive(virNetworkDriverState *driver, /* remove status file */ unlink(statusfile);
+ return 0; +} + + +/* do needed cleanup steps and remove the network from the list */ +static int +networkRemoveInactive(virNetworkDriverState *driver, + virNetworkObj *obj) +{ + if (networkCleanupInactive(driver, obj) < 0) + return -1; + /* remove the network definition */ virNetworkObjRemoveInactive(driver->networks, obj);

If a network disappeared the daemon should not only remove it from the list of networks, but also do a proper cleanup. Signed-off-by: Martin Kletzander <mkletzan@redhat.com> --- src/network/bridge_driver.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 0e8057e24aed..0ba62d986ff4 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -533,6 +533,23 @@ networkUpdateState(virNetworkObj *obj, } +static int +networkCleanupTransientInactive(virNetworkObj *obj, + void *opaque) +{ + virNetworkDriverState *driver = opaque; + + if (!virNetworkObjIsActive(obj) && + !virNetworkObjIsPersistent(obj)) { + /* We can only do a cleanup here so that this can be called from an + * iterator over the networks */ + networkCleanupInactive(driver, obj); + } + + return 0; +} + + static int networkAutostartConfig(virNetworkObj *obj, void *opaque) @@ -659,6 +676,11 @@ networkStateInitialize(bool privileged, virNetworkObjListForEach(network_driver->networks, networkUpdateState, network_driver); + /* Before removing inactive transient networks from the list make sure we + * clean up after them as well */ + virNetworkObjListForEach(network_driver->networks, + networkCleanupTransientInactive, + network_driver); virNetworkObjListPrune(network_driver->networks, VIR_CONNECT_LIST_NETWORKS_INACTIVE | VIR_CONNECT_LIST_NETWORKS_TRANSIENT); -- 2.46.0

Polite ping On Tue, Sep 03, 2024 at 04:36:19PM +0200, Martin Kletzander wrote:
This was initially inspired by https://issues.redhat.com/browse/RHEL-50968 which does things behind our back. However, I have found some other things when digging into the aforemention bug.
I rebased, changed, rebased, refactored, and rebased again this branch so many times there might be a bunch of weird stuff I forgot to remove before posting. I hope I did not miss any, but one can never be sure ;)
Martin Kletzander (8): network: Do not update network ports for inactive networks network: Do not call virNetworkObjUnsetDefTransient on start cleanup network: Move port deletion into the shutdown function network: Don't check if network is active in networkShutdownNetwork network: Clean up after inactive objects during start network: Try to read dnsmasq PIDs for inactive networks too network: Separate cleanup from networkRemoveInactive network: Clean up after disappeared transient inactive networks
src/network/bridge_driver.c | 62 ++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 12 deletions(-)
-- 2.46.0

On 9/3/24 10:36 AM, Martin Kletzander wrote:
This was initially inspired by https://issues.redhat.com/browse/RHEL-50968 which does things behind our back. However, I have found some other things when digging into the aforemention bug.
I rebased, changed, rebased, refactored, and rebased again this branch so many times there might be a bunch of weird stuff I forgot to remove before posting. I hope I did not miss any, but one can never be sure ;)
Everything looks fine to me (I've sent Reviewed-by: for most of the patches). I had responded to one of the patches (that fortunately has become lost - I don't see it anywhere on the list archives or in my email client) commenting about going through all the cleanup even for networks that were already legitimately and completely down, but now that I've applied all the patches I see that isn't what happens anyway! (I have no idea what I was thinking) Anyway Reviewed-by: Laine Stump <laine@redhat.com> for the entire series, and thanks for fixing a problem that has been popping up once every year or two for as long as I can remember :-)
Martin Kletzander (8): network: Do not update network ports for inactive networks network: Do not call virNetworkObjUnsetDefTransient on start cleanup network: Move port deletion into the shutdown function network: Don't check if network is active in networkShutdownNetwork network: Clean up after inactive objects during start network: Try to read dnsmasq PIDs for inactive networks too network: Separate cleanup from networkRemoveInactive network: Clean up after disappeared transient inactive networks
src/network/bridge_driver.c | 62 ++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 12 deletions(-)

On Mon, Sep 16, 2024 at 08:50:31PM -0400, Laine Stump wrote:
On 9/3/24 10:36 AM, Martin Kletzander wrote:
This was initially inspired by https://issues.redhat.com/browse/RHEL-50968 which does things behind our back. However, I have found some other things when digging into the aforemention bug.
I rebased, changed, rebased, refactored, and rebased again this branch so many times there might be a bunch of weird stuff I forgot to remove before posting. I hope I did not miss any, but one can never be sure ;)
Everything looks fine to me (I've sent Reviewed-by: for most of the patches). I had responded to one of the patches (that fortunately has become lost - I don't see it anywhere on the list archives or in my email client) commenting about going through all the cleanup even for networks that were already legitimately and completely down, but now that I've applied all the patches I see that isn't what happens anyway! (I have no idea what I was thinking)
I spent non-trivial amount of time trying to run this only on the networks for which we loaded the state file and not the config one, but kept running into more and more issues. I don't even remember all of them, but I think one of them was that during the clean-up we do not know whether it is a transient network or not and that changes the clean-up paths as well (e.g. removing the leases file etc.), so I went with the "clean everything" approach since it was partially pre-existing.
Anyway
Reviewed-by: Laine Stump <laine@redhat.com>
for the entire series, and thanks for fixing a problem that has been popping up once every year or two for as long as I can remember :-)
Really? Well, now I'm glad I spent so much time on that =D Thanks for the review and sorry for pushing you to do that ;)
Martin Kletzander (8): network: Do not update network ports for inactive networks network: Do not call virNetworkObjUnsetDefTransient on start cleanup network: Move port deletion into the shutdown function network: Don't check if network is active in networkShutdownNetwork network: Clean up after inactive objects during start network: Try to read dnsmasq PIDs for inactive networks too network: Separate cleanup from networkRemoveInactive network: Clean up after disappeared transient inactive networks
src/network/bridge_driver.c | 62 ++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 12 deletions(-)
participants (3)
-
Laine Stump
-
Laine Stump
-
Martin Kletzander