[oe-commits] [bitbake] 01/02: Revert "hashserv: Drop handler thread"

git at git.openembedded.org git at git.openembedded.org
Sun Sep 15 17:00:24 UTC 2019


This is an automated email from the git hooks/post-receive script.

rpurdie pushed a commit to branch master-next
in repository bitbake.

commit 37ab9c0061b9bb33871cf73e0a9c74587030c609
Author: Richard Purdie <richard.purdie at linuxfoundation.org>
AuthorDate: Sun Sep 15 17:56:15 2019 +0100

    Revert "hashserv: Drop handler thread"
    
    This reverts commit f885155ff982ed19e39bad59169ef8c97deb4c6d.
---
 lib/hashserv/__init__.py | 62 ++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 57 insertions(+), 5 deletions(-)

diff --git a/lib/hashserv/__init__.py b/lib/hashserv/__init__.py
index 9d5722a..eb03c32 100644
--- a/lib/hashserv/__init__.py
+++ b/lib/hashserv/__init__.py
@@ -24,8 +24,17 @@ class HashEquivalenceServer(BaseHTTPRequestHandler):
     def log_message(self, f, *args):
         logger.debug(f, *args)
 
+    def opendb(self):
+        self.db = sqlite3.connect(self.dbname)
+        self.db.row_factory = sqlite3.Row
+        self.db.execute("PRAGMA synchronous = OFF;")
+        self.db.execute("PRAGMA journal_mode = MEMORY;")
+
     def do_GET(self):
         try:
+            if not self.db:
+                self.opendb()
+
             p = urllib.parse.urlparse(self.path)
 
             if p.path != self.prefix + '/v1/equivalent':
@@ -58,6 +67,9 @@ class HashEquivalenceServer(BaseHTTPRequestHandler):
 
     def do_POST(self):
         try:
+            if not self.db:
+                self.opendb()
+
             p = urllib.parse.urlparse(self.path)
 
             if p.path != self.prefix + '/v1/equivalent':
@@ -129,22 +141,62 @@ class HashEquivalenceServer(BaseHTTPRequestHandler):
             self.send_error(400, explain=traceback.format_exc())
             return
 
-class HashHTTPServer(HTTPServer):
+class ThreadedHTTPServer(HTTPServer):
+    quit = False
+
+    def serve_forever(self):
+        self.requestqueue = queue.Queue()
+        self.handlerthread = threading.Thread(target=self.process_request_thread)
+        self.handlerthread.daemon = False
+
+        self.handlerthread.start()
+
+        signal.signal(signal.SIGTERM, self.sigterm_exception)
+        super().serve_forever()
+        os._exit(0)
+
+    def sigterm_exception(self, signum, stackframe):
+        self.server_close()
+        os._exit(0)
+
     def server_bind(self):
         HTTPServer.server_bind(self)
         self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
 
+    def process_request_thread(self):
+        while not self.quit:
+            try:
+                (request, client_address) = self.requestqueue.get(True)
+            except queue.Empty:
+                continue
+            if request is None:
+                continue
+            try:
+                self.finish_request(request, client_address)
+            except Exception:
+                self.handle_error(request, client_address)
+            finally:
+                self.shutdown_request(request)
+        os._exit(0)
+
+    def process_request(self, request, client_address):
+        self.requestqueue.put((request, client_address))
+
+    def server_close(self):
+        super().server_close()
+        self.quit = True
+        self.requestqueue.put((None, None))
+        self.handlerthread.join()
+
 def create_server(addr, dbname, prefix=''):
     class Handler(HashEquivalenceServer):
         pass
 
     db = sqlite3.connect(dbname)
     db.row_factory = sqlite3.Row
-    db.execute("PRAGMA synchronous = OFF;")
-    db.execute("PRAGMA journal_mode = MEMORY;")
 
     Handler.prefix = prefix
-    Handler.db = db
+    Handler.db = None
     Handler.dbname = dbname
 
     with contextlib.closing(db.cursor()) as cursor:
@@ -171,7 +223,7 @@ def create_server(addr, dbname, prefix=''):
         cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup ON tasks_v2 (method, taskhash)')
         cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup ON tasks_v2 (method, outhash)')
 
-    ret = HashHTTPServer(addr, Handler)
+    ret = ThreadedHTTPServer(addr, Handler)
 
     logger.info('Starting server on %s\n', ret.server_port)
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list