[libvirt] PATCH: 16/28: Thread safety for storage driver

Daniel P. Berrange berrange at redhat.com
Wed Dec 3 10:11:04 UTC 2008


On Wed, Dec 03, 2008 at 10:59:20AM +0100, Daniel Veillard wrote:
> On Sun, Nov 30, 2008 at 11:57:47PM +0000, Daniel P. Berrange wrote:
> > This patch makes the storage driver thread safe
> [...]
> >  static void
> >  storageDriverAutostart(virStorageDriverStatePtr driver) {
> 
>   Hum, there is something I find incherent, in the network
> side we don't lock the driver but we lock the individual
> objects in the autostart. Here we don't lock anything. In both
> case they are started at the end of the Startup method, which
> does lock the driver. So it seems in the network case we
> don't need to lock the individual objects unless I'm mistaken

That is a bug in this storage patch. We should be locking the
storage pools here, because someone could send us a SIGHUP
to do a reload while someone else is using a storage pool.

> 
> > @@ -172,11 +182,13 @@ storageDriverReload(void) {
> >      if (!driverState)
> >          return -1;
> >  
> > +    storageDriverLock(driverState);
> >      virStoragePoolLoadAllConfigs(NULL,
> >                                   &driverState->pools,
> >                                   driverState->configDir,
> >                                   driverState->autostartDir);
> >      storageDriverAutostart(driverState);
> > +    storageDriverUnlock(driverState);
> >  
> >      return 0;
> 
>   Hum there is something potentially nasty here:
>     - suppose you call reload
>     - you lock the main driver
>     - you don't lock any of the individual objects
>     - another thread is busy on a long standing operation in one of the
>       storage objects
>     - reload still goes in, virStoragePoolDefParse creates a brand new
>       object and virStoragePoolObjAssignDef frees the object used by the
>       other thread.

Yes that is precisely the scenario we need the locking in autostart
for. I'll fix this patch....

> I didn't find any locking in virStoragePoolObjAssignDef or
> virStoragePoolLoadAllConfigs. Maybe on reload operation it's safer to
> just lock the driver and all storage objects before reloading all configs
> and autostarting.

There's two scenarios in AssignDef

 - Updating config of an existing object. In this case
   virStoragePoolObjFindByName will already have locked it for
   us
 - Creating a new object - in this case we call virStoragePoolObjLock
   explicitly.

So, I believe AssignDef locking is OK here. LoadAllConfigs is also OK
because its use of objects all comes via AssignDef which returns a locked
object.

> [...]
> > @@ -393,6 +440,8 @@ storageListDefinedPools(virConnectPtr co
> >      return -1;
> >  }
> >  
> > +/* This method is required to be re-entrant / thread safe, so
> > +   uses no driver lock */
> 
>   Well virStorageBackendFindPoolSources prototype has no comment so it's
>   hard to guess...
> 
>   Okay, there is a couple issues I raise here, I'm not sure if it's
>   misunderstanding or genuine problems though...

genuine bugs !


Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list