[libvirt] PATCH: 8/25: Concurrent dispatch of RPC methods
Jim Meyering
jim at meyering.net
Tue Jan 20 14:21:51 UTC 2009
"Daniel P. Berrange" <berrange at redhat.com> wrote:
> On Fri, Jan 16, 2009 at 12:11:16PM +0000, Daniel P. Berrange wrote:
>> > > @@ -114,6 +164,11 @@ struct private_data {
>> > > virDomainEventQueuePtr domainEvents;
>> > > /* Timer for flushing domainEvents queue */
>> > > int eventFlushTimer;
>> > > +
>> > > + /* List of threads currently doing dispatch */
>> > > + int wakeupSend;
>> > > + int wakeupRead;
>> >
>> > How about appending "FD" to indicate these are file descriptors.
>> > The names combined with the comment (which must apply to waitDispatch)
>> > made me wonder what they represented. Only when I saw them used
>> > in safewrite /saferead calls did I get it.
>>
>> Yes, good idea - and its not really a list of threads either,
>> so the comment is a little misleading :-)
>
>> > > + /* Encode the length word. */
>> > > + xdrmem_create (&xdr, rv->buffer, 4, XDR_ENCODE);
>> > > + if (!xdr_int (&xdr, (int *)&rv->bufferLength)) {
>> > > + error (flags & REMOTE_CALL_IN_OPEN ? NULL : conn, VIR_ERR_RPC,
>> > > + _("xdr_int (length word)"));
>> >
>> > I haven't done enough xdr* work to know, and man pages
>> > didn't provide an immediate answer:
>> > Is there no need to call xdr_destroy on this error path?
>> > I'd expect xdrmem_create to do any allocation, not xdr_int.
>> > There are many like this.
>>
>> Yes, the 'error:' codepath should be calling 'xdr_destroy(&xdr)'
>> to ensure free'ing of memory.
>>
>> >
>> > > + goto error;
>> > > + }
>> > > + xdr_destroy (&xdr);
>> > > +
>> > > + return rv;
>> > > +
>> > > +error:
>> > > + VIR_FREE(ret);
>> > > + return NULL;
>> >
>> > The above should free rv, not ret:
>> >
>> > VIR_FREE(rv);
>
>
> Here is an update with those suggested renames & bug fixes in it.
>
> It also addresses the error reporting issue mentioned in
>
> http://www.redhat.com/archives/libvir-list/2009-January/msg00428.html
>
> That code should not have been using DEBUG() - it now correctly
> raises a real error including the error string, not just errno.
> There were two other bugs with missing error raising in the
> path for sasl_encode/decode.
>
> Everything upto this patch is committed, so this is diffed
> against current CVS.
All looks fine, but for a reverted change and some added strerror uses.
While merging with your earlier changes (I effectively reverted the old
8/25 on a new branch, replacing it with this one and then rebased the
remaining change sets), I got this conflict
<<<<<<< HEAD:src/remote_internal.c
if (pipe(wakeupFD) < 0) {
errorf (conn, VIR_ERR_SYSTEM_ERROR,
_("unable to make pipe %s"),
strerror(errno));
=======
if (pipe(wakeup) < 0) {
virReportSystemError(conn, errno, "%s",
_("unable to make pipe"));
>>>>>>> 03e5096... Remove use of strerror():src/remote_internal.c
that suggests that your new wakeupFD-using change reintroduces
a use of strerror that was previously removed.
But it's no big deal, since we're planning to clean up the
remaining strerror uses pretty soon.
More information about the libvir-list
mailing list