
On 10/10/24 7:48 AM, Martin Kletzander wrote:
On Tue, Oct 08, 2024 at 10:57:53AM -0400, Laine Stump wrote:
When the daemons were split out from the monolithic libvirtd, the network driver didn't implement "inhibit idle timeout if there are any active objects" as was done for other drivers, so virtnetworkd would always exit after 120 seconds of no incoming connections. This didn't every cause any visible problem, although it did mean that anytime a network API was called after an idle time > 120 seconds, that the restarting virtnetworkd would flush and reload all the iptables/nftables rules for any active networks.
This patch replicates what is done in the QEMU driver - an nactive is added to the network driver object, along with an inhibitCallback; the latter is passed into networkStateInitialize when the driver is loaded, and the former is incremented for each already-active network, then incremented/decremented each time a network is started or stopped. If nactive transitions from 0 to 1 or 1 to 0, inhibitCallback is called, and it "does the right stuff" to prevent/enable the idle timeout.
Signed-off-by: Laine Stump <laine@redhat.com> ---
I had made this patch as a part of a larger series that will require it, but haven't sent that yet and keep being annoyed when virtnetworkd exits out from under a gdb session, so I decided it has enough general usefulness to send by itself.
Keep in mind that it still needs to successfully survive the restart without changing anything even once this is merged.
You mean daemon restart? Yeah, nothing has been (or will be) done to break that, since we need to be able to force restarts during a software update.
src/network/bridge_driver.c | 20 +++++++++++++++++--- src/network/bridge_driver_conf.h | 9 ++++++++- 2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 74ba59b4e9..6a48516fdf 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -2500,6 +2510,10 @@ networkShutdownNetwork(virNetworkDriverState *driver, VIR_HOOK_SUBOP_END);
virNetworkObjSetActive(obj, false); + + if (!!g_atomic_int_dec_and_test(&driver->nactive) && driver-
inhibitCallback)
pointless "!!", you're not doing any arithmetic with it
Good point - that's what I get for blindly copying what was done in QEMU without thinking about it too much! (For those interested in the origin, I looked it up and it turns out that all other cases of "!!g_atomic_int_dec_and_test()" we added in a commit that mechanically eliminated invocations of this macro: #define virAtomicIntDecAndTest(i) (!!g_atomic_int_dec_and_test(i)) with its contents. This even led to several instances of: ignore_value(!!g_atomic_int_dec_and_test(...)); I'm removing my usage of !! before pushing, but not touching the others.)
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
Thanks!