From: Wei Liu <wei.liu2@citrix.com>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Xen-devel <xen-devel@lists.xenproject.org>,
Wei Liu <wei.liu2@citrix.com>,
Ian Jackson <ian.jackson@eu.citrix.com>
Subject: Re: [XTF PATCH] xtf-runner: fix two synchronisation issues
Date: Fri, 29 Jul 2016 13:58:28 +0100 [thread overview]
Message-ID: <20160729125828.GB22419@citrix.com> (raw)
In-Reply-To: <e6462eca-d400-f229-801b-1727615a80aa@citrix.com>
On Fri, Jul 29, 2016 at 01:43:42PM +0100, Andrew Cooper wrote:
> On 29/07/16 13:07, Wei Liu wrote:
> > There were two synchronisation issues for the old code:
> >
> > 1. There was no guarantee that guest console was ready before "xl
> > console" invocation.
> > 2. There was no guarantee that runner wouldn't not exit before all test
s/not//
> > guests were gone.
>
> Sorry, but I can't parse this.
>
> The runner existing before xl has torn down the guest is very
> deliberate, because some part of hvm guests is terribly slow to tear
> down; waiting synchronously for teardown tripled the wallclock time to
> run a load of tests back-to-back.
>
Then you won't know if a guest is leaked or it is being slowly destroyed
when a dead guest shows up in the snapshot of 'xl list'.
Also consider that would make back-to-back tests that happen to have a
guest that has the same name as the one in previous test fail.
I don't think getting blocked for a few more seconds is a big issue.
It's is important to eliminate such race conditions so that osstest can
work properly.
> > @@ -132,24 +141,53 @@ def list_tests(args):
> >
> > print name
> >
> > +# A list of processes that we need to wait until they exits.
> > +wait_list = []
> >
> > def run_test(test):
> > """ Run a specific test """
> >
> > + console_path = '/local/domain/0/backend/console'
> > + # Setup watch for console
> > + cmd = ['xenstore-watch', console_path]
> > + print "Executing '%s'" % (" ".join(cmd), )
> > + xs_watch = Popen(cmd, stdout = PIPE, stderr = PIPE)
> > +
> > _, _, name = test.split('-', 2)
> >
> > cfg = path.join("tests", name, test + ".cfg")
> >
> > - cmd = ['xl', 'create', '-p', cfg]
> > + cmd = ['xl', 'create', '-Fp', cfg]
> >
> > print "Executing '%s'" % (" ".join(cmd), )
> > - rc = subproc_call(cmd)
> > - if rc:
> > - raise RunnerError("Failed to create VM")
> > + wait = Popen(cmd, stdout = DEVNULL, stderr = DEVNULL)
>
> I would name this "create" rather than "wait"
>
NP.
> > + wait_list.append(wait)
> > +
> > + # Wait up to 5 seconds for console to show up
> > + signal.alarm(5)
> > + while True:
> > + l = xs_watch.stdout.readline()
> > + domid = l[len(console_path)+1:].split('/')[0]
> > + if domid == '': continue
>
> Please put continues and breaks on newlines.
>
> if not domid:
> continue
Fixed.
>
> > +
> > + cmd = ['xenstore-read', '/local/domain/'+domid+'/name']
> > + print "Executing '%s'" % (" ".join(cmd), )
> > + gname = check_output(cmd).splitlines()[0]
> > + if gname != test: continue
> > +
> > + cmd = ['xenstore-read', '/local/domain/'+domid+'/console/tty']
> > + print "Executing '%s'" % (" ".join(cmd), )
> > + con = check_output(cmd).splitlines()[0]
> > + if con != '': break
>
> Somewhere in this loop, you should poll the call to xl create. In the
> case that there is an xl configuration error, this setup will wait for 5
> seconds, then discard all trace of the error.
>
Right. I will see what I can do here.
> > +
> > + # Tear down watch and timer
> > + signal.alarm(0)
> > + xs_watch.kill()
> >
> > cmd = ['xl', 'console', test]
> > print "Executing '%s'" % (" ".join(cmd), )
> > console = Popen(cmd, stdout = PIPE)
> > + wait_list.append(console)
> >
> > cmd = ['xl', 'unpause', test]
> > print "Executing '%s'" % (" ".join(cmd), )
> > @@ -327,12 +365,17 @@ def main():
> > opts, args = parser.parse_args()
> >
> > if opts.list_tests:
> > - return list_tests(args)
> > + ret = list_tests(args)
> > else:
> > - return run_tests(args)
> > + ret = run_tests(args)
> > +
> > + for child in wait_list: child.wait()
>
> On a newline please.
>
> You should use stdout=PIPE, stderr=STDOUT (to link stdout and stderr to
> the same fd) and .communicate() to get the results. In any case that a
> child exists non-zero, you mustn't discard the error. As a result, I
> don't think you need DEVNULL any more.
>
OK, this makes sense.
Wei.
> ~Andrew
>
> > +
> > + return ret
> >
> >
> > if __name__ == "__main__":
> > + signal.signal(signal.SIGALRM, sigalrm_handler)
> > try:
> > sys.exit(main())
> > except RunnerError, e:
>
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-07-29 12:58 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-29 12:07 [XTF PATCH] xtf-runner: fix two synchronisation issues Wei Liu
2016-07-29 12:43 ` Andrew Cooper
2016-07-29 12:58 ` Wei Liu [this message]
2016-07-29 13:06 ` Andrew Cooper
2016-07-29 13:12 ` Wei Liu
2016-07-29 13:23 ` Andrew Cooper
2016-07-29 13:26 ` Wei Liu
2016-07-29 14:31 ` Ian Jackson
2016-07-29 14:55 ` Wei Liu
2016-07-29 16:18 ` Ian Jackson
2016-07-29 16:35 ` Andrew Cooper
2016-07-29 16:41 ` Wei Liu
2016-07-29 15:05 ` Andrew Cooper
2016-08-01 13:16 ` [RFC PATCH 0/8] Fix console " Wei Liu
2016-08-01 13:16 ` [RFC PATCH 1/8] tools/console: fix help string in client Wei Liu
2016-08-05 15:40 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 2/8] tools/console: introduce --start-notify-fd option for console client Wei Liu
2016-08-05 15:43 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 3/8] libxl: factor out libxl__console_tty_path Wei Liu
2016-08-05 15:44 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 4/8] libxl: wait up to 5s in libxl_console_exec for xenconsoled Wei Liu
2016-08-05 15:48 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 5/8] libxl: libxl_{primary_, }console_exec now take notify_fd argument Wei Liu
2016-08-05 15:49 ` Ian Jackson
2016-08-05 15:50 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 6/8] docs: document xenconsole startup protocol Wei Liu
2016-08-05 15:52 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 7/8] xl: use " Wei Liu
2016-08-05 15:55 ` Ian Jackson
2016-08-01 13:16 ` [RFC PATCH 8/8] tools/console: remove 5s bodge in console client Wei Liu
2016-08-05 15:57 ` Ian Jackson
2016-08-05 16:16 ` Wei Liu
2016-08-05 16:18 ` Ian Jackson
2016-08-05 16:28 ` Wei Liu
2016-08-05 16:32 ` Ian Jackson
2016-08-05 16:36 ` Wei Liu
2016-08-05 17:23 ` Wei Liu
2016-08-08 10:07 ` Ian Jackson
2016-08-01 14:04 ` [XTF PATCH] xtf-runner: use xl create -Fc directly Wei Liu
2016-07-29 13:27 ` [XTF PATCH] xtf-runner: fix two synchronisation issues Andrew Cooper
2016-07-29 14:21 ` Ian Jackson
2016-07-29 14:25 ` Wei Liu
2016-07-29 14:35 ` Ian Jackson
2016-07-29 14:46 ` Wei Liu
2016-07-29 14:26 ` Andrew Cooper
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160729125828.GB22419@citrix.com \
--to=wei.liu2@citrix.com \
--cc=andrew.cooper3@citrix.com \
--cc=ian.jackson@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.