Revision 5ef5ea45

b/lib/utils.py
566 566
  @return: True if the process exists
567 567

  
568 568
  """
569
  def _TryStat(name):
570
    try:
571
      os.stat(name)
572
      return True
573
    except EnvironmentError, err:
574
      if err.errno in (errno.ENOENT, errno.ENOTDIR):
575
        return False
576
      elif err.errno == errno.EINVAL:
577
        raise RetryAgain(err)
578
      raise
579

  
580
  assert isinstance(pid, int), "pid must be an integer"
569 581
  if pid <= 0:
570 582
    return False
571 583

  
584
  proc_entry = "/proc/%d/status" % pid
585
  # /proc in a multiprocessor environment can have strange behaviors.
586
  # Retry the os.stat a few times until we get a good result.
572 587
  try:
573
    os.stat("/proc/%d/status" % pid)
574
    return True
575
  except EnvironmentError, err:
576
    if err.errno in (errno.ENOENT, errno.ENOTDIR):
577
      return False
578
    raise
588
    return Retry(_TryStat, (0.01, 1.5, 0.1), 0.5, args=[proc_entry])
589
  except RetryTimeout, err:
590
    err.RaiseInner()
579 591

  
580 592

  
581 593
def ReadPidFile(pidfile):

Also available in: Unified diff