Browse Source

Added Tornado tests for single and multiple queries on PostgreSQL.

Matic Žgur 11 years ago
parent
commit
24d23e6021
4 changed files with 102 additions and 1 deletions
  1. 21 0
      tornado/benchmark_config
  2. 2 0
      tornado/requirements.txt
  3. 49 1
      tornado/server.py
  4. 30 0
      tornado/setup_pg.py

+ 21 - 0
tornado/benchmark_config

@@ -22,6 +22,27 @@
       "notes": "CPython 2.7",
       "versus": ""
     },
+    "postgresql-raw": {
+      "setup_file": "setup_pg",
+      "json_url": "/json",
+      "db_url": "/dbraw",
+      "query_url": "/queriesraw?queries=",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "tornado",
+      "language": "Python",
+      "orm": "Raw",
+      "platform": "Tornado",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "tornado",
+      "notes": "CPython 2.7",
+      "versus": ""
+    },
     "py3": {
       "setup_file": "setup_py3",
       "json_url": "/json",

+ 2 - 0
tornado/requirements.txt

@@ -1,2 +1,4 @@
 tornado
 motor
+psycopg2
+Momoko

+ 49 - 1
tornado/server.py

@@ -2,6 +2,7 @@ import random
 import sys
 
 import json
+import momoko
 import motor
 import tornado.ioloop
 import tornado.web
@@ -17,6 +18,7 @@ if sys.version_info[0] == 3:
 
 tornado.options.define('port', default=8888, type=int, help="Server port")
 tornado.options.define('mongo', default='localhost', type=str, help="MongoDB host")
+tornado.options.define('postgres', default=None, type=str, help="PostgreSQL host")
 
 
 class BaseHandler(tornado.web.RequestHandler):
@@ -56,10 +58,52 @@ class QueryTestHandler(BaseHandler):
         self.set_header("Content-Type", "application/json; charset=UTF-8")
         self.write(response)
 
+class QueryPostgresRawTestHandler(BaseHandler):
+    @gen.coroutine
+    def get(self):
+        sql = "SELECT id, randomNumber FROM World WHERE id=%s"
+
+        random_id = random.randint(1, 10000)
+        cursor = yield momoko.Op(
+            self.application.db.execute, sql, (random_id,)
+        )
+        row = cursor.fetchone()
+        response = json.dumps({"id": row[0], "randomNumber": row[1]})
+
+        self.set_header("Content-Type", "application/json; charset=UTF-8")
+        self.write(response)
+
+class MultipleQueriesPostgresRawTestHandler(BaseHandler):
+    @gen.coroutine
+    def get(self):
+        queries = self.get_argument("queries", "1")
+        try:
+            queries = int(queries.strip())
+        except ValueError:
+            queries = 1
+
+        queries = min(max(1, queries), 500)
+
+        sql = "SELECT id, randomNumber FROM World WHERE id=%s"
+
+        worlds = []
+        for i in xrange(int(queries)):
+            random_id = random.randint(1, 10000)
+            cursor = yield momoko.Op(
+                self.application.db.execute, sql, (random_id,)
+            )
+            row = cursor.fetchone()
+            worlds.append({"id": row[0], "randomNumber": row[1]})
+        response = json.dumps(worlds)
+        self.set_header("Content-Type", "application/json; charset=UTF-8")
+        self.write(response)
+
 application = tornado.web.Application([
     (r"/json", JsonSerializeTestHandler),
     (r"/plaintext", PlaintextHandler),
     (r"/db", QueryTestHandler),
+    (r"/dbraw", QueryPostgresRawTestHandler),
+    (r"/queriesraw", MultipleQueriesPostgresRawTestHandler)
 ])
 
 if __name__ == "__main__":
@@ -67,5 +111,9 @@ if __name__ == "__main__":
     server = tornado.httpserver.HTTPServer(application)
     server.bind(options.port)
     server.start(0)
-    db = motor.MotorClient(options.mongo).open_sync().hello_world
+    if options.postgres:
+        dsn = "user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world host=%s" % options.postgres
+        application.db = momoko.Pool(dsn, size=1)
+    else:
+        db = motor.MotorClient(options.mongo).open_sync().hello_world
     tornado.ioloop.IOLoop.instance().start()

+ 30 - 0
tornado/setup_pg.py

@@ -0,0 +1,30 @@
+from os.path import expanduser
+from os import kill
+import subprocess
+import sys
+import time
+
+
+python = expanduser('~/FrameworkBenchmarks/installs/py2/bin/python')
+cwd = expanduser('~/FrameworkBenchmarks/tornado')
+
+
+def start(args, logfile, errfile):
+    subprocess.Popen(
+        python + " server.py --port=8080 --postgres=%s --logging=error" % (args.database_host,),
+        shell=True, cwd=cwd, stderr=errfile, stdout=logfile)
+    return 0
+
+def stop(logfile, errfile):
+    for line in subprocess.check_output(["ps", "aux"]).splitlines():
+        if 'server.py --port=8080' in line:
+            pid = int(line.split(None,2)[1])
+            kill(pid, 9)
+    return 0
+
+if __name__ == '__main__':
+    class DummyArg:
+        database_host = 'localhost'
+    start(DummyArg(), sys.stderr, sys.stderr)
+    time.sleep(1)
+    stop(sys.stderr, sys.stderr)