Re: [KVM-AUTOTEST,01/17] Add new module kvm_subprocess

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



----- "Chen Cao" <kcao@xxxxxxxxxx> wrote:

> On Mon, Oct 12, 2009 at 09:07:45AM -0400, Michael Goldish wrote:
> > You're right, currently the sessions must be closed explicitly.
> > This is due to the fact that both qemu and ssh/telnet are handled by
> the
> > same code, and qemu has to keep running in the background if we want
> to
> > pass it from one test to another.
> > 
> > To deal with this, first, we should use try..finally blocks to close
> all
> > sessions in tests.  As far as I know all existing tests (or at least
> most
> > of them) already do this.
> > 
> > Second, we can add a destructor function to kvm_shell_session that
> will
> > close the session automatically when it's no longer referenced.  At
> the
> > moment this won't work because there's a thread running in the
> background
> > tracking output from the session, but this thread is usually not
> needed
> > for ssh/telnet (it's needed mainly for qemu), so we can selectively
> get
> > rid of it and allow the reference count to drop to zero when the
> test exits,
> > thus allowing the destructor to be called.
> > 
> > I'll think of a way to do the second thing, and if it works, maybe
> we won't
> > need the first.  But for now every test should close its sessions
> explicitly.
> > 
> > BTW, I'm not sure I understand why cleaning up the sessions should
> be
> > exhausting in the case you presented.  You can just wrap everything
> in one
> > big try..finally block:
> > 
> > session = ...
> > 
> > try:
> >   try:
> >   except:
> >   try:
> >   except:
> >   ...
> > finally:
> >   session.close()
> > 
> 
> Thanks for your explanation.
> 
> It is just boring and error-prone to add lots of
> '(dst|src|tmp|etc)*sesson.close()' to our code (the internal version)
> into different files and big number of functions. and some of the
> 'sessions' are in the try...except blocks, and some are not.
> 
> We have to make sure where we started the sessions and to close all
> of
> them when they are not needed any longer. I feel it's a little weird
> that we have to do the garbage-collection-like work while using
> python.
> 
> so, since this is a known issue, or precisely, limitation of 'ease of
> use', I'm looking forward to your impovement, and I think, we will
> also try to work it out at the same time.
> 
> Thanks again for your help.
> 
> 
> Cao, Chen
> 2009-10-13

OK, agreed.  I posted 3 patches that should fix this but I've only given
them minimal testing.  Let me know what you think.

Thanks,
Michael

> > ----- Original Message -----
> > From: "Chen Cao" <kcao@xxxxxxxxxx>
> > To: "Michael Goldish" <mgoldish@xxxxxxxxxx>
> > Cc: autotest@xxxxxxxxxxxxxxx, kvm@xxxxxxxxxxxxxxx
> > Sent: Monday, October 12, 2009 8:55:59 AM (GMT+0200) Auto-Detected
> > Subject: Re: [KVM-AUTOTEST,01/17] Add new module kvm_subprocess
> > 
> > 
> > Hi, Michael,
> > 
> > I found that if the sessions initialized using kvm_subprcoess are
> not closed,
> > the processes will never exit, and /tmp/kvm_spawn will be filled
> with the
> > temporary files.
> > 
> > And we can find in the code,
> > # kvm_subprocess.py
> > ...
> >         # Read from child and write to files/pipes
> >         while True:
> >             check_termination = False
> >             # Make a list of reader pipes whose buffers are not
> empty
> >             fds = [fd for (i, fd) in enumerate(reader_fds) if
> buffers[i]]
> >             # Wait until there's something to do
> >             r, w, x = select.select([shell_fd, inpipe_fd], fds, [],
> 0.5)
> >             # If a reader pipe is ready for writing --
> >             for (i, fd) in enumerate(reader_fds):
> >                 if fd in w:
> >                     bytes_written = os.write(fd, buffers[i])
> >                     buffers[i] = buffers[i][bytes_written:]
> >             # If there's data to read from the child process --
> >             if shell_fd in r:
> >                 try:
> >                     data = os.read(shell_fd, 16384)
> >                 except OSError:
> >                     data = ""
> >                 if not data:
> >                     check_termination = True
> >                 # Remove carriage returns from the data -- they
> often cause
> >                 # trouble and are normally not needed
> >                 data = data.replace("\r", "")
> >                 output_file.write(data)
> >                 output_file.flush()
> >                 for i in range(len(readers)):
> >                     buffers[i] += data
> >             # If os.read() raised an exception or there was nothing
> to read --
> >             if check_termination or shell_fd not in r:
> >                 pid, status = os.waitpid(shell_pid, os.WNOHANG)
> >                 if pid:
> >                     status = os.WEXITSTATUS(status)
> >                     break
> >             # If there's data to read from the client --
> >             if inpipe_fd in r:
> >                 data = os.read(inpipe_fd, 1024)
> >                 os.write(shell_fd, data)
> > ...
> > 
> > that if session.close() is not called, we will loop in the 'while'
> forever.
> > 
> > So, user have to make sure that unnecessary sessions are all
> killed,
> > otherwise, running some testcase(s) for huge number of times will
> suck
> > out all the system resource, which I think is very inconvenient.
> > Especially when we have to take care of many exceptions that may be
> raised
> > by our program.
> > 
> > e.g.
> > 
> > ...
> > session = kvm_test_utils.wait_for_login(vm)
> > ...
> > session2 = kvm_test_utils.wait_for_login(vm_x)
> > ...
> > try:
> >     ...
> > except ...:
> >     ...
> > ...
> > (other code may raise exceptions)
> > ...
> > try:
> >     ...
> > except ...:
> >     ...
> > ...
> > try:
> >     ...
> > except ...:
> >     ...
> > ...
> > 
> > cleaning up the sessions will be exhausting here.
> > 
> > Do we have a good (or better) way to handle this?
> > Thanks.
> > 
> > 
> > Regards,
> > 
> > Cao, Chen
> > 2009-10-12
> > 
> > On Mon, Jul 20, 2009 at 12:07 PM, Michael
> Goldish<mgoldish@xxxxxxxxxx>
> > wrote:
> > > This module is intended to be used for controlling all child
> > > processes in KVM
> > > tests: both QEMU processes and SSH/SCP/Telnet processes.
> Processes
> > > started with
> > > this module keep running and can be interacted with even after
> the
> > > parent
> > > process exits.
> > >
> > > The current run_bg() utility tracks a child process as long as
> the
> > > parent
> > > process is running. When the parent process exits, the tracking
> > > thread
> > > terminates and cannot resume when needed.
> > >
> > > Currently SSH/SCP/Telnet communication is handled by
> > > kvm_utils.kvm_spawn, which
> > > does not allow the child process to run after the parent process
> > > exits. Thus,
> > > open SSH/SCP/Telnet sessions cannot be reused by tests following
> the
> > > one in
> > > which they are opened.
> > >
> > > The new module provides a solution to these two problems, and
> also
> > > saves some
> > > code by reusing common code required both for QEMU processes and
> > > SSH/SCP/Telnet
> > > processes.
> > >
> > > Signed-off-by: Michael Goldish <mgoldish@xxxxxxxxxx>
> > > ---
> > >  client/tests/kvm/kvm_subprocess.py | 1146
> > >  ++++++++++++++++++++++++++++++++++++
> > >  1 files changed, 1146 insertions(+), 0 deletions(-)
> > >  create mode 100644 client/tests/kvm/kvm_subprocess.py
> > >
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux