
On 6/17/20 1:46 AM, Laine Stump wrote:
What do I think should be done? Good question. Possibly we could:
A) Call virNetDevTapReattachBridge() rather than virNetDevTapAttachBridge() in virNetDevTapCreateInBridgePort(). This would eliminate problem (2).
B) Instead of checking if the tap device MAC address matches, just call virNetDevExists() - if it exists, then skip the RemovePort() - this eliminates problems (3) and (4). (NB - this would fail if it turns out that tap device deletion isn't completed synchronously with qemu process termination!)
C) If we want to make it 100% sound, we need to make "check for interface existence + removeport" an atomic operation, and mutually exclusive with virNetDevTapCreate(). This would eliminate problem (1)
I still don't quite understand how there can be a race. I mean, from system POV, libvirt creates a TAP, plugs it into a bridge (when starting the first domain). And when shutting it down and starting the second domain in parallel a new TAP device (with different index and MAC) is created independent of the first TAP, no? Michal