On Thu, Mar 31, 2011 at 10:25:59AM +0200, René Nussbaumer wrote:
> There was a race condition on heavily loaded testsystem causing randomly
> to fail the timeout unittests as the signal handler is not yet setup but
> the timeout has already hit.
> 
> Therefore we introduce a workaround to wait until a program reached a
> certain point (for example after signal handling setup) before we
> actually go for the real run. The wait of course has a timeout as well,
> but it's pretty high. If we hit the 20 seconds we have really big issues
> anyway.
> ---
>  lib/utils/process.py                  |   16 +++++++--
>  test/ganeti.utils.process_unittest.py |   64 +++++++++++++++++++++++++++++---
>  2 files changed, 71 insertions(+), 9 deletions(-)

> +class _PostforkProcessReadyHelper:
> +  """A helper to use with _postfork_fn in RunCmd.
> +
> +  It makes sure a process has reached a certain state by reading from a fifo.
> +
> +  @ivar fifo_file: The fifo file created and checked by the helper
> +
> +  """
> +  def __init__(self, fifo_dir, timeout):
> +    """Initialize the helper.
> +
> +    @param fifo_dir: The dir where we can create the fifo
> +    @param timeout: The time in seconds to wait before giving up
> +
> +    """
> +    self.fifo_file = os.path.join(fifo_dir, "proccess_ready_%d" % 
> time.time())
> +    self.timeout = timeout
> +    os.mkfifo(self.fifo_file)
> +    self._fifo_fd = os.open(self.fifo_file, os.O_RDONLY | os.O_NONBLOCK)

Why do you use a named pipe here instead of an anonymous one (pipe(2))?

iustin

Reply via email to