[libvirt] [PATCH 1/2] networkUpdateState: Create virMacMap module more frequently

Laine Stump laine at laine.org
Tue Mar 28 00:22:15 UTC 2017


On 03/22/2017 10:43 AM, Michal Privoznik wrote:
> The virMacMap module is there for dumping [domain, <list of is
> MACs>] pairs into a file so that libvirt_guest NSS module can use
> it. Whenever a interface is allocated from network (e.g. on
> domani startup or NIC hotplug), network is notified and so is

s/domani/domain/

> virMacMap module subsequently. The module update functions
> networkMacMgrAdd() and networkMacMgrDel() handle the case when
> there's no module gracefully.

"gracefully handle the case when there's no module"


> Problem is, the module is created

The problem is...

> if and only if network is freshly started, or if daemon restarts

*the* daemon

> and network previously had the module.
> 
> This is not very user friendly - if users want to use the NSS
> module they need to destroy their network and bring it up again
> (and subsequently all the domains using it).

(note that it's no longer quite as bad - as of a few days ago, if you
restart a network, restarting libvirtd will reconnect all guests that
were previously connected to that network. Still not nice of course...)
> 
> One disadvantage of this approach implemented here is that one
> may get just partial results: any already running network does
> not record mac maps, thus only newly plugged domains will be
> stored in the module. The network restart scenario is not touched
> by this of course. But one can argue that older libvirts had
> never recorded the mac maps anyway.

It's unclear above where you're talking about the way the code was, and
the way it is after this patch...

> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/network/bridge_driver.c | 21 +++++++++------------
>  1 file changed, 9 insertions(+), 12 deletions(-)
> 
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index a753cd78b..0ea8e2348 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -470,6 +470,7 @@ networkUpdateState(virNetworkObjPtr obj,
>  {
>      virNetworkDriverStatePtr driver = opaque;
>      dnsmasqCapsPtr dnsmasq_caps = networkGetDnsmasqCaps(driver);
> +    char *macMapFile = NULL;
>      int ret = -1;
>  
>      virObjectLock(obj);
> @@ -486,6 +487,13 @@ networkUpdateState(virNetworkObjPtr obj,
>          /* If bridge doesn't exist, then mark it inactive */
>          if (!(obj->def->bridge && virNetDevExists(obj->def->bridge) == 1))
>              obj->active = 0;
> +
> +        if (!(macMapFile = networkMacMgrFileName(driver, obj->def->bridge)))
> +            goto cleanup;
> +
> +        if (!(obj->macmap = virMacMapNew(macMapFile)))
> +            goto cleanup;
> +
>          break;


... but from what I can understand, the only differences are:

1) the macMapFile used to be regenerated right after reading the
radvdpidfile (which in most cases doesn't exist because I think most of
the time that same duty is handled by dnsmasq instead), and now it is
regenerated *just before* reading radvdpidfile.

2) it used to be regenerated for any network with a def->bridge (so it
would also happen for "unmanaged" bridge networks, where libvirt just
points to an already-existing bridge), and it is now regenerated only
for networks where libvirt creates and destroys the bridge (and might
have a dnsmasq instance running.


So I'm confused - I must be missing something obvious. Can you explain a
bit more?

>  
>      case VIR_NETWORK_FORWARD_BRIDGE:
> @@ -512,7 +520,6 @@ networkUpdateState(virNetworkObjPtr obj,
>      /* Try and read dnsmasq/radvd pids of active networks */
>      if (obj->active && obj->def->ips && (obj->def->nips > 0)) {
>          char *radvdpidbase;
> -        char *macMapFile;
>  
>          ignore_value(virPidFileReadIfAlive(driver->pidDir,
>                                             obj->def->name,
> @@ -527,23 +534,13 @@ networkUpdateState(virNetworkObjPtr obj,
>                                             radvdpidbase,
>                                             &obj->radvdPid, RADVD));
>          VIR_FREE(radvdpidbase);
> -
> -        if (!(macMapFile = networkMacMgrFileName(driver, obj->def->bridge)))
> -            goto cleanup;
> -
> -        if (virFileExists(macMapFile) &&
> -            !(obj->macmap = virMacMapNew(macMapFile))) {
> -            VIR_FREE(macMapFile);
> -            goto cleanup;
> -        }
> -
> -        VIR_FREE(macMapFile);
>      }
>  
>      ret = 0;
>   cleanup:
>      virObjectUnlock(obj);
>      virObjectUnref(dnsmasq_caps);
> +    VIR_FREE(macMapFile);
>      return ret;
>  }
>  
> 




More information about the libvir-list mailing list