Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1895)

Unified Diff: scripts/slave/recipe_modules/goma/resources/cloudtail_utils.py

Issue 2404213002: Reland Wait cloudtail termination in goma module (Closed)
Patch Set: stop to kill in is_running_posix Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: scripts/slave/recipe_modules/goma/resources/cloudtail_utils.py
diff --git a/scripts/slave/recipe_modules/goma/resources/cloudtail_utils.py b/scripts/slave/recipe_modules/goma/resources/cloudtail_utils.py
index 79f20dc1edd7c1ee81c9d20086e9b363e61c5bb5..17fa8def359c09045d0d868dae765c08f1d41383 100644
--- a/scripts/slave/recipe_modules/goma/resources/cloudtail_utils.py
+++ b/scripts/slave/recipe_modules/goma/resources/cloudtail_utils.py
@@ -9,6 +9,7 @@ import os
import signal
import subprocess
import sys
+import time
from slave import goma_utils
@@ -24,6 +25,65 @@ def start_cloudtail(args):
with open(args.pid_file, 'w') as f:
f.write(str(proc.pid))
+
+def is_running_posix(pid):
+ """Return True if process of pid is running.
+
+ Args:
+ pid(int): pid of process which this function checks
+ whether it is running or not.
+
+ Returns:
+ bool: True if process of pid is running.
+
+ Raises:
+ OSError if something happens in os.kill(pid, 0)
+ """
+
+ try:
+ os.kill(pid, 0)
+ except OSError as e:
+ if e.errno == errno.ESRCH or e.errno == errno.EPERM:
+ return False
+ raise e
+ return True
+
+
+def wait_termination(pid):
+ """Send SIGINT to pid and wait termination of pid.
+
+ Args:
+ pid(int): pid of process which this function waits termination.
+
+ Raises:
+ OSError: is_running_posix, os.waitpid and os.kill may throw OSError.
ukai 2016/10/12 01:48:28 caller should SIGKILL, or this will send SIGKILL b
tikuta 2016/10/12 06:51:50 I stopped to send SIGKILL in this function. Caller
+ """
+
+ try:
+ os.kill(pid, signal.SIGINT)
+ except:
+ os.kill(pid, signal.SIGKILL)
ukai 2016/10/12 01:48:28 which case it will try send SIGKILL?
tikuta 2016/10/12 06:51:50 Done.
+ raise
+
+ if os.name == 'nt':
+ try:
+ os.waitpid(pid, 0)
+ except OSError as e:
+ if e.errno == errno.ECHILD:
+ print('ignore errno.ECHILD %s' % e)
ukai 2016/10/12 01:48:28 process of pid died before os.waitpid?
tikuta 2016/10/12 06:51:51 Done.
+ return
+ raise e
+ else:
+ for _ in xrange(10):
+ if not is_running_posix(pid):
+ break
+ time.sleep(1)
+
+ if is_running_posix(pid):
+ os.kill(pid, signal.SIGKILL)
+ print('killed process %d running more than 10 seconds' % pid)
+
+
def main():
parser = argparse.ArgumentParser(
description='cloudtail utility for goma recipe module.')
@@ -52,7 +112,14 @@ def main():
with open(args.killed_pid_file) as f:
# cloudtail flushes log and terminates
# within 5 seconds when it recieves SIGINT.
- os.kill(int(f.read()), signal.SIGINT)
+ pid = int(f.read())
+ try:
+ wait_termination(int(f.read()))
+ except OSError as e:
+ os.kill(pid, signal.SIGKILL)
+ print('killed process %d due to OSError %s' % (pid, e))
+ raise e
+
if '__main__' == __name__:
sys.exit(main())
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698