[libvirt] [PATCH] Don't sleep in poll() if there is existing SASL decoded data
Daniel Veillard
veillard at redhat.com
Thu Feb 3 14:15:39 UTC 2011
On Tue, Feb 01, 2011 at 04:20:16PM +0000, Daniel P. Berrange wrote:
> On Tue, Feb 01, 2011 at 09:18:45AM -0700, Eric Blake wrote:
> > On 02/01/2011 09:09 AM, Daniel P. Berrange wrote:
> > > In the SASL codepath we typically read far more data off the
> > > wire than we immediately need. When using a connection from a
> > > single thread this isn't a problem, since only our reply will
> > > be pending (or an event we can handle directly). When using a
> > > connection from multiple threads though, we may read the data
> > > from replies from other threads. If those replies occur after
> > > our own reply, they'll not be processed. The other thread will
> > > then go into poll() and wait for its reply which has already
> > > been received and decoded. The solution is to set poll() timeout
> > > to 0 if there is pending SASL data.
> > >
> > > * src/remote/remote_driver.c: Don't sleep in poll() if SASL
> > > data exists
> > > ---
> > > src/remote/remote_driver.c | 16 +++++++++++++++-
> > > 1 files changed, 15 insertions(+), 1 deletions(-)
> >
> > ACK.
> >
> > Will your refactoring to make things use socket wrappers that do SASL
> > transparently under the hood be complete any time soon? But this patch
> > is good in the meantime.
>
> Yeah that code is pending soon...it shares this same flaw
> though and this is urgent to fix because it makes the
> client lockup.
ACtually that patch broke when compiling without SASL because
priv->saslDecoded is not defined in that case. I'm pushing a trivial
fix patch for this,
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/
-------------- next part --------------
commit 3028f51c383cc36ab4e87f2c87569d55de5672ff
Author: Daniel Veillard <veillard at redhat.com>
Date: Thu Feb 3 22:13:24 2011 +0800
Fix compilation when building without sasl
Use of saslDecoded field need to be guarded by #if HAVE_SASL/endif
* src/remote/remote_driver.c: fix remoteIOEventLoop accordingly
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 347b844..8bae697 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -10186,8 +10186,10 @@ remoteIOEventLoop(virConnectPtr conn,
* don't want to sleep in the poll(), just
* check if any other FDs are also ready
*/
+#if HAVE_SASL
if (priv->saslDecoded)
timeout = 0;
+#endif
fds[0].events = fds[0].revents = 0;
fds[1].events = fds[1].revents = 0;
@@ -10236,8 +10238,10 @@ remoteIOEventLoop(virConnectPtr conn,
/* If we have existing SASL decoded data, pretend
* the socket became readable so we consume it
*/
+#if HAVE_SASL
if (priv->saslDecoded)
fds[0].revents |= POLLIN;
+#endif
if (fds[1].revents) {
ssize_t s;
More information about the libvir-list
mailing list