Patchwork [bitbake-devel] serv.py: Give pr-server up to 5 seconds to commit data

login
register
mail settings
Submitter Konrad Scherer
Date Nov. 15, 2013, 8:51 p.m.
Message ID <1384548707-31336-2-git-send-email-konrad.scherer@windriver.com>
Download mbox | patch
Permalink /patch/61837/
State New
Headers show

Comments

Konrad Scherer - Nov. 15, 2013, 8:51 p.m.
From: Konrad Scherer <Konrad.Scherer@windriver.com>

The default value of 0.5 seconds before sending the pr-server a
SIGTERM is not enough to guarantee that sqlite has committed all
the pr data to the database. By polling the pid to see if it is
still running, this allows the pr-server process to shutdown
cleanly and finish the final pr data commit.

Signed-off-by: Konrad Scherer <Konrad.Scherer@windriver.com>
---
 lib/prserv/serv.py | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

Patch

diff --git a/lib/prserv/serv.py b/lib/prserv/serv.py
index 7864594..e4c1c2a 100644
--- a/lib/prserv/serv.py
+++ b/lib/prserv/serv.py
@@ -13,6 +13,7 @@  except ImportError:
 import bb.server.xmlrpc
 import prserv
 import prserv.db
+import errno
 
 logger = logging.getLogger("BitBake.PRserv")
 
@@ -280,8 +281,18 @@  def stop_daemon(host, port):
         if pid:
             if os.path.exists(pidfile):
                 os.remove(pidfile)
-            os.kill(pid,signal.SIGTERM)
-            time.sleep(0.1)
+
+            wait_timeout = 0
+            while is_running(pid) and wait_timeout < 10:
+                print("Waiting for pr-server to exit.")
+                time.sleep(0.5)
+                wait_timeout += 1
+
+            if is_running(pid):
+                print("Sending SIGTERM to pr-server.")
+                os.kill(pid,signal.SIGTERM)
+                time.sleep(0.1)
+
     except OSError as e:
         err = str(e)
         if err.find("No such process") <= 0:
@@ -289,6 +300,14 @@  def stop_daemon(host, port):
 
     return 0
 
+def is_running(pid):
+    try:
+        os.kill(pid, 0)
+    except OSError as err:
+        if err.errno == errno.ESRCH:
+            return False
+    return True
+
 def is_local_special(host, port):
     if host.strip().upper() == 'localhost'.upper() and (not port):
         return True