diff roundup/cgi/wsgi_handler.py @ 6747:d32d43e4a5ba

wsgi can cache tracker instance enabled by feature flag. Patch by Marcus Priesch caches a loaded tracker instance and reuse it for future client sessions. It is enabled by a feature flag in wsgi.py since it arrived during the 2.2.0 beta period. The provided wsgi.py is modified to enable it. Testing is run with flag enabled and disabled. Ralf Schlatterbeck and Marcus tested it on one of their larger more complex trackers and it sped up the response time to a client request by a factor of 3 (270ms down to about 80-85ms).
author John Rouillard <rouilj@ieee.org>
date Sat, 02 Jul 2022 14:04:00 -0400
parents 0da655d1498d
children 07ce4e4110f5
line wrap: on
line diff
--- a/roundup/cgi/wsgi_handler.py	Sat Jul 02 13:52:52 2022 -0400
+++ b/roundup/cgi/wsgi_handler.py	Sat Jul 02 14:04:00 2022 -0400
@@ -74,17 +74,24 @@
 
 
 class RequestDispatcher(object):
-    def __init__(self, home, debug=False, timing=False, lang=None):
+    def __init__(self, home, debug=False, timing=False, lang=None,
+                 feature_flags=None):
         assert os.path.isdir(home), '%r is not a directory' % (home,)
         self.home = home
         self.debug = debug
         self.timing = timing
+        self.feature_flags= feature_flags or {}
+        self.tracker = None
         if lang:
             self.translator = TranslationService.get_translation(lang,
                 tracker_home=home)
         else:
             self.translator = None
-        self.preload()
+
+        if "cache_tracker" in self.feature_flags:
+            self.tracker = roundup.instance.open(self.home, not self.debug)
+        else:
+            self.preload()
 
     def __call__(self, environ, start_response):
         """Initialize with `apache.Request` object"""
@@ -116,8 +123,8 @@
         else:
             form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ)
 
-        with self.get_tracker() as tracker:
-            client = tracker.Client(tracker, request, environ, form,
+        if "cache_tracker" in self.feature_flags:
+            client = self.tracker.Client(self.tracker, request, environ, form,
                                     self.translator)
             try:
                 client.main()
@@ -125,6 +132,16 @@
                 request.start_response([('Content-Type', 'text/html')], 404)
                 request.wfile.write(s2b('Not found: %s' % 
                                         html_escape(client.path)))
+        else:
+            with self.get_tracker() as tracker:
+                client = tracker.Client(tracker, request, environ, form,
+                                        self.translator)
+                try:
+                    client.main()
+                except roundup.cgi.client.NotFound:
+                    request.start_response([('Content-Type', 'text/html')], 404)
+                    request.wfile.write(s2b('Not found: %s' % 
+                                            html_escape(client.path)))
 
         # all body data has been written using wfile
         return []

Roundup Issue Tracker: http://roundup-tracker.org/