[libvirt PATCH v3 1/7] tools: rewrite interactive job monitoring logic
Daniel P. Berrangé
berrange at redhat.com
Thu Feb 6 14:14:47 UTC 2020
On Thu, Feb 06, 2020 at 03:06:53PM +0100, Pavel Hrdina wrote:
> On Wed, Feb 05, 2020 at 05:18:52PM +0000, Daniel P. Berrangé wrote:
> > For long running jobs (save, managed save, dump & live migrate)
> > virsh runs a background thread for executing the job and then
> > has the main thread catch Ctrl-C for graceful shutdown, as well
> > as displaying progress info.
> >
> > The monitoring code is written using poll, with a pipe used
> > to get the completion status from the thread. Using a pipe
> > and poll is problematic for Windows portability. This rewrites
> > the code to use a GMainLoop instance for monitoring stdin and
> > doing progress updates. The use of a pipe is entirely eliminated,
> > instead there is just a shared variable between both threads
> > containing the job completion status.
> >
> > No mutex locking is used because the background thread writes
> > to the variable only when the main loop is still running,
> > while the foreground thread only reads it after the main loop
> > has exited.
> >
> > Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> > ---
> > tools/virsh-domain.c | 388 +++++++++++++++++++++++++------------------
> > tools/virsh.h | 3 +-
> > 2 files changed, 232 insertions(+), 159 deletions(-)
> >
> > diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> > index 781463f0e2..bf828c90c4 100644
> > --- a/tools/virsh-domain.c
> > +++ b/tools/virsh-domain.c
> > @@ -23,7 +23,6 @@
> > #include "virsh-util.h"
> >
> > #include <fcntl.h>
> > -#include <poll.h>
> > #include <signal.h>
> > #include <sys/time.h>
> >
> > @@ -4224,7 +4223,6 @@ doSave(void *opaque)
> > virshCtrlData *data = opaque;
> > vshControl *ctl = data->ctl;
> > const vshCmd *cmd = data->cmd;
> > - char ret = '1';
> > virDomainPtr dom = NULL;
> > const char *name = NULL;
> > const char *to = NULL;
> > @@ -4269,7 +4267,7 @@ doSave(void *opaque)
> > goto out;
> > }
> >
> > - ret = '0';
> > + data->ret = 0;
> >
> > out:
> > #ifndef WIN32
> > @@ -4278,18 +4276,126 @@ doSave(void *opaque)
> > #endif /* !WIN32 */
> > virshDomainFree(dom);
> > VIR_FREE(xml);
> > - ignore_value(safewrite(data->writefd, &ret, sizeof(ret)));
> > + g_main_loop_quit(data->eventLoop);
> > }
> >
> > typedef void (*jobWatchTimeoutFunc)(vshControl *ctl, virDomainPtr dom,
> > void *opaque);
> >
> > -static bool
> > +struct virshWatchData {
> > + vshControl *ctl;
> > + virDomainPtr dom;
> > + jobWatchTimeoutFunc timeout_func;
> > + void *opaque;
> > + const char *label;
> > + GIOChannel *stdin_ioc;
> > + bool jobStarted;
> > + bool verbose;
> > +};
> > +
> > +static gboolean
> > +virshWatchTimeout(gpointer opaque)
> > +{
> > + struct virshWatchData *data = opaque;
> > +
> > + /* suspend the domain when migration timeouts. */
> > + vshDebug(data->ctl, VSH_ERR_DEBUG, "watchJob: timeout\n");
> > + if (data->timeout_func)
> > + (data->timeout_func)(data->ctl, data->dom, data->opaque);
> > +
> > + return G_SOURCE_REMOVE;
> > +}
> > +
> > +
> > +static gboolean
> > +virshWatchProgress(gpointer opaque)
> > +{
> > + struct virshWatchData *data = opaque;
> > + virDomainJobInfo jobinfo;
> > +#ifndef WIN32
> > + sigset_t sigmask, oldsigmask;
> > + int ret;
>
> The `ret` variable needs to be declared outside of the #ifndef block
> becuase [1]
Oh, I already fixed that, which means it is probably squashed into
one of the later patches in this series :-(
>
> > +
> > + sigemptyset(&sigmask);
> > + sigaddset(&sigmask, SIGINT);
> > +
> > + vshDebug(data->ctl, VSH_ERR_DEBUG, "%s",
> > + "watchJob: progress update\n");
>
> This debug message should be outside of the block as well.
>
> > + pthread_sigmask(SIG_BLOCK, &sigmask, &oldsigmask);
> > +#endif /* !WIN32 */
> > + ret = virDomainGetJobInfo(data->dom, &jobinfo);
>
> [1] here it would fail for mingw builds.
>
> Otherwise looks good so with the issues fixed:
>
> Reviewed-by: Pavel Hrdina <phrdina at redhat.com>
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
More information about the libvir-list
mailing list