Przeglądaj źródła

Update cutelyst 1 4 0 (#2571)

* cutelyst: Use a mutex locker for all database types

QSqlDatabase::addDatabase is not thread-safe, so
using a QMutexLocker for all databases is safer and
is only used when connecting the first time to the
database.

* cutelyst: update to cutelyst 1.4.0 and enable jemalloc

* cutelyst: Adjust cutelyst-wsgi to 1.4.0 and add tests with Epoll
Daniel Nicoletti 8 lat temu
rodzic
commit
9e85717cc3

+ 126 - 4
frameworks/C++/cutelyst/benchmark_config.json

@@ -20,7 +20,7 @@
                 "notes": "",
                 "versus": ""
             },
-            "postgres-raw": {
+            "pf-postgres": {
                 "setup_file": "setup_pf_pg",
                 "db_url": "/db_postgres",
                 "query_url": "/query_postgres?queries=",
@@ -37,11 +37,11 @@
                 "webserver": "None",
                 "os": "Linux",
                 "database_os": "Linux",
-                "display_name": "cutelyst-pf-pg-raw",
+                "display_name": "cutelyst-pf-pg",
                 "notes": "",
                 "versus": ""
             },
-            "mysql-raw": {
+            "pf-mysql": {
                 "setup_file": "setup_pf_my",
                 "db_url": "/db_mysql",
                 "query_url": "/query_mysql?queries=",
@@ -58,7 +58,7 @@
                 "webserver": "None",
                 "os": "Linux",
                 "database_os": "Linux",
-                "display_name": "cutelyst-pf-mysql-raw",
+                "display_name": "cutelyst-pf-mysql",
                 "notes": "",
                 "versus": ""
             },
@@ -123,6 +123,128 @@
                 "notes": "",
                 "versus": ""
             },
+            "pf-epoll": {
+                "setup_file": "setup_pf_epoll",
+                "json_url": "/json",
+                "plaintext_url": "/plaintext",
+                "port": 8080,
+                "approach": "Realistic",
+                "classification": "Fullstack",
+                "database": "None",
+                "framework": "cutelyst",
+                "language": "C++",
+                "orm": "Raw",
+                "platform": "Qt",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "cutelyst-pf-epoll",
+                "notes": "",
+                "versus": ""
+            },
+            "pf-postgres-epoll": {
+                "setup_file": "setup_pf_pg_epoll",
+                "db_url": "/db_postgres",
+                "query_url": "/query_postgres?queries=",
+                "update_url": "/updates_postgres?queries=",
+                "fortune_url": "/fortunes_raw_postgres",
+                "port": 8080,
+                "approach": "Realistic",
+                "classification": "Platform",
+                "database": "Postgres",
+                "framework": "cutelyst",
+                "language": "C++",
+                "orm": "Raw",
+                "platform": "Qt",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "cutelyst-pf-pg-epoll",
+                "notes": "",
+                "versus": ""
+            },
+            "pf-mysql-epoll": {
+                "setup_file": "setup_pf_my_epoll",
+                "db_url": "/db_mysql",
+                "query_url": "/query_mysql?queries=",
+                "update_url": "/updates_mysql?queries=",
+                "fortune_url": "/fortunes_raw_mysql",
+                "port": 8080,
+                "approach": "Realistic",
+                "classification": "Platform",
+                "database": "MySQL",
+                "framework": "cutelyst",
+                "language": "C++",
+                "orm": "Raw",
+                "platform": "Qt",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "cutelyst-pf-mysql-epoll",
+                "notes": "",
+                "versus": ""
+            },
+            "thread-epoll": {
+                "setup_file": "setup_thread_epoll",
+                "json_url": "/json",
+                "plaintext_url": "/plaintext",
+                "port": 8080,
+                "approach": "Realistic",
+                "classification": "Fullstack",
+                "database": "None",
+                "framework": "cutelyst",
+                "language": "C++",
+                "orm": "Raw",
+                "platform": "Qt",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "cutelyst-thread-epoll",
+                "notes": "",
+                "versus": ""
+            },
+            "thread-postgres-epoll": {
+                "setup_file": "setup_thread_pg_epoll",
+                "db_url": "/db_postgres",
+                "query_url": "/query_postgres?queries=",
+                "update_url": "/updates_postgres?queries=",
+                "fortune_url": "/fortunes_raw_postgres",
+                "port": 8080,
+                "approach": "Realistic",
+                "classification": "Platform",
+                "database": "Postgres",
+                "framework": "cutelyst",
+                "language": "C++",
+                "orm": "Raw",
+                "platform": "Qt",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "cutelyst-thread-pg-epoll",
+                "notes": "",
+                "versus": ""
+            },
+            "thread-mysql-epoll": {
+                "setup_file": "setup_thread_my_epoll",
+                "db_url": "/db_mysql",
+                "query_url": "/query_mysql?queries=",
+                "update_url": "/updates_mysql?queries=",
+                "fortune_url": "/fortunes_raw_mysql",
+                "port": 8080,
+                "approach": "Realistic",
+                "classification": "Platform",
+                "database": "MySQL",
+                "framework": "cutelyst",
+                "language": "C++",
+                "orm": "Raw",
+                "platform": "Qt",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "cutelyst-thread-mysql-epoll",
+                "notes": "",
+                "versus": ""
+            },
             "nginx": {
                 "setup_file": "setup_uwsgi_nginx",
                 "json_url": "/json",

+ 3 - 1
frameworks/C++/cutelyst/config.sh

@@ -7,11 +7,13 @@ fw_depends cutelyst
 # UWSGI
 # NGINX
 # PROCESS_OR_THREAD
+# CUTELYST_EVENT_LOOP_EPOLL
 
 echo DRIVER=${DRIVER}
 echo UWSGI=${UWSGI}
 echo NGINX=${NGINX}
 echo QT_VERSION_MM=${QT_VERSION_MM}
+echo CUTELYST_EVENT_LOOP_EPOLL=${CUTELYST_EVENT_LOOP_EPOLL}
 
 if [ "${DRIVER}" == "QMYSQL" ]; then
   fw_depends mysql
@@ -45,7 +47,7 @@ export LD_LIBRARY_PATH=/opt/qt${QT_VERSION_MM}/lib:${IROOT}/lib/x86_64-linux-gnu
 if [ -n "${UWSGI}" ]; then
   uwsgi --ini ${IROOT}/config.ini --cutelyst-app ${IROOT}/cutelyst-benchmarks/src/libcutelyst_benchmarks.so ${PROCESS_OR_THREAD} $MAX_THREADS &
 else
-  ${IROOT}/bin/cutelyst-wsgi --ini ${IROOT}/config.ini -a ${IROOT}/cutelyst-benchmarks/src/libcutelyst_benchmarks.so ${PROCESS_OR_THREAD} $MAX_THREADS &
+  ${IROOT}/bin/cutelyst-wsgi --ini ${IROOT}/config.ini -a ${IROOT}/cutelyst-benchmarks/src/libcutelyst_benchmarks.so ${PROCESS_OR_THREAD} $MAX_THREADS --socket-timeout 0 &
 fi
 
 # configure Nginx

+ 9 - 0
frameworks/C++/cutelyst/setup_pf_epoll.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DRIVER=
+UWSGI=
+NGINX=
+PROCESS_OR_THREAD=-p
+export CUTELYST_EVENT_LOOP_EPOLL=1
+
+source ${TROOT}/config.sh

+ 9 - 0
frameworks/C++/cutelyst/setup_pf_my_epoll.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DRIVER=QMYSQL
+UWSGI=
+NGINX=
+PROCESS_OR_THREAD=-p
+export CUTELYST_EVENT_LOOP_EPOLL=1
+
+source ${TROOT}/config.sh

+ 9 - 0
frameworks/C++/cutelyst/setup_pf_pg_epoll.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DRIVER=QPSQL
+UWSGI=
+NGINX=
+PROCESS_OR_THREAD=-p
+export CUTELYST_EVENT_LOOP_EPOLL=1
+
+source ${TROOT}/config.sh

+ 9 - 0
frameworks/C++/cutelyst/setup_thread_epoll.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DRIVER=
+UWSGI=
+NGINX=
+PROCESS_OR_THREAD=-t
+export CUTELYST_EVENT_LOOP_EPOLL=1
+
+source ${TROOT}/config.sh

+ 9 - 0
frameworks/C++/cutelyst/setup_thread_my_epoll.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DRIVER=QMYSQL
+UWSGI=
+NGINX=
+PROCESS_OR_THREAD=-t
+export CUTELYST_EVENT_LOOP_EPOLL=1
+
+source ${TROOT}/config.sh

+ 9 - 0
frameworks/C++/cutelyst/setup_thread_pg_epoll.sh

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DRIVER=QPSQL
+UWSGI=
+NGINX=
+PROCESS_OR_THREAD=-t
+export CUTELYST_EVENT_LOOP_EPOLL=1
+
+source ${TROOT}/config.sh

+ 16 - 16
frameworks/C++/cutelyst/src/cutelyst-benchmarks.cpp

@@ -32,7 +32,7 @@ cutelyst_benchmarks::~cutelyst_benchmarks()
 
 bool cutelyst_benchmarks::init()
 {
-    if (config(QLatin1String("SendDate")).value<bool>()) {
+    if (config(QStringLiteral("SendDate")).value<bool>()) {
         qDebug() << "Manually send date";
         new Root(this);
     }
@@ -44,36 +44,36 @@ bool cutelyst_benchmarks::init()
     new FortuneTest(this);
     new PlaintextTest(this);
 
-    defaultHeaders().setServer(QLatin1String("Cutelyst"));
-    defaultHeaders().removeHeader(QLatin1String("X-Cutelyst"));
+    if (defaultHeaders().server().isEmpty()) {
+        defaultHeaders().setServer(QStringLiteral("Cutelyst"));
+    }
+    defaultHeaders().removeHeader(QStringLiteral("X-Cutelyst"));
 
     return true;
 }
 
 bool cutelyst_benchmarks::postFork()
 {
+    QMutexLocker locker(&mutex); // QSqlDatabase::addDatabase is not thread-safe
 
-    const auto driver = config(QLatin1String("Driver")).toString();
+    QSqlDatabase db;
+    const auto driver = config(QStringLiteral("Driver")).toString();
     if (driver == QLatin1String("QPSQL")) {
-        QSqlDatabase db;
         db = QSqlDatabase::addDatabase(driver, Sql::databaseNameThread(QStringLiteral("postgres")));
-        db.setDatabaseName(QLatin1String("hello_world"));
-        db.setUserName(QLatin1String("benchmarkdbuser"));
-        db.setPassword(QLatin1String("benchmarkdbpass"));
-        db.setHostName(config(QLatin1String("DatabaseHostName")).toString());
+        db.setDatabaseName(QStringLiteral("hello_world"));
+        db.setUserName(QStringLiteral("benchmarkdbuser"));
+        db.setPassword(QStringLiteral("benchmarkdbpass"));
+        db.setHostName(config(QStringLiteral("DatabaseHostName")).toString());
         if (!db.open()) {
             qDebug() << "Error opening PostgreSQL db:" << db << db.connectionName() << db.lastError().databaseText();
             return false;
         }
     } else if (driver == QLatin1String("QMYSQL")) {
-        QMutexLocker locker(&mutex); // MySQL driver is not thread-safe
-
-        QSqlDatabase db;
         db = QSqlDatabase::addDatabase(driver, Sql::databaseNameThread(QStringLiteral("mysql")));
-        db.setDatabaseName(QLatin1String("hello_world"));
-        db.setUserName(QLatin1String("benchmarkdbuser"));
-        db.setPassword(QLatin1String("benchmarkdbpass"));
-        db.setHostName(config(QLatin1String("DatabaseHostName")).toString());
+        db.setDatabaseName(QStringLiteral("hello_world"));
+        db.setUserName(QStringLiteral("benchmarkdbuser"));
+        db.setPassword(QStringLiteral("benchmarkdbpass"));
+        db.setHostName(config(QStringLiteral("DatabaseHostName")).toString());
         if (!db.open()) {
             qDebug() << "Error opening MySQL db:" << db << db.connectionName() << db.lastError().databaseText();
             return false;

+ 15 - 6
toolset/setup/linux/frameworks/cutelyst.sh

@@ -2,17 +2,26 @@
 
 fw_installed cutelyst && return 0
 
-CUTELYST_VER=r1.3.0
+CUTELYST_VER=r1.4.0
 QT_VERSION_MM=56
 QT_VERSION_FULL=562-trusty
 
 sudo apt-add-repository --yes ppa:george-edison55/cmake-3.x
 sudo apt-add-repository --yes ppa:beineri/opt-qt$QT_VERSION_FULL
 sudo apt-get update -qq
-sudo apt-get install -qqy cmake
-sudo apt-get install -qqy uwsgi uuid-dev libcap-dev libzmq3-dev
-sudo apt-get install -qqy clearsilver-dev 
-sudo apt-get install -qqy qt${QT_VERSION_MM}base qt${QT_VERSION_MM}script qt${QT_VERSION_MM}tools
+
+sudo apt-get install -qqy \
+cmake \
+uwsgi \
+uuid-dev \
+libcap-dev \
+libzmq3-dev \
+clearsilver-dev \
+libjemalloc-dev \
+qt${QT_VERSION_MM}base \
+qt${QT_VERSION_MM}script \
+qt${QT_VERSION_MM}tools
+
 export CMAKE_PREFIX_PATH=/opt/qt${QT_VERSION_MM};
 
 fw_get -O https://github.com/cutelyst/cutelyst/archive/$CUTELYST_VER.tar.gz
@@ -21,7 +30,7 @@ fw_untar $CUTELYST_VER.tar.gz
 cd cutelyst-$CUTELYST_VER
 mkdir build && cd build
 
-cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$IROOT
+cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$IROOT -DUSE_JEMALLOC=on
 
 make -j $MAX_THREADS && sudo make install