libvir-list-bounces@redhat.com wrote on 08/13/2010 10:44:51 AM:

> Please respond to "Daniel P. Berrange"

>
> On Thu, Aug 12, 2010 at 02:18:26PM -0400, Stefan Berger wrote:
> > Index: libvirt-acl/src/nwfilter/nwfilter_driver.c
> > ===================================================================
> > --- libvirt-acl.orig/src/nwfilter/nwfilter_driver.c
> > +++ libvirt-acl/src/nwfilter/nwfilter_driver.c
> > @@ -143,15 +143,25 @@ conf_init_err:
> >   */
> >  static int
> >  nwfilterDriverReload(void) {
> > +    virConnectPtr conn;
> >      if (!driverState) {
> >          return -1;
> >      }
> >
> > -    nwfilterDriverLock(driverState);
> > -    virNWFilterPoolLoadAllConfigs(NULL,
> > - &driverState->pools,
> > -                                  driverState->configDir);
> > -    nwfilterDriverUnlock(driverState);
> > +    conn = virConnectOpen("qemu:///system");
> > +
> > +    if (conn) {
> > +        /* shut down all threads -- qemud for example will restart them */
> > +        virNWFilterLearnThreadsTerminate();
> > +
> > +        nwfilterDriverLock(driverState);
> > +        virNWFilterPoolLoadAllConfigs(conn,
> > + &driverState->pools,
> > +                                      driverState->configDir);
> > +        nwfilterDriverUnlock(driverState);
> > +
> > +        virConnectClose(conn);
> > +    }
> >
> >      return 0;
>
> There's a small indentation issue here


Oh, will fix it.

>
>
> >  }
> > Index: libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c
> > ===================================================================
> > --- libvirt-acl.orig/src/nwfilter/nwfilter_learnipaddr.c
> > +++ libvirt-acl/src/nwfilter/nwfilter_learnipaddr.c
> > @@ -855,6 +855,16 @@ virNWFilterLearnInit(void) {
> >  }
> >
> >
> > +void
> > +virNWFilterLearnThreadsTerminate() {
> > +    threadsTerminate = true;
> > +
> > +    while (virHashSize(pendingLearnReq) != 0)
> > +        usleep((PKT_TIMEOUT_MS * 1000) / 3);
> > +
> > +    threadsTerminate = false;
> > +}
>
> Is there any risk of thread's failing to terminate, requiring
> us to kill them, or ignore them instead of blocking forever ?


A thread may just have been created with pthread_create() but hasn't run yet to see that threadTerminate is 'true' -> in that case the virHashSize() would count the thread until the thread itself has deregistered itself from the pendingLearnReq list. So that case should be ok.

Assume a thread is just about to be created (due to a VM start for example) and registered with the call to rc = virNWFilterRegisterLearnReq(req) preceding the pthread_create(), in that case a 'threadsTerminate = false' would allow that thread to run then. So I guess the 'threadsTerminate = false' is wrong in that case and would prevent the thread from terminating. The challenge is to do this correctly for reloading of the driver and at the same time for shutting down. If I take out the 'threadsTerminate = false', all threads and those about to be born should terminate, which does it correctly for the libvirtd termination case. But in case of reload where I would want new threads to run again I should probably introduce a boolean parameter indicating into what state the threadsTerminate variable should go once this above function terminates.

What that I would do the following changes:

void
virNWFilterLearnThreadsTerminate(bool allowNewThreads) {
   threadsTerminate = true;

   while (virHashSize(pendingLearnReq) != 0)
       usleep((PKT_TIMEOUT_MS * 1000) / 3);

   if (allowNewThreads)

        threadsTerminate = false;
}


Above call (with the indentation error) would then look like this:

[...]
    if (conn) {
       /* shut down all threads -- qemud for example will restart them */
       virNWFilterLearnThreadsTerminate(true);

        nwfilterDriverLock(driverState);
       virNWFilterPoolLoadAllConfigs(conn,

                                      &driverState->pools,
                                     driverState->configDir);
       nwfilterDriverUnlock(driverState);

       virConnectClose(conn);
   }
[...]


Does this sound right?

   Stefan

>
> Daniel
> --
> |: Red Hat, Engineering, London    -o-  
http://people.redhat.com/berrange/:|
> |:
http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org:|
> |:
http://autobuild.org        -o-         http://search.cpan.org/~danberr/:|
> |: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
>
> --
> libvir-list mailing list
> libvir-list@redhat.com
>
https://www.redhat.com/mailman/listinfo/libvir-list