duration runner: add teardown and cancel all queue join threads 01/43801/1
authorRoss Brattain <ross.b.brattain@intel.com>
Sun, 1 Oct 2017 20:14:33 +0000 (13:14 -0700)
committerRoss Brattain <ross.b.brattain@intel.com>
Sun, 1 Oct 2017 20:18:25 +0000 (13:18 -0700)
commit7eb6abb6931b24e085b139cc3500f4497cdde57d
treef510815d2cc03c2098b44dfdfffea64702dafbe5
parent2cc3ef430319e1b3b4984737abc656349ae1bc5c
duration runner: add teardown and cancel all queue join threads

calculate timeout once
catch exceptions in benchmark.teardown()

In some cases we are blocking in base.Runner join() because the
queues are not empty

call cancel_join_thread to prevent the Queue from blocking the
Process exit

https://docs.python.org/3.3/library/multiprocessing.html#all-platforms

Joining processes that use queues

  Bear in mind that a process that has put items in a queue will wait
  before terminating until all the buffered items are fed by the
  "feeder" thread to the underlying pipe. (The child process can call
  the cancel_join_thread() method of the queue to avoid this behaviour.)

  This means that whenever you use a queue you need to make sure that
  all items which have been put on the queue will eventually be removed
  before the process is joined. Otherwise you cannot be sure that
  processes which have put items on the queue will terminate. Remember
  also that non-daemonic processes will be joined automatically.

Warning

  As mentioned above, if a child process has put items on a queue (and
  it has not used JoinableQueue.cancel_join_thread), then that process
  will not terminate until all buffered items have been flushed to the
  pipe.

  This means that if you try joining that process you may get a deadlock
  unless you are sure that all items which have been put on the queue
  have been consumed. Similarly, if the child process is non-daemonic
  then the parent process may hang on exit when it tries to join all its
  non-daemonic children.

cancel_join_thread()

  Prevent join_thread() from blocking. In particular, this prevents the
  background thread from being joined automatically when the process
  exits – see join_thread().

  A better name for this method might be allow_exit_without_flush(). It
  is likely to cause enqueued data to lost, and you almost certainly
  will not need to use it. It is really only there if you need the
  current process to exit immediately without waiting to flush enqueued
  data to the underlying pipe, and you don’t care about lost data.

Change-Id: If7b904a060b9ed68b7def78c851deefca4e0de5d
Signed-off-by: Ross Brattain <ross.b.brattain@intel.com>
yardstick/benchmark/runners/duration.py