[libvirt] PATCH: Thread-safe error reporting public API

Daniel Veillard veillard at redhat.com
Fri Dec 12 12:31:24 UTC 2008


On Fri, Dec 12, 2008 at 10:51:33AM +0000, Daniel P. Berrange wrote:
> On Fri, Dec 12, 2008 at 09:46:14AM +0100, Daniel Veillard wrote:
> > On Thu, Dec 11, 2008 at 08:16:36PM +0000, Daniel P. Berrange wrote:
> > > The current public API for error reporting consists of 
> > > 
> > >  - A global error object
> > >  - A per-connection error object
> > > 
> > > Some functions always set errors on the global object. Other functions
> > > always set errors on the per-connection object, except when they set 
> > > errors on the global object. Both have built-in race conditions if they
> > > are accessed from multiple threads because of the time between the API
> > > call raising the error, and the caller querying it.
> > > 
> > > The solution to this is to do away with all of the existing error objects
> > > and replace them with a per-thread error object. Well, except we can't
> > > do away with existing objects because of ABI compatability. This turns
> > > out to not be such a bad problem after all....
> > > 
> > > So with this patch...
> > > 
> > > 
> > > virterror.c gets ability to track a per-thread virErrorPtr instance. This
> > > object is stored in a thread local variable via pthread_{get,set}specific.
> > > It is allocated when first required, and deleted when the thread exits
> > > 
> > > Every single API will *always* set the  virErrorPtr object associated with
> > > its current thread.
> > > 
> > > In the public virterror.h we add
> > > 
> > >   virErrorPtr             virThreadGetLastError (void);
> > >   int                     virThreadCopyLastError (virErrorPtr to);
> > >   void                    virThreadResetLastError (void);
> > > 
> > > This provides a guarenteed thread-safe public API for fetching error
> > > information. All the other existing APIs have docs updated to recommend
> > > against their use.
> > 
> >   I understand the problem but I don't understand the way you expect to
> > fix it. Historically this copies the libxml2 error APIs, but in libxml2
> > the error data are stored in thread safe local storage. Until now
> > basically libvirt could not be used in a threaded way or at least not
> > without lot of constraints. Now we are getting thread safe, I suggest to
> > just retrofit thread safety into the exiting API, since they have the
> > exact same signature I see no reason to annoy the application writer
> > with extra API and deprecated ones.
> >   If the application is single threaded nothing changes for them in
> >   practice.
> >   If the application is multi-threaded the old behaviour wasn't making
> >   sense, could not be trusted and the new code does basically "the
> >   right thing" now.
> 
> 
> Yes, I guess that does atually make sense.
> 
> So I'll make the global virGetLastError() thread-safe, and then there's
> no need for the new APIs, and also no need for anyone to call the
> virConnGetLastError(), though I'll make sure that still syncs to 
> whatever error is stored in the global location anyway.

  okay, cool !

> >   I guess saying "from 0.6.0 the API becomes thread-safe and as a result
> > the error data become thread specific" sounds just fine to me, and that
> > probably works better for most applications (and bindings).
> 
> Sounds like a good plan.

  I guess there won't be any 0.5.2 and we will jump to 0.6.0 directly,
I would expect a release toward the end of the month, I see the
ChangeLog growing dangerously fast ...

> With this error stuff done and the other patches I've posted this week
> all the major thread-safety problems are addressed. Its now a case of
> tracking down all the loose-ends / minor faults. The Xen driver will
> be easy enough todo - its mostly stateless apart from the async events
> which is easy . Then there's the strerror_r() stuff and other related
> _r() functions. And whatever other edge-cases i discover.

  As long as we can keep the existing APIs and clean everything up
behind the scene, I guess we can consider ourselves lucky !

   thanks !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list