[libvirt] [PATCH v4] Add macro for handling exponential backoff loops.

Daniel P. Berrange berrange at redhat.com
Fri Apr 15 09:00:16 UTC 2016


On Fri, Apr 15, 2016 at 10:48:30AM +0200, Jiri Denemark wrote:
> On Fri, Apr 15, 2016 at 09:38:42 +0100, Richard W.M. Jones wrote:
> > In a few places in libvirt we busy-wait for events, for example qemu
> > creating a monitor socket.  This is problematic because:
> > 
> >  - We need to choose a sufficiently small polling period so that
> >    libvirt doesn't add unnecessary delays.
> > 
> >  - We need to choose a sufficiently large polling period so that
> >    the effect of busy-waiting doesn't affect the system.
> > 
> > The solution to this conflict is to use an exponential backoff.
> > 
> > This patch adds a macro VIR_TIME_WHILE_WITH_BACKOFF to hide the
> > details, and modifies a few places where we currently busy-wait.
> > ---
> >  src/fdstream.c           | 10 +++++----
> >  src/libvirt_private.syms |  2 ++
> >  src/qemu/qemu_agent.c    |  9 ++++----
> >  src/qemu/qemu_monitor.c  | 10 +++++----
> >  src/util/virtime.c       | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  src/util/virtime.h       | 34 ++++++++++++++++++++++++++++++
> >  6 files changed, 107 insertions(+), 12 deletions(-)
> > 
> > diff --git a/src/fdstream.c b/src/fdstream.c
> > index ef118b5..d9646d0 100644
> > --- a/src/fdstream.c
> > +++ b/src/fdstream.c
> > @@ -42,6 +42,7 @@
> >  #include "virfile.h"
> >  #include "configmake.h"
> >  #include "virstring.h"
> > +#include "virtime.h"
> >  
> >  #define VIR_FROM_THIS VIR_FROM_STREAMS
> >  
> > @@ -520,8 +521,7 @@ int virFDStreamConnectUNIX(virStreamPtr st,
> >                             bool abstract)
> >  {
> >      struct sockaddr_un sa;
> > -    size_t i = 0;
> > -    int timeout = 3;
> > +    virTimeBackOffVar timeout;
> >      int ret;
> >  
> >      int fd = socket(AF_UNIX, SOCK_STREAM, 0);
> > @@ -541,7 +541,9 @@ int virFDStreamConnectUNIX(virStreamPtr st,
> >              goto error;
> >      }
> >  
> > -    do {
> > +    if (virTimeBackOffStart(&timeout, 1, 3*1000 /* ms */) < 0)
> > +        goto error;
> > +    VIR_TIME_WHILE_WITH_BACKOFF(timeout) {
> 
> Uff, I don't think we should go this route. Open coding the ugly macro
> makes the code nicer and easier to read and understand:
> 
>     if (virTimeBackOffStart(&timeout, 1, 3*1000) < 0)
>         goto error;
>     while (virTimeBackOffCondition(&timeout)) {
>         ...
>     }

I agree, I really don't like control loops being hidden away behind
macros as it obscures what is going on IMHO.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list