Title: [185244] trunk/Tools
Revision
185244
Author
sle...@apple.com
Date
2015-06-05 02:11:24 -0700 (Fri, 05 Jun 2015)

Log Message

Make the web server more robust to timing issues..

Reviewed by Ryosuke Niwa.

Cleaned up exception handling.
Test server is actually serving pages before returning.
Clean up some style issues.

* Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py:
* Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py:
(SimpleHTTPServerDriver.__init__):
(SimpleHTTPServerDriver.serve): check output, wait for pages to serve
(SimpleHTTPServerDriver.baseUrl):
(SimpleHTTPServerDriver.fetchResult):
(SimpleHTTPServerDriver.killServer):
(SimpleHTTPServerDriver.getReturnCode):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (185243 => 185244)


--- trunk/Tools/ChangeLog	2015-06-05 09:11:21 UTC (rev 185243)
+++ trunk/Tools/ChangeLog	2015-06-05 09:11:24 UTC (rev 185244)
@@ -1,6 +1,25 @@
 2015-06-05  Stephanie Lewis  <sle...@apple.com>
 
+        Make the web server more robust to timing issues..
 
+        Reviewed by Ryosuke Niwa.
+
+        Cleaned up exception handling.
+        Test server is actually serving pages before returning.
+        Clean up some style issues.
+
+        * Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py:
+        * Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py:
+        (SimpleHTTPServerDriver.__init__):
+        (SimpleHTTPServerDriver.serve): check output, wait for pages to serve
+        (SimpleHTTPServerDriver.baseUrl): 
+        (SimpleHTTPServerDriver.fetchResult):
+        (SimpleHTTPServerDriver.killServer):
+        (SimpleHTTPServerDriver.getReturnCode):
+
+2015-06-05  Stephanie Lewis  <sle...@apple.com>
+
+
         Add errors to run-benchmark exception handling.
 
         Reviewed by Ryosuke Niwa.

Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py (185243 => 185244)


--- trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py	2015-06-05 09:11:21 UTC (rev 185243)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/http_server/twisted_http_server.py	2015-06-05 09:11:24 UTC (rev 185244)
@@ -1,22 +1,28 @@
 #!/usr/bin/env python
 
+import argparse
+import logging
+import sys
+
 from twisted.web import static, server
 from twisted.web.resource import Resource
 from twisted.internet import reactor
-import argparse
-import sys
 
+_log = logging.getLogger(__name__)
 
 class ServerControl(Resource):
     isLeaf = True
 
     def render_GET(self, request):
+        _log.info("Serving request %s" % request)
         reactor.stop()
         return ""
 
     def render_POST(self, request):
+        _log.info("Serving request %s" % request)
         sys.stdout.write(request.content.getvalue())
         sys.stdout.flush()
+        reactor.stop()
         return 'OK'
 
 

Modified: trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py (185243 => 185244)


--- trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py	2015-06-05 09:11:21 UTC (rev 185243)
+++ trunk/Tools/Scripts/webkitpy/benchmark_runner/http_server_driver/simple_http_server_driver.py	2015-06-05 09:11:24 UTC (rev 185244)
@@ -5,6 +5,7 @@
 import re
 import socket
 import subprocess
+import sys
 import time
 
 from http_server_driver import HTTPServerDriver
@@ -19,23 +20,22 @@
     """
 
     def __init__(self):
-        self.serverProcess = None
-        self.serverPort = 0
+        self.server_process = None
+        self.server_port = 0
         # FIXME: This may not be reliable.
         _log.info('Finding the IP address of current machine')
         try:
             self.ip = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][0]
             _log.info('IP of current machine is: %s' % self.ip)
-        except:
-            _log.error('Cannot get the ip address of current machine')
+        except Exception as error:
+            _log.error('Cannot get the ip address of current machine - Error: %s' % error)
             raise
 
-    def serve(self, webRoot):
-        oldWorkingDirectory = os.getcwd()
-        os.chdir(os.path.dirname(os.path.abspath(__file__)))
+    def serve(self, web_root):
         _log.info('Launching an http server')
-        self.serverProcess = subprocess.Popen(['/usr/bin/python', 'http_server/twisted_http_server.py', webRoot], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        os.chdir(oldWorkingDirectory)
+        http_server_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "http_server/twisted_http_server.py")
+        self.server_process = subprocess.Popen(["/usr/bin/python", http_server_path, web_root], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
         maxAttempt = 5
         interval = 0.5
         _log.info('Start to fetching the port number of the http server')
@@ -43,46 +43,57 @@
             import psutil
             for attempt in xrange(maxAttempt):
                 try:
-                    self.serverPort = psutil.Process(self.serverProcess.pid).connections()[0][3][1]
-                    if self.serverPort:
-                        _log.info('HTTP Server is serving at port: %d', self.serverPort)
+                    self.server_port = psutil.Process(self.server_process.pid).connections()[0][3][1]
+                    if self.server_port:
+                        _log.info('HTTP Server is serving at port: %d', self.server_port)
                         break
                 except IndexError:
                     pass
                 _log.info('Server port is not found this time, retry after %f seconds' % interval)
                 time.sleep(interval)
                 interval *= 2
+            else:
+                raise Exception("Cannot listen to server, max tries exceeded")
         except ImportError:
+            for attempt in xrange(maxAttempt):
+                try:
+                    output = subprocess.check_output(['/usr/sbin/lsof', '-a', '-iTCP', '-sTCP:LISTEN', '-p', str(self.server_process.pid)])
+                    self.server_port = int(re.search('TCP \*:(\d+) \(LISTEN\)', output).group(1))
+                    if self.server_port:
+                        _log.info('HTTP Server is serving at port: %d', self.server_port)
+                        break
+                except Exception as error:
+                     _log.info('Error: %s' % error)
+                _log.info('Server port is not found this time, retry after %f seconds' % interval)
+                time.sleep(interval)
+                interval *= 2
+            else:
+                raise Exception("Cannot listen to server, max tries exceeded")
+
+        # Wait for server to be up completely before exiting
+        for attempt in xrange(maxAttempt):
             try:
-                for attempt in xrange(maxAttempt):
-                    try:
-                        p = subprocess.Popen(' '.join(['/usr/sbin/lsof', '-a', '-iTCP', '-sTCP:LISTEN', '-p', str(self.serverProcess.pid)]), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-                        self.serverPort = int(re.findall('TCP \*:(\d+) \(LISTEN\)', p.communicate()[0])[0])
-                        if self.serverPort:
-                            _log.info('HTTP Server is serving at port: %d', self.serverPort)
-                            break
-                    # Raising exception means the server is not ready to server, try later
-                    except ValueError:
-                        pass
-                    except IndexError:
-                        pass
-                    _log.info('Server port is not found this time, retry after %f seconds' % interval)
-                    time.sleep(interval)
-                    interval *= 2
-            except:
-                raise Exception("Server may not be serving")
+                subprocess.check_call(["curl", "--silent", "--head", "--fail", "--output", "/dev/null", self.baseUrl()])
+                return
+            except Exception as error:
+                _log.info('Server not running yet: %s' % error)
+                time.sleep(interval)
+        raise Exception('Server not running, max tries exceeded: %s' % error)
 
+
     def baseUrl(self):
-        return "http://%s:%d" % (self.ip, self.serverPort)
+        return "http://%s:%d" % (self.ip, self.server_port)
 
     def fetchResult(self):
-        return self.serverProcess.communicate()[0]
+        (stdout, stderr) = self.server_process.communicate()
+        print stderr
+        return stdout
 
     def killServer(self):
         try:
-            self.serverProcess.terminate()
-        except OSError:
-            _log.info('Invalid pid, server may exit properly')
+            self.server_process.terminate()
+        except OSError as error:
+            _log.info('Error terminating server process: %s' % (error))
 
     def getReturnCode(self):
-        return self.serverProcess.returncode
+        return self.server_process.returncode
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to