Browse Source

Merge branch 'master' of https://github.com/TechEmpower/FrameworkBenchmarks

Conflicts:
	.travis.yml
jamming 10 years ago
parent
commit
d74cc1a9ce
39 changed files with 340 additions and 535 deletions
  1. 122 123
      .travis.yml
  2. 3 3
      config/cassandra/cassandra.yaml
  3. 2 2
      deployment/vagrant-common/bootstrap.sh
  4. 4 0
      frameworks/C++/ULib/install.sh
  5. 2 2
      frameworks/C++/ULib/setup_mysql.sh
  6. 2 2
      frameworks/C++/ULib/setup_postgres.sh
  7. 2 2
      frameworks/C++/ULib/setup_sqlite.sh
  8. 0 1
      frameworks/C++/ULib/src/json.usp
  9. 19 4
      frameworks/C/lwan/benchmark_config
  10. 1 1
      frameworks/C/lwan/install.sh
  11. 2 2
      frameworks/Java/servlet/pom.xml
  12. 22 0
      frameworks/Java/spring/src/main/java/com/techempower/spring/Common.java
  13. 50 18
      frameworks/Java/spring/src/main/java/com/techempower/spring/web/WorldDatabaseController.java
  14. 4 4
      frameworks/Java/undertow-edge/pom.xml
  15. 4 4
      frameworks/Java/undertow/pom.xml
  16. 0 9
      frameworks/PHP/php-silica/.gitignore
  17. 0 36
      frameworks/PHP/php-silica/README.md
  18. 0 9
      frameworks/PHP/php-silica/bash_profile.sh
  19. 0 24
      frameworks/PHP/php-silica/benchmark_config
  20. 0 6
      frameworks/PHP/php-silica/composer.json
  21. 0 136
      frameworks/PHP/php-silica/deploy/nginx.conf
  22. 0 9
      frameworks/PHP/php-silica/deploy/php-silica
  23. 0 3
      frameworks/PHP/php-silica/install.sh
  24. 0 13
      frameworks/PHP/php-silica/setup.sh
  25. 0 4
      frameworks/PHP/php-silica/source_code
  26. 0 8
      frameworks/PHP/php-silica/web/.htaccess
  27. 0 51
      frameworks/PHP/php-silica/web/app.php
  28. 4 1
      frameworks/PHP/php-slim/index.php
  29. 17 7
      frameworks/Perl/mojolicious/cpanfile.snapshot
  30. 1 1
      frameworks/Python/API-Hour/requirements.txt
  31. 31 17
      toolset/run-ci.py
  32. 3 1
      toolset/setup/linux/client.sh
  33. 26 17
      toolset/setup/linux/database.sh
  34. 3 2
      toolset/setup/linux/installer.py
  35. 5 4
      toolset/setup/linux/languages/mono.sh
  36. 2 2
      toolset/setup/linux/languages/perl.sh
  37. 3 2
      toolset/setup/linux/languages/python2.sh
  38. 3 2
      toolset/setup/linux/languages/python3.sh
  39. 3 3
      toolset/setup/linux/prerequisites.sh

+ 122 - 123
.travis.yml

@@ -15,135 +15,134 @@ env:
     #   find . -type d -depth 2 | sed 's|./|    - "TESTDIR=|' | sed 's/$/"/g'
     #   find . -type d -depth 2 | sed 's|./|    - "TESTDIR=|' | sed 's/$/"/g'
     #
     #
     #  
     #  
-    #- "TESTDIR=C/lwan"
-    #- "TESTDIR=C/duda"
-    #- "TESTDIR=C/haywire"
-    #- "TESTDIR=C/onion"
-    #- "TESTDIR=CSharp/aspnet"
+    - "TESTDIR=C/lwan"
+    - "TESTDIR=C/duda"
+    - "TESTDIR=C/haywire"
+    - "TESTDIR=C/onion"
+    - "TESTDIR=CSharp/aspnet"
     # - "TESTDIR=CSharp/aspnet-stripped"
     # - "TESTDIR=CSharp/aspnet-stripped"
-    #- "TESTDIR=CSharp/evhttp-sharp"
+    - "TESTDIR=CSharp/evhttp-sharp"
     # - "TESTDIR=CSharp/HttpListener"
     # - "TESTDIR=CSharp/HttpListener"
-    #- "TESTDIR=CSharp/nancy"
-    #- "TESTDIR=CSharp/servicestack"
-    #- "TESTDIR=C++/cpoll_cppsp"
-    #- "TESTDIR=C++/treefrog"
-    #- "TESTDIR=C++/ULib"
-    #- "TESTDIR=C++/wt"
-    #- "TESTDIR=Clojure/compojure"
-    #- "TESTDIR=Clojure/http-kit"
-    #- "TESTDIR=Clojure/luminus"
-    #- "TESTDIR=Dart/dart"
-    #- "TESTDIR=Dart/dart-redstone"
-    #- "TESTDIR=Dart/dart-start"
-    #- "TESTDIR=Dart/dart-stream"
-    #- "TESTDIR=Elixir/WeberFramework"
-    #- "TESTDIR=Erlang/cowboy"
-    #- "TESTDIR=Erlang/elli"
-    #- "TESTDIR=Go/beego"
-    #- "TESTDIR=Go/falcore"
-    #- "TESTDIR=Go/gin"
-    #- "TESTDIR=Go/go"
-    #- "TESTDIR=Go/gorail"
-    #- "TESTDIR=Go/revel"
-    #- "TESTDIR=Go/revel-jet"
-    #- "TESTDIR=Go/revel-qbs"
-    #- "TESTDIR=Go/webgo"
-    #- "TESTDIR=Groovy/grails"
-    #- "TESTDIR=Haskell/snap"
-    #- "TESTDIR=Haskell/wai"
-    #- "TESTDIR=Haskell/yesod"
-    #- "TESTDIR=Java/activeweb"
-    #- "TESTDIR=Java/curacao"
-    #- "TESTDIR=Java/dropwizard"
-    #- "TESTDIR=Java/dropwizard-mongodb"
-    #- "TESTDIR=Java/gemini"
-    #- "TESTDIR=Java/grizzly-bm"
-    #- "TESTDIR=Java/grizzly-jersey"
-    #- "TESTDIR=Java/jetty-servlet"
-    #- "TESTDIR=Java/netty"
-    #- "TESTDIR=Java/ninja-standalone"
-    #- "TESTDIR=Java/play1"
-    #- "TESTDIR=Java/play1siena"
-    #- "TESTDIR=Java/play2-java"
-    #- "TESTDIR=Java/restexpress"
+    - "TESTDIR=CSharp/nancy"
+    - "TESTDIR=CSharp/servicestack"
+    - "TESTDIR=C++/cpoll_cppsp"
+    - "TESTDIR=C++/treefrog"
+    - "TESTDIR=C++/ULib"
+    - "TESTDIR=C++/wt"
+    - "TESTDIR=Clojure/compojure"
+    - "TESTDIR=Clojure/http-kit"
+    - "TESTDIR=Clojure/luminus"
+    - "TESTDIR=Dart/dart"
+    - "TESTDIR=Dart/dart-redstone"
+    - "TESTDIR=Dart/dart-start"
+    - "TESTDIR=Dart/dart-stream"
+    - "TESTDIR=Elixir/WeberFramework"
+    - "TESTDIR=Erlang/cowboy"
+    - "TESTDIR=Erlang/elli"
+    - "TESTDIR=Go/beego"
+    - "TESTDIR=Go/falcore"
+    - "TESTDIR=Go/gin"
+    - "TESTDIR=Go/go"
+    - "TESTDIR=Go/gorail"
+    - "TESTDIR=Go/revel"
+    - "TESTDIR=Go/revel-jet"
+    - "TESTDIR=Go/revel-qbs"
+    - "TESTDIR=Go/webgo"
+    - "TESTDIR=Groovy/grails"
+    - "TESTDIR=Haskell/snap"
+    - "TESTDIR=Haskell/wai"
+    - "TESTDIR=Haskell/yesod"
+    - "TESTDIR=Java/activeweb"
+    - "TESTDIR=Java/curacao"
+    - "TESTDIR=Java/dropwizard"
+    - "TESTDIR=Java/dropwizard-mongodb"
+    - "TESTDIR=Java/gemini"
+    - "TESTDIR=Java/grizzly-bm"
+    - "TESTDIR=Java/grizzly-jersey"
+    - "TESTDIR=Java/jetty-servlet"
+    - "TESTDIR=Java/netty"
+    - "TESTDIR=Java/ninja-standalone"
+    - "TESTDIR=Java/play1"
+    - "TESTDIR=Java/play1siena"
+    - "TESTDIR=Java/play2-java"
+    - "TESTDIR=Java/restexpress"
     - "TESTDIR=Java/servlet"
     - "TESTDIR=Java/servlet"
     - "TESTDIR=Java/servlet3-cass"
     - "TESTDIR=Java/servlet3-cass"
     - "TESTDIR=Java/spark"
     - "TESTDIR=Java/spark"
     - "TESTDIR=Java/sabina"
     - "TESTDIR=Java/sabina"
-    #- "TESTDIR=Java/spring"
-    #- "TESTDIR=Java/tapestry"
-    #- "TESTDIR=Java/undertow"
-    #- "TESTDIR=Java/undertow-edge"
-    #- "TESTDIR=Java/vertx"
-    #- "TESTDIR=Java/wicket"
-    #- "TESTDIR=Java/wildfly-ee7"
-    #- "TESTDIR=JavaScript/express"
-    #- "TESTDIR=JavaScript/hapi"
-    #- "TESTDIR=JavaScript/nodejs"
-    #- "TESTDIR=JavaScript/ringojs"
-    #- "TESTDIR=JavaScript/ringojs-convenient"
-    #- "TESTDIR=Lua/lapis"
-    #- "TESTDIR=Lua/openresty"
-    #- "TESTDIR=Nim/jester"
-    #- "TESTDIR=Nim/nawak"
-    #- "TESTDIR=Perl/dancer"
-    #- "TESTDIR=Perl/kelp"
-    #- "TESTDIR=Perl/mojolicious"
-    #- "TESTDIR=Perl/plack"
-    #- "TESTDIR=Perl/web-simple"
-    #- "TESTDIR=PHP/cakephp"
-    #- "TESTDIR=PHP/hhvm"
-    #- "TESTDIR=PHP/php"
-    #- "TESTDIR=PHP/codeigniter"
-    #- "TESTDIR=PHP/php-fatfree"
-    #- "TESTDIR=PHP/fuel"
-    #- "TESTDIR=PHP/kohana"
-    #- "TESTDIR=PHP/php-laravel"
-    #- "TESTDIR=PHP/lithium"
-    #- "TESTDIR=PHP/php-micromvc"
-    #- "TESTDIR=PHP/php-phalcon"
-    #- "TESTDIR=PHP/php-phalcon-micro"
-    #- "TESTDIR=PHP/php-phpixie"
-    #- "TESTDIR=PHP/php-pimf"
-    #- "TESTDIR=PHP/php-silex"
-    #- "TESTDIR=PHP/php-silex-orm"
-    #- "TESTDIR=PHP/php-silica"
-    #- "TESTDIR=PHP/php-slim"
-    #- "TESTDIR=PHP/symfony2"
-    #- "TESTDIR=PHP/symfony2-stripped"
-    #- "TESTDIR=PHP/php-yaf"
-    #- "TESTDIR=PHP/Yii2"
-    #- "TESTDIR=PHP/php-zend-framework"
-    #- "TESTDIR=PHP/php-zend-framework1"
-    #- "TESTDIR=PHP/phreeze"
-    #- "TESTDIR=Python/API-Hour"
-    #- "TESTDIR=Python/bottle"
-    #- "TESTDIR=Python/django"
-    #- "TESTDIR=Python/falcon"
-    #- "TESTDIR=Python/flask"
-    #- "TESTDIR=Python/pyramid"
-    #- "TESTDIR=Python/tornado"
-    #- "TESTDIR=Python/uwsgi"
-    #- "TESTDIR=Python/wsgi"
-    #- "TESTDIR=Racket/racket-ws"
-    #- "TESTDIR=Ruby/grape"
-    #- "TESTDIR=Ruby/ngx_mruby"
-    #- "TESTDIR=Ruby/padrino"
-    #- "TESTDIR=Ruby/rack"
-    #- "TESTDIR=Ruby/rails"
-    #- "TESTDIR=Ruby/rails-stripped"
-    #- "TESTDIR=Ruby/sinatra"
-    #- "TESTDIR=Scala/finagle"
-    #- "TESTDIR=Scala/lift-stateless"
-    #- "TESTDIR=Scala/plain"
-    #- "TESTDIR=Scala/play-activate-mysql"
-    #- "TESTDIR=Scala/play-scala-mongodb"
-    #- "TESTDIR=Scala/play2-scala"
-    #- "TESTDIR=Scala/scalatra"
-    #- "TESTDIR=Scala/scruffy"
-    #- "TESTDIR=Scala/spray"
-    #- "TESTDIR=Scala/unfiltered"
-    #- "TESTDIR=Ur/urweb"
+    - "TESTDIR=Java/spring"
+    - "TESTDIR=Java/tapestry"
+    - "TESTDIR=Java/undertow"
+    - "TESTDIR=Java/undertow-edge"
+    - "TESTDIR=Java/vertx"
+    - "TESTDIR=Java/wicket"
+    - "TESTDIR=Java/wildfly-ee7"
+    - "TESTDIR=JavaScript/express"
+    - "TESTDIR=JavaScript/hapi"
+    - "TESTDIR=JavaScript/nodejs"
+    - "TESTDIR=JavaScript/ringojs"
+    - "TESTDIR=JavaScript/ringojs-convenient"
+    - "TESTDIR=Lua/lapis"
+    - "TESTDIR=Lua/openresty"
+    - "TESTDIR=Nim/jester"
+    - "TESTDIR=Nim/nawak"
+    - "TESTDIR=Perl/dancer"
+    - "TESTDIR=Perl/kelp"
+    - "TESTDIR=Perl/mojolicious"
+    - "TESTDIR=Perl/plack"
+    - "TESTDIR=Perl/web-simple"
+    - "TESTDIR=PHP/cakephp"
+    - "TESTDIR=PHP/hhvm"
+    - "TESTDIR=PHP/php"
+    - "TESTDIR=PHP/codeigniter"
+    - "TESTDIR=PHP/php-fatfree"
+    - "TESTDIR=PHP/fuel"
+    - "TESTDIR=PHP/kohana"
+    - "TESTDIR=PHP/php-laravel"
+    - "TESTDIR=PHP/lithium"
+    - "TESTDIR=PHP/php-micromvc"
+    - "TESTDIR=PHP/php-phalcon"
+    - "TESTDIR=PHP/php-phalcon-micro"
+    - "TESTDIR=PHP/php-phpixie"
+    - "TESTDIR=PHP/php-pimf"
+    - "TESTDIR=PHP/php-silex"
+    - "TESTDIR=PHP/php-silex-orm"
+    - "TESTDIR=PHP/php-slim"
+    - "TESTDIR=PHP/symfony2"
+    - "TESTDIR=PHP/symfony2-stripped"
+    - "TESTDIR=PHP/php-yaf"
+    - "TESTDIR=PHP/Yii2"
+    - "TESTDIR=PHP/php-zend-framework"
+    - "TESTDIR=PHP/php-zend-framework1"
+    - "TESTDIR=PHP/phreeze"
+    - "TESTDIR=Python/API-Hour"
+    - "TESTDIR=Python/bottle"
+    - "TESTDIR=Python/django"
+    - "TESTDIR=Python/falcon"
+    - "TESTDIR=Python/flask"
+    - "TESTDIR=Python/pyramid"
+    - "TESTDIR=Python/tornado"
+    - "TESTDIR=Python/uwsgi"
+    - "TESTDIR=Python/wsgi"
+    - "TESTDIR=Racket/racket-ws"
+    - "TESTDIR=Ruby/grape"
+    - "TESTDIR=Ruby/ngx_mruby"
+    - "TESTDIR=Ruby/padrino"
+    - "TESTDIR=Ruby/rack"
+    - "TESTDIR=Ruby/rails"
+    - "TESTDIR=Ruby/rails-stripped"
+    - "TESTDIR=Ruby/sinatra"
+    - "TESTDIR=Scala/finagle"
+    - "TESTDIR=Scala/lift-stateless"
+    - "TESTDIR=Scala/plain"
+    - "TESTDIR=Scala/play-activate-mysql"
+    - "TESTDIR=Scala/play-scala-mongodb"
+    - "TESTDIR=Scala/play2-scala"
+    - "TESTDIR=Scala/scalatra"
+    - "TESTDIR=Scala/scruffy"
+    - "TESTDIR=Scala/spray"
+    - "TESTDIR=Scala/unfiltered"
+    - "TESTDIR=Ur/urweb"
 
 
 before_install:
 before_install:
   # Need to install python modules before using 
   # Need to install python modules before using 

+ 3 - 3
config/cassandra/cassandra.yaml

@@ -224,7 +224,7 @@ seed_provider:
       parameters:
       parameters:
           # seeds is actually a comma-delimited list of addresses.
           # seeds is actually a comma-delimited list of addresses.
           # Ex: "<ip1>,<ip2>,<ip3>"
           # Ex: "<ip1>,<ip2>,<ip3>"
-          - seeds: "TFB_DATABASE_HOST"
+          - seeds: "127.0.0.1"
 
 
 # For workloads with more data than can fit in memory, Cassandra's
 # For workloads with more data than can fit in memory, Cassandra's
 # bottleneck will be reads that need to fetch data from
 # bottleneck will be reads that need to fetch data from
@@ -294,7 +294,7 @@ ssl_storage_port: 7001
 # address associated with the hostname (it might not be).
 # address associated with the hostname (it might not be).
 #
 #
 # Setting this to 0.0.0.0 is always wrong.
 # Setting this to 0.0.0.0 is always wrong.
-listen_address: TFB_DATABASE_HOST
+listen_address: 127.0.0.1
 
 
 # Address to broadcast to other Cassandra nodes
 # Address to broadcast to other Cassandra nodes
 # Leaving this blank will set it to the same value as listen_address
 # Leaving this blank will set it to the same value as listen_address
@@ -332,7 +332,7 @@ start_rpc: true
 # Note that unlike ListenAddress above, it is allowed to specify 0.0.0.0
 # Note that unlike ListenAddress above, it is allowed to specify 0.0.0.0
 # here if you want to listen on all interfaces, but that will break clients 
 # here if you want to listen on all interfaces, but that will break clients 
 # that rely on node auto-discovery.
 # that rely on node auto-discovery.
-rpc_address: TFB_DATABASE_HOST
+rpc_address: 0.0.0.0
 # port for Thrift to listen for clients on
 # port for Thrift to listen for clients on
 rpc_port: 9160
 rpc_port: 9160
 
 

+ 2 - 2
deployment/vagrant-common/bootstrap.sh

@@ -75,8 +75,8 @@ if [ ! -e "~/.firstboot" ]; then
   echo $CLIENT_IP TFB-client   | sudo tee --append /etc/hosts
   echo $CLIENT_IP TFB-client   | sudo tee --append /etc/hosts
   echo $SERVER_IP TFB-server   | sudo tee --append /etc/hosts
   echo $SERVER_IP TFB-server   | sudo tee --append /etc/hosts
 
 
-  # Add other users:
-  sudo useradd -m testrunner
+  # Add user to run tests
+  sudo adduser --disabled-password --gecos "" testrunner
   # WARN: testrunner will NOT have sudo access by round 11
   # WARN: testrunner will NOT have sudo access by round 11
   #       please begin migrating scripts to not rely on sudo.
   #       please begin migrating scripts to not rely on sudo.
   sudo bash -c "echo 'testrunner ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/90-tfb-testrunner"
   sudo bash -c "echo 'testrunner ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/90-tfb-testrunner"

+ 4 - 0
frameworks/C++/ULib/install.sh

@@ -16,6 +16,10 @@
 #    . $FWROOT/ULib/install.sh (cwd=$FWROOT//installs)
 #    . $FWROOT/ULib/install.sh (cwd=$FWROOT//installs)
 # --------------------------------------------------------------------------------------------------------
 # --------------------------------------------------------------------------------------------------------
 
 
+ULIB_VERSION=1.4.2
+ULIB_ROOT=$IROOT/ULib
+ULIB_DOCUMENT_ROOT=${ULIB_ROOT}/ULIB_DOCUMENT_ROOT
+
 # Check if ULib is already installed
 # Check if ULib is already installed
 ULIB_INSTALLED_FILE="${IROOT}/ULib-${ULIB_VERSION}.installed"
 ULIB_INSTALLED_FILE="${IROOT}/ULib-${ULIB_VERSION}.installed"
 RETCODE=$(fw_exists ${ULIB_INSTALLED_FILE})
 RETCODE=$(fw_exists ${ULIB_INSTALLED_FILE})

+ 2 - 2
frameworks/C++/ULib/setup_mysql.sh

@@ -5,7 +5,7 @@ export ORM_DRIVER="mysql"
 export ORM_OPTION="host=${DBHOST} user=benchmarkdbuser password=benchmarkdbpass character-set=utf8 dbname=hello_world"
 export ORM_OPTION="host=${DBHOST} user=benchmarkdbuser password=benchmarkdbpass character-set=utf8 dbname=hello_world"
 
 
 # 1. Change ULib Server configuration
 # 1. Change ULib Server configuration
-sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g" $ULIB_ROOT/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g" $IROOT/ULib/benchmark.cfg
 
 
 # 2. Start ULib Server (userver_tcp)
 # 2. Start ULib Server (userver_tcp)
-$ULIB_ROOT/bin/userver_tcp -c $ULIB_ROOT/benchmark.cfg &
+$IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg &

+ 2 - 2
frameworks/C++/ULib/setup_postgres.sh

@@ -5,7 +5,7 @@ export ORM_DRIVER="pgsql"
 export ORM_OPTION="host=${DBHOST} user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world client_encoding=UTF8"
 export ORM_OPTION="host=${DBHOST} user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world client_encoding=UTF8"
 
 
 # 1. Change ULib Server configuration
 # 1. Change ULib Server configuration
-sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g" $ULIB_ROOT/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g" $IROOT/ULib/benchmark.cfg
 
 
 # 2. Start ULib Server (userver_tcp)
 # 2. Start ULib Server (userver_tcp)
-$ULIB_ROOT/bin/userver_tcp -c $ULIB_ROOT/benchmark.cfg &
+$IROOT/ULib/bin/userver_tcp -c $IROOT/ULib/benchmark.cfg &

+ 2 - 2
frameworks/C++/ULib/setup_sqlite.sh

@@ -5,7 +5,7 @@ export ORM_DRIVER="sqlite"
 export ORM_OPTION="host=${DBHOST} user=benchmarkdbuser password=benchmarkdbpass character-set=utf8 dbname=${ULIB_ROOT}/db/%.*s"
 export ORM_OPTION="host=${DBHOST} user=benchmarkdbuser password=benchmarkdbpass character-set=utf8 dbname=${ULIB_ROOT}/db/%.*s"
 
 
 # 1. Change ULib Server configuration
 # 1. Change ULib Server configuration
-sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g" $ULIB_ROOT/benchmark.cfg
+sed -i "s|PREFORK_CHILD .*|PREFORK_CHILD ${MAX_THREADS}|g" ${IROOT}/ULib/benchmark.cfg
 
 
 # 2. Start ULib Server (userver_tcp)
 # 2. Start ULib Server (userver_tcp)
-$ULIB_ROOT/bin/userver_tcp -c $ULIB_ROOT/benchmark.cfg &
+${IROOT}/ULib/bin/userver_tcp -c ${IROOT}/ULib/benchmark.cfg &

+ 0 - 1
frameworks/C++/ULib/src/json.usp

@@ -43,5 +43,4 @@ const char* hello_str = json_object_to_json_string(hello);
 USP_PUTS_STRING(hello_str);
 USP_PUTS_STRING(hello_str);
 json_object_put(hello);
 json_object_put(hello);
 #endif
 #endif
-U_ClientImage_request_nocache = true;
 -->
 -->

+ 19 - 4
frameworks/C/lwan/benchmark_config

@@ -1,13 +1,30 @@
 {
 {
   "framework": "lwan",
   "framework": "lwan",
   "tests": [{
   "tests": [{
+    "default": {
+      "setup_file": "setup",
+      "plaintext_url": "/plaintext",
+      "json_url": "/json",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "None",
+      "framework": "lwan",
+      "language": "C",
+      "orm": "Raw",
+      "platform": "Lwan",
+      "webserver": "Lwan",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "Lwan",
+      "notes": "",
+      "versus": ""
+    },
     "sqlite": {
     "sqlite": {
       "setup_file": "setup",
       "setup_file": "setup",
       "db_url": "/db",
       "db_url": "/db",
       "query_url": "/queries?queries=",
       "query_url": "/queries?queries=",
       "fortune_url": "/fortunes",
       "fortune_url": "/fortunes",
-      "plaintext_url": "/plaintext",
-      "json_url": "/json",
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Platform",
       "classification": "Platform",
@@ -28,8 +45,6 @@
       "db_url": "/db",
       "db_url": "/db",
       "query_url": "/queries?queries=",
       "query_url": "/queries?queries=",
       "fortune_url": "/fortunes",
       "fortune_url": "/fortunes",
-      "plaintext_url": "/plaintext",
-      "json_url": "/json",
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Platform",
       "classification": "Platform",

+ 1 - 1
frameworks/C/lwan/install.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 #!/bin/bash
 
 
-REV='eb96604657dd940ecb70b56fef4279077e3f9c21'
+REV='8ae98d2b6e146948a7ed13e76141e0f69228d690'
 
 
 INSTALLED_FILE="${IROOT}/lwan-${REV}.installed"
 INSTALLED_FILE="${IROOT}/lwan-${REV}.installed"
 RETCODE=$(fw_exists ${INSTALLED_FILE})
 RETCODE=$(fw_exists ${INSTALLED_FILE})

+ 2 - 2
frameworks/Java/servlet/pom.xml

@@ -18,9 +18,9 @@
         </dependency>
         </dependency>
 
 
 	<dependency>
 	<dependency>
-	    <groupId>postgresql</groupId>
+	    <groupId>org.postgresql</groupId>
 	    <artifactId>postgresql</artifactId>
 	    <artifactId>postgresql</artifactId>
-	    <version>9.1-901.jdbc4</version>
+	    <version>9.3-1102-jdbc41</version>
 	</dependency>
 	</dependency>
             
             
 
 

+ 22 - 0
frameworks/Java/spring/src/main/java/com/techempower/spring/Common.java

@@ -0,0 +1,22 @@
+package com.techempower.spring;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * User: Denis Baranov
+ * Date: 2/18/15
+ */
+public class Common {
+
+    private static final int cpuCount = Runtime.getRuntime().availableProcessors();
+
+    // todo: parameterize multipliers
+    public static ExecutorService EXECUTOR = new ThreadPoolExecutor(
+        cpuCount * 2, cpuCount * 25, 200, TimeUnit.MILLISECONDS,
+        new LinkedBlockingQueue<Runnable>(cpuCount * 100),
+        new ThreadPoolExecutor.CallerRunsPolicy());
+
+}

+ 50 - 18
frameworks/Java/spring/src/main/java/com/techempower/spring/web/WorldDatabaseController.java

@@ -3,9 +3,15 @@ package com.techempower.spring.web;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Random;
 import java.util.Random;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.ThreadLocalRandom;
 
 
+import com.techempower.spring.Common;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
@@ -28,43 +34,70 @@ final class WorldDatabaseController {
 	}
 	}
 
 
 	@RequestMapping(value = "/queries", produces = "application/json")
 	@RequestMapping(value = "/queries", produces = "application/json")
+	@Transactional(readOnly = true)
 	List<World> multipleQueries(@RequestParam(value="queries", required=false, defaultValue="1") String rawQueryCount) {
 	List<World> multipleQueries(@RequestParam(value="queries", required=false, defaultValue="1") String rawQueryCount) {
 		Integer queryCount = boundQueryCount(rawQueryCount);
 		Integer queryCount = boundQueryCount(rawQueryCount);
 
 
-		List<World> worlds = new ArrayList<World>(queryCount);
-		Random random = ThreadLocalRandom.current();
-
+		List<Future<World>> wfs = new ArrayList<>(queryCount);
+		// it gets better with Java 8, promise!
 		for (int i = 0; i < queryCount; i++) {
 		for (int i = 0; i < queryCount; i++) {
-			worlds.add(this.worldRepository.findOne(random.nextInt(DB_ROWS) + 1));
+			wfs.add(
+				Common.EXECUTOR.submit(
+					new Callable<World>() {
+						@Override
+						public World call() throws Exception {
+							return worldRepository.findOne(
+								ThreadLocalRandom.current().nextInt(DB_ROWS) + 1);
+						}
+					}));
 		}
 		}
 
 
-		return worlds;
+		return waitFor(wfs);
 	}
 	}
 
 
 	@RequestMapping(value = "/updates", produces = "application/json")
 	@RequestMapping(value = "/updates", produces = "application/json")
 	List<World> updateQueries(@RequestParam(value="queries", required=false, defaultValue="1") String rawQueryCount) {
 	List<World> updateQueries(@RequestParam(value="queries", required=false, defaultValue="1") String rawQueryCount) {
 		Integer queryCount = boundQueryCount(rawQueryCount);
 		Integer queryCount = boundQueryCount(rawQueryCount);
 
 
-		List<World> worlds = new ArrayList<World>(queryCount);
-		Random random = ThreadLocalRandom.current();
+		List<Future<World>> wfs = new ArrayList<>(queryCount);
 
 
 		for (int i = 0; i < queryCount; i++) {
 		for (int i = 0; i < queryCount; i++) {
-			World world = this.worldRepository.findOne(random.nextInt(DB_ROWS) + 1);
-			world.setRandomNumber(random.nextInt(DB_ROWS) + 1);
-			this.worldRepository.save(world);
-			worlds.add(world);
+			wfs.add(Common.EXECUTOR.submit(
+				new Callable<World>() {
+					@Override
+					@Transactional(propagation = Propagation.REQUIRES_NEW)
+					public World call() throws Exception {
+						Random random = ThreadLocalRandom.current();
+						World world = worldRepository.findOne(random.nextInt(DB_ROWS) + 1);
+						world.setRandomNumber(random.nextInt(DB_ROWS) + 1);
+						worldRepository.save(world);
+						return world;
+					}
+				}));
 		}
 		}
 
 
+		return waitFor(wfs);
+	}
+
+	private List<World> waitFor(List<Future<World>> wfs) {
+		List<World> worlds = new ArrayList<>(wfs.size());
+		for (Future<World> wf: wfs) {
+			try {
+				worlds.add(wf.get());
+			} catch (InterruptedException | ExecutionException e) {
+				throw new RuntimeException(e);
+			}
+		}
 		return worlds;
 		return worlds;
 	}
 	}
 
 
 	private Integer boundQueryCount(final String rawString) {
 	private Integer boundQueryCount(final String rawString) {
-                Integer raw;
-                try {
-                       raw = Integer.parseInt(rawString);
-                } catch (NumberFormatException e) {
-                       raw = null;
-                } 
+		Integer raw;
+		try {
+			raw = Integer.parseInt(rawString);
+		} catch (NumberFormatException e) {
+			raw = null;
+		}
 		if (raw == null || raw < 1) {
 		if (raw == null || raw < 1) {
 			return 1;
 			return 1;
 		} else if (raw > 500) {
 		} else if (raw > 500) {
@@ -73,5 +106,4 @@ final class WorldDatabaseController {
 
 
 		return raw;
 		return raw;
 	}
 	}
-
 }
 }

+ 4 - 4
frameworks/Java/undertow-edge/pom.xml

@@ -43,10 +43,10 @@
             <version>5.1.25</version>
             <version>5.1.25</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
-            <groupId>postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>9.0-801.jdbc4</version>
-        </dependency>
+            <groupId>org.postgresql</groupId>
+	    <artifactId>postgresql</artifactId>
+            <version>9.3-1102-jdbc41</version>
+	</dependency>
         <dependency>
         <dependency>
             <groupId>org.mongodb</groupId>
             <groupId>org.mongodb</groupId>
             <artifactId>mongo-java-driver</artifactId>
             <artifactId>mongo-java-driver</artifactId>

+ 4 - 4
frameworks/Java/undertow/pom.xml

@@ -34,10 +34,10 @@
             <version>5.1.30</version>
             <version>5.1.30</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
-            <groupId>postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <version>9.1-901-1.jdbc4</version>
-        </dependency>
+            <groupId>org.postgresql</groupId>
+	    <artifactId>postgresql</artifactId>
+            <version>9.3-1102-jdbc41</version>
+	</dependency>
         <dependency>
         <dependency>
             <groupId>org.mongodb</groupId>
             <groupId>org.mongodb</groupId>
             <artifactId>mongo-java-driver</artifactId>
             <artifactId>mongo-java-driver</artifactId>

+ 0 - 9
frameworks/PHP/php-silica/.gitignore

@@ -1,9 +0,0 @@
-/app/cache
-/app/logs
-/bin
-/vendors
-/build
-/dist
-.DS_Store
-/tags
-.idea

+ 0 - 36
frameworks/PHP/php-silica/README.md

@@ -1,36 +0,0 @@
-# Silica Benchmarking Test
-
-This is the Silica PHP portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
-
-### JSON Encoding Test
-Uses the PHP standard [JSON encoder](http://www.php.net/manual/en/function.json-encode.php).
-
-* [JSON test controller](web/index.php)
-
-
-### Data-Store/Database Mapping Test
-Uses the Doctrine DBAL functionality.
-
-* [DB test controller](web/index.php)
-
-
-## Infrastructure Software Versions
-The tests were run with:
-
-* [Silica dev-master](https://github.com/changloong/Silica)
-* [PHP Version 5.5.17](http://www.php.net/) with FPM and APC
-* [nginx 1.4.0](http://nginx.org/)
-* [MySQL 5.5.29](https://dev.mysql.com/)
-
-## Test URLs
-### JSON Encoding Test
-
-http://localhost/json
-
-### Data-Store/Database Mapping Test
-
-http://localhost/db
-
-### Variable Query Test
-    
-http://localhost/db?queries=2

+ 0 - 9
frameworks/PHP/php-silica/bash_profile.sh

@@ -1,9 +0,0 @@
-#!/bin/bash
-
-export PHP_HOME=${IROOT}/php-5.5.17
-
-export PHP_FPM=$PHP_HOME/sbin/php-fpm
-
-export COMPOSER_HOME=${IROOT}/php-composer
-
-export NGINX_HOME=${IROOT}/nginx

+ 0 - 24
frameworks/PHP/php-silica/benchmark_config

@@ -1,24 +0,0 @@
-{
-  "framework": "silica",
-  "tests": [{
-    "raw": {
-      "setup_file": "setup",
-      "db_url": "/db",
-      "query_url": "/db?queries=",
-      "port": 8080,
-      "approach": "Realistic",
-      "classification": "Micro",
-      "database": "MySQL",
-      "framework": "silica",
-      "language": "PHP",
-      "orm": "Raw",
-      "platform": "PHP-FPM",
-      "webserver": "nginx",
-      "os": "Linux",
-      "database_os": "Linux",
-      "display_name": "silica",
-      "notes": "",
-      "versus": "php"
-    }
-  }]
-}

+ 0 - 6
frameworks/PHP/php-silica/composer.json

@@ -1,6 +0,0 @@
-{
-    "require": {
-        "silica/silica": "dev-master"
-    }
-}
-

+ 0 - 136
frameworks/PHP/php-silica/deploy/nginx.conf

@@ -1,136 +0,0 @@
-#user  nobody;
-worker_processes  8;
-
-#error_log  logs/error.log;
-#error_log  logs/error.log  notice;
-#error_log  logs/error.log  info;
-error_log stderr error;
-
-#pid        logs/nginx.pid;
-
-
-events {
-    worker_connections  1024;
-}
-
-
-http {
-    include       /usr/local/nginx/conf/mime.types;
-    default_type  application/octet-stream;
-
-    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
-    #                  '$status $body_bytes_sent "$http_referer" '
-    #                  '"$http_user_agent" "$http_x_forwarded_for"';
-
-    #access_log  logs/access.log  main;
-    access_log off;
-
-    sendfile        on;
-    #tcp_nopush     on;
-
-    #keepalive_timeout  0;
-    keepalive_timeout  65;
-
-    #gzip  on;
-
-    upstream fastcgi_backend {
-        server 127.0.0.1:9001;
-        keepalive 32;
-    }
-
-    server {
-        listen       8080;
-        server_name  localhost;
-
-        #charset koi8-r;
-
-        #access_log  logs/host.access.log  main;
-
-        #location / {
-        #    root   html;
-        #    index  index.html index.htm;
-        #}
-
-        #error_page  404              /404.html;
-
-        # redirect server error pages to the static page /50x.html
-        #
-        #error_page   500 502 503 504  /50x.html;
-        #location = /50x.html {
-        #    root   html;
-        #}
-
-        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
-        #
-        #location ~ \.php$ {
-        #    proxy_pass   http://127.0.0.1;
-        #}
-
-        root /home/ubuntu/FrameworkBenchmarks/php-silica/web/;
-        index  index.php;
-
-        location / {
-            try_files $uri @rewriteapp;
-        }
-		
-        location @rewriteapp {
-                rewrite ^(.*)$ /app.php/$1 last;
-        }
-
-        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
-        #
-        location ~ \.php$ {
-            fastcgi_pass   fastcgi_backend;
-            fastcgi_keep_conn on;
-            fastcgi_index  index.php;
-#            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
-            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
-            include        /usr/local/nginx/conf/fastcgi_params;
-        }
-
-        # deny access to .htaccess files, if Apache's document root
-        # concurs with nginx's one
-        #
-        #location ~ /\.ht {
-        #    deny  all;
-        #}
-    }
-
-
-    # another virtual host using mix of IP-, name-, and port-based configuration
-    #
-    #server {
-    #    listen       8000;
-    #    listen       somename:8080;
-    #    server_name  somename  alias  another.alias;
-
-    #    location / {
-    #        root   html;
-    #        index  index.html index.htm;
-    #    }
-    #}
-
-
-    # HTTPS server
-    #
-    #server {
-    #    listen       443;
-    #    server_name  localhost;
-
-    #    ssl                  on;
-    #    ssl_certificate      cert.pem;
-    #    ssl_certificate_key  cert.key;
-
-    #    ssl_session_timeout  5m;
-
-    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
-    #    ssl_ciphers  HIGH:!aNULL:!MD5;
-    #    ssl_prefer_server_ciphers   on;
-
-    #    location / {
-    #        root   html;
-    #        index  index.html index.htm;
-    #    }
-    #}
-
-}

+ 0 - 9
frameworks/PHP/php-silica/deploy/php-silica

@@ -1,9 +0,0 @@
-<VirtualHost *:8080>
-  Alias /php-silex/ "/home/ubuntu/FrameworkBenchmarks/php-silica/web/"
-  <Directory /home/ubuntu/FrameworkBenchmarks/php-silica/web/>
-          Options Indexes FollowSymLinks MultiViews
-          #AllowOverride None
-          Order allow,deny
-          allow from all
-  </Directory>
-</VirtualHost>

+ 0 - 3
frameworks/PHP/php-silica/install.sh

@@ -1,3 +0,0 @@
-#!/bin/bash
-
-fw_depends php composer nginx

+ 0 - 13
frameworks/PHP/php-silica/setup.sh

@@ -1,13 +0,0 @@
-#!/bin/bash
-
-sed -i 's|192.168.100.102|'"${DBHOST}"'|g' web/app.php
-sed -i 's|"./FrameworkBenchmarks/php-silica|"'"${TROOT}"'|g' deploy/php-silica
-sed -i 's|Directory .*/FrameworkBenchmarks/php-silica|Directory '"${TROOT}"'|g' deploy/php-silica
-sed -i 's|root .*/FrameworkBenchmarks/php-silica|root '"${TROOT}"'|g' deploy/nginx.conf
-sed -i 's|/usr/local/nginx/|'"${IROOT}"'/nginx/|g' deploy/nginx.conf
-
-export PATH="$COMPOSER_HOME:$PHP_HOME/bin:$PHP_HOME/sbin:$PATH"
-
-composer.phar install
-$PHP_FPM --fpm-config $FWROOT/config/php-fpm.conf -g $TROOT/deploy/php-fpm.pid
-$NGINX_HOME/sbin/nginx -c $TROOT/deploy/nginx.conf

+ 0 - 4
frameworks/PHP/php-silica/source_code

@@ -1,4 +0,0 @@
-./php-silica/web
-./php-silica/web/.htaccess
-./php-silica/web/app.php
-./php-silica/deploy/php-silica

+ 0 - 8
frameworks/PHP/php-silica/web/.htaccess

@@ -1,8 +0,0 @@
-# /web/.htaccess
-<IfModule mod_rewrite.c>
-    Options -MultiViews
-
-    RewriteEngine On
-    RewriteCond %{REQUEST_FILENAME} !-f
-    RewriteRule ^ index.php [L]
-</IfModule>

+ 0 - 51
frameworks/PHP/php-silica/web/app.php

@@ -1,51 +0,0 @@
-<?php
-
-error_reporting(-1);
-
-require_once __DIR__ . '/../vendor/silica/silica/src/Silica/Application.php' ;
-
-$app = new Silica\Application();
-
-$app
-->share('pdo', function($app) {
-    $pdo    = new PDO('mysql::host=192.168.100.102;dbname=hello_world', 'benchmarkdbuser', 'benchmarkdbpass', array(
-				PDO::ATTR_PERSISTENT => true ,
-           ) ) ;
-    return $pdo ;
-})
->get('/json', function() {
-	echo json_encode(array("message" => "Hello World!"));
-}) 
->get('/db', function() use ($app) {
-	
-	$query_count = 1;
-	if (TRUE === isset($_GET['queries'])) {
-	  $query_count = $_GET['queries'];
-	}
-
-	// Create an array with the response string.
-	$arr = array();
-	$id = mt_rand(1, 10000);
-
-	// Define query
-	$statement = $app['pdo']->prepare('SELECT randomNumber FROM World WHERE id = :id');
-	$statement->bindParam(':id', $id, PDO::PARAM_INT);
-
-	// For each query, store the result set values in the response array
-	while (0 < $query_count--) {
-	  $statement->execute();
-  
-	  // Store result in array.
-	  $arr[] = array('id' => $id, 'randomNumber' => $statement->fetchColumn());
-	  $id = mt_rand(1, 10000);
-	}
-
-	// Use the PHP standard JSON encoder.
-	// http://www.php.net/manual/en/function.json-encode.php
-	echo json_encode($arr);
-})
->run() ;
-
-
-
-

+ 4 - 1
frameworks/PHP/php-slim/index.php

@@ -12,7 +12,10 @@ require 'Slim/RedBean/rb.php';
 
 
 \Slim\Slim::registerAutoloader();
 \Slim\Slim::registerAutoloader();
 
 
-R::setup('mysql:host=localhost;dbname=hello_world','benchmarkdbuser','benchmarkdbpass');
+# Turn off 'beautiful' column names (converting tables names from camelCase to snake_case).
+RedBean_OODBBean::setFlagBeautifulColumnNames(false); 
+
+R::setup('mysql:host=127.0.0.1;dbname=hello_world','benchmarkdbuser','benchmarkdbpass');
 R::freeze(true);
 R::freeze(true);
 
 
 /**
 /**

+ 17 - 7
frameworks/Perl/mojolicious/cpanfile.snapshot

@@ -8,6 +8,14 @@ DISTRIBUTIONS
     requirements:
     requirements:
       ExtUtils::MakeMaker 0
       ExtUtils::MakeMaker 0
       common::sense 0
       common::sense 0
+  IO-Socket-IP-0.36
+    pathname: P/PE/PEVANS/IO-Socket-IP-0.36.tar.gz
+    provides:
+      IO::Socket::IP 0.36
+    requirements:
+      IO::Socket 0
+      Socket 1.97
+      Test::More 0.88
   JSON-XS-3.01
   JSON-XS-3.01
     pathname: M/ML/MLEHMANN/JSON-XS-3.01.tar.gz
     pathname: M/ML/MLEHMANN/JSON-XS-3.01.tar.gz
     provides:
     provides:
@@ -16,10 +24,10 @@ DISTRIBUTIONS
       ExtUtils::MakeMaker 0
       ExtUtils::MakeMaker 0
       Types::Serialiser 0
       Types::Serialiser 0
       common::sense 0
       common::sense 0
-  Mango-1.14
-    pathname: S/SR/SRI/Mango-1.14.tar.gz
+  Mango-1.16
+    pathname: O/OD/ODC/Mango-1.16.tar.gz
     provides:
     provides:
-      Mango 1.14
+      Mango 1.16
       Mango::BSON undef
       Mango::BSON undef
       Mango::BSON::Binary undef
       Mango::BSON::Binary undef
       Mango::BSON::Code undef
       Mango::BSON::Code undef
@@ -41,8 +49,9 @@ DISTRIBUTIONS
     requirements:
     requirements:
       ExtUtils::MakeMaker 0
       ExtUtils::MakeMaker 0
       Mojolicious 5.40
       Mojolicious 5.40
-  Mojolicious-5.65
-    pathname: S/SR/SRI/Mojolicious-5.65.tar.gz
+      perl 5.010001
+  Mojolicious-5.81
+    pathname: S/SR/SRI/Mojolicious-5.81.tar.gz
     provides:
     provides:
       Mojo undef
       Mojo undef
       Mojo::Asset undef
       Mojo::Asset undef
@@ -105,7 +114,7 @@ DISTRIBUTIONS
       Mojo::UserAgent::Server undef
       Mojo::UserAgent::Server undef
       Mojo::UserAgent::Transactor undef
       Mojo::UserAgent::Transactor undef
       Mojo::Util undef
       Mojo::Util undef
-      Mojolicious 5.65
+      Mojolicious 5.81
       Mojolicious::Command undef
       Mojolicious::Command undef
       Mojolicious::Command::cgi undef
       Mojolicious::Command::cgi undef
       Mojolicious::Command::cpanify undef
       Mojolicious::Command::cpanify undef
@@ -115,7 +124,7 @@ DISTRIBUTIONS
       Mojolicious::Command::generate::app undef
       Mojolicious::Command::generate::app undef
       Mojolicious::Command::generate::lite_app undef
       Mojolicious::Command::generate::lite_app undef
       Mojolicious::Command::generate::makefile undef
       Mojolicious::Command::generate::makefile undef
-      Mojolicious::Command::generate::plugin 0.01
+      Mojolicious::Command::generate::plugin undef
       Mojolicious::Command::get undef
       Mojolicious::Command::get undef
       Mojolicious::Command::inflate undef
       Mojolicious::Command::inflate undef
       Mojolicious::Command::prefork undef
       Mojolicious::Command::prefork undef
@@ -156,6 +165,7 @@ DISTRIBUTIONS
       IO::Socket::IP 0.26
       IO::Socket::IP 0.26
       Pod::Simple 3.09
       Pod::Simple 3.09
       Time::Local 1.2
       Time::Local 1.2
+      perl 5.010001
   Types-Serialiser-1.0
   Types-Serialiser-1.0
     pathname: M/ML/MLEHMANN/Types-Serialiser-1.0.tar.gz
     pathname: M/ML/MLEHMANN/Types-Serialiser-1.0.tar.gz
     provides:
     provides:

+ 1 - 1
frameworks/Python/API-Hour/requirements.txt

@@ -1,4 +1,4 @@
-api_hour==0.6.0
+api_hour==0.6.1
 aiopg==0.5.2
 aiopg==0.5.2
 gunicorn==19.1.1
 gunicorn==19.1.1
 psycopg2==2.5.4
 psycopg2==2.5.4

+ 31 - 17
toolset/run-ci.py

@@ -415,34 +415,48 @@ class CIRunnner:
 
 
     # Setup Apache Cassandra
     # Setup Apache Cassandra
     echo "Populating Apache Cassandra database"
     echo "Populating Apache Cassandra database"
-    until nc -z localhost 9160 ; do echo Waiting for Cassandra; sleep 1; done
-    cat config/cassandra/cleanup-keyspace.cql | sudo cqlsh
-    python config/cassandra/db-data-gen.py > config/cassandra/tfb-data.cql
-    sudo cqlsh -f config/cassandra/create-keyspace.cql
-    sudo cqlsh -f config/cassandra/tfb-data.cql
+    for i in {1..45}; do
+      nc -z localhost 9160 && break || sleep 1;
+      echo "Waiting for Cassandra ($i/45}"
+    done
+    nc -z localhost 9160
+    if [ $? -eq 0 ]; then
+      cat config/cassandra/cleanup-keyspace.cql | sudo cqlsh
+      python config/cassandra/db-data-gen.py > config/cassandra/tfb-data.cql
+      sudo cqlsh -f config/cassandra/create-keyspace.cql
+      sudo cqlsh -f config/cassandra/tfb-data.cql
+    else
+      >&2 echo "Cassandra did not start, skipping"
+    fi
 
 
     # Setup MongoDB
     # Setup MongoDB
     echo "Populating MongoDB database"
     echo "Populating MongoDB database"
-    until nc -z localhost 27017 ; do echo Waiting for MongoDB; sleep 1; done
-    mongod --version
-    mongo < config/create.js
-
+    for i in {1..45}; do
+      nc -z localhost 27017 && break || sleep 1;
+      echo "Waiting for MongoDB ($i/45}"
+    done
+    nc -z localhost 27017
+    if [ $? -eq 0 ]; then
+      mongo < create.js
+      mongod --version
+    else
+      >&2 echo "MongoDB did not start, skipping"
+    fi
+    
     # =============Modify Configurations===========================
     # =============Modify Configurations===========================
     # It can be useful to enable debug features for verification 
     # It can be useful to enable debug features for verification 
     # inside Travis-CI
     # inside Travis-CI
     # =======================================================
     # =======================================================
 
 
     sed -i 's|display_errors\] = off|display_errors\] = on|' config/php-fpm.conf
     sed -i 's|display_errors\] = off|display_errors\] = on|' config/php-fpm.conf
+    
+    exit $?
     '''
     '''
 
 
-    def sh(command):
-      log.info("Running `%s`", command)
-      subprocess.check_call(command, shell=True)  
-
-    for command in script.split('\n'):
-      command = command.lstrip()
-      if command != "" and command[0] != '#':
-        sh(command.lstrip())
+    p = subprocess.Popen(["bash"], stdin=subprocess.PIPE)
+    p.communicate(script)
+    if p.wait() != 0:
+      log.critical("Non-zero exit  from running+wait on subprocess")
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
   args = sys.argv[1:]
   args = sys.argv[1:]

+ 3 - 1
toolset/setup/linux/client.sh

@@ -8,8 +8,10 @@ export DEBIAN_FRONTEND=noninteractive
 ##############################
 ##############################
 # Prerequisites
 # Prerequisites
 ##############################
 ##############################
+sudo apt-get -y update
+
 # WARNING: DONT PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
 # WARNING: DONT PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
-# Dpkg::Options avoid hangs on Travis-CI, don't affect clean systems
+# Dpkg::Options avoid hangs on Travis-CI, doesn't affect clean systems
 sudo apt-get -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
 sudo apt-get -y install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
     build-essential git libev-dev libpq-dev libreadline6-dev
     build-essential git libev-dev libpq-dev libreadline6-dev
 
 

+ 26 - 17
toolset/setup/linux/database.sh

@@ -21,8 +21,6 @@
 # concentrated effort to address these cases, but PR's for specific 
 # concentrated effort to address these cases, but PR's for specific 
 # problems are welcome
 # problems are welcome
 
 
-export DB_HOST={database_host}
-
 set -x
 set -x
 export DEBIAN_FRONTEND=noninteractive
 export DEBIAN_FRONTEND=noninteractive
 
 
@@ -143,10 +141,18 @@ sudo cp -R -p /var/lib/mongodb /ssd/
 sudo cp -R -p /var/log/mongodb /ssd/log/
 sudo cp -R -p /var/log/mongodb /ssd/log/
 sudo service mongod start
 sudo service mongod start
 
 
-until nc -z localhost 27017 ; do echo Waiting for MongoDB; sleep 1; done
-mongo < create.js
-rm create.js
-mongod --version
+for i in {1..45}; do
+  nc -z localhost 27017 && break || sleep 1;
+  echo "Waiting for MongoDB ($i/45}"
+done
+nc -z localhost 27017
+if [ $? -eq 0 ]; then
+  mongo < create.js
+  rm create.js
+  mongod --version
+else
+  >&2 echo "MongoDB did not start, skipping"
+fi
 
 
 ##############################
 ##############################
 # Apache Cassandra
 # Apache Cassandra
@@ -159,21 +165,24 @@ tar xzf apache-cassandra-$CASS_V-bin.tar.gz
 
 
 rm -rf /ssd/cassandra /ssd/log/cassandra
 rm -rf /ssd/cassandra /ssd/log/cassandra
 mkdir -p /ssd/cassandra /ssd/log/cassandra
 mkdir -p /ssd/cassandra /ssd/log/cassandra
-
-sed -i "s/^.*seeds:.*/          - seeds: \"$DB_HOST\"/" cassandra/cassandra.yaml
-sed -i "s/^listen_address:.*/listen_address: $DB_HOST/" cassandra/cassandra.yaml
-sed -i "s/^rpc_address:.*/rpc_address: $DB_HOST/" cassandra/cassandra.yaml
-
 mv cassandra/cassandra.yaml apache-cassandra-$CASS_V/conf
 mv cassandra/cassandra.yaml apache-cassandra-$CASS_V/conf
 mv cassandra/log4j-server.properties apache-cassandra-$CASS_V/conf
 mv cassandra/log4j-server.properties apache-cassandra-$CASS_V/conf
 nohup apache-cassandra-$CASS_V/bin/cassandra -p c.pid > cassandra.log
 nohup apache-cassandra-$CASS_V/bin/cassandra -p c.pid > cassandra.log
 
 
-until nc -z $DB_HOST 9160 ; do echo Waiting for Cassandra; sleep 1; done
-cat cassandra/cleanup-keyspace.cql | apache-cassandra-$CASS_V/bin/cqlsh $DB_HOST
-python cassandra/db-data-gen.py > cassandra/tfb-data.cql
-apache-cassandra-$CASS_V/bin/cqlsh -f cassandra/create-keyspace.cql $DB_HOST
-apache-cassandra-$CASS_V/bin/cqlsh -f cassandra/tfb-data.cql $DB_HOST
-rm -rf apache-cassandra-*-bin.tar.gz cassandra
+for i in {1..45}; do
+  nc -z localhost 9160 && break || sleep 1;
+  echo "Waiting for Cassandra ($i/45}"
+done
+nc -z localhost 9160
+if [ $? -eq 0 ]; then
+  cat cassandra/cleanup-keyspace.cql | apache-cassandra-$CASS_V/bin/cqlsh 127.0.0.1
+  python cassandra/db-data-gen.py > cassandra/tfb-data.cql
+  apache-cassandra-$CASS_V/bin/cqlsh -f cassandra/create-keyspace.cql 127.0.0.1
+  apache-cassandra-$CASS_V/bin/cqlsh -f cassandra/tfb-data.cql 127.0.0.1
+  rm -rf apache-cassandra-*-bin.tar.gz cassandra
+else
+  >&2 echo "Cassandra did not start, skipping"
+fi
 
 
 ##############################
 ##############################
 # Redis
 # Redis

+ 3 - 2
toolset/setup/linux/installer.py

@@ -26,9 +26,10 @@ class Installer:
       print("\nINSTALL: Installing database software\n")   
       print("\nINSTALL: Installing database software\n")   
       self.__run_command("cd .. && " + self.benchmarker.database_sftp_string(batch_file="../config/database_sftp_batch"), True)
       self.__run_command("cd .. && " + self.benchmarker.database_sftp_string(batch_file="../config/database_sftp_batch"), True)
       with open (linux_install_root + "/database.sh", "r") as myfile:
       with open (linux_install_root + "/database.sh", "r") as myfile:
-        remote_script=myfile.read().format(database_host=self.benchmarker.database_host)
         print("\nINSTALL: %s" % self.benchmarker.database_ssh_string)
         print("\nINSTALL: %s" % self.benchmarker.database_ssh_string)
-        p = subprocess.Popen(self.benchmarker.database_ssh_string.split(" ") + ["bash"], stdin=subprocess.PIPE)
+        p = subprocess.Popen(self.benchmarker.database_ssh_string.split(" ") +
+                             ["bash"], stdin=subprocess.PIPE)
+        remote_script = myfile.read()
         p.communicate(remote_script)
         p.communicate(remote_script)
         returncode = p.returncode
         returncode = p.returncode
         if returncode != 0:
         if returncode != 0:

+ 5 - 4
toolset/setup/linux/languages/mono.sh

@@ -8,7 +8,7 @@ RETCODE=$(fw_exists ${IROOT}/mono.installed)
   sudo $IROOT/mono-3.6.0-install/bin/mozroots --import --sync;
   sudo $IROOT/mono-3.6.0-install/bin/mozroots --import --sync;
   return 0; }
   return 0; }
 
 
-sudo apt-get install -y build-essential \
+sudo apt-get install -qqy build-essential \
              autoconf \
              autoconf \
              automake \
              automake \
              libtool \
              libtool \
@@ -21,10 +21,11 @@ fw_untar mono-3.6.0.tar.bz2
 
 
 cd mono-3.6.0
 cd mono-3.6.0
 ./autogen.sh --prefix=${IROOT}/mono-3.6.0-install
 ./autogen.sh --prefix=${IROOT}/mono-3.6.0-install
-make -j4 EXTERNAL_MCS=${IROOT}/mono-3.6.0/mcs/class/lib/monolite/basic.exe
-make install
+echo -n "Installing Mono"
+make -j4 EXTERNAL_MCS=${IROOT}/mono-3.6.0/mcs/class/lib/monolite/basic.exe 2>&1 | tee $IROOT/mono-install.log | awk '{ if (NR%100 == 0) printf "."}'
+make install 2>&1 | tee -a $IROOT/mono-install.log | awk '{ if (NR%100 == 0) printf "."}'
 
 
 echo "Installing RootCAs from Mozilla..."; 
 echo "Installing RootCAs from Mozilla..."; 
 sudo ${IROOT}/mono-3.6.0-install/bin/mozroots --import --sync;
 sudo ${IROOT}/mono-3.6.0-install/bin/mozroots --import --sync;
 
 
-touch ${IROOT}/mono.installed
+touch $IROOT/mono.installed

+ 2 - 2
toolset/setup/linux/languages/perl.sh

@@ -5,7 +5,7 @@ RETCODE=$(fw_exists ${IROOT}/perl-5.18.installed)
 
 
 fw_get https://raw.github.com/tokuhirom/Perl-Build/master/perl-build -O perl-build.pl
 fw_get https://raw.github.com/tokuhirom/Perl-Build/master/perl-build -O perl-build.pl
 # compile with optimizations, n.b. this does not turn on debugging
 # compile with optimizations, n.b. this does not turn on debugging
-perl perl-build.pl -DDEBUGGING=-g 5.18.2 perl-5.18
+perl perl-build.pl -DDEBUGGING=-g 5.18.2 perl-5.18 2>&1 | tee $IROOT/perl-install.log | awk '{ if (NR%100 == 0) printf "."}'
 
 
 fw_get http://cpanmin.us -O cpanminus.pl
 fw_get http://cpanmin.us -O cpanminus.pl
 perl-5.18/bin/perl cpanminus.pl --notest --no-man-page App::cpanminus
 perl-5.18/bin/perl cpanminus.pl --notest --no-man-page App::cpanminus
@@ -13,4 +13,4 @@ perl-5.18/bin/perl cpanminus.pl --notest --no-man-page App::cpanminus
 # Install others in the per-framework install script or cpanfile
 # Install others in the per-framework install script or cpanfile
 perl-5.18/bin/cpanm -f --notest --no-man-page Carton JSON JSON::XS IO::Socket::IP IO::Socket::SSL
 perl-5.18/bin/cpanm -f --notest --no-man-page Carton JSON JSON::XS IO::Socket::IP IO::Socket::SSL
 
 
-touch ${IROOT}/perl-5.18.installed
+touch ${IROOT}/perl-5.18.installed

+ 3 - 2
toolset/setup/linux/languages/python2.sh

@@ -7,8 +7,9 @@ fw_get http://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
 fw_untar Python-2.7.9.tgz
 fw_untar Python-2.7.9.tgz
 cd Python-2.7.9
 cd Python-2.7.9
 ./configure --prefix=${IROOT}/py2 --disable-shared --quiet
 ./configure --prefix=${IROOT}/py2 --disable-shared --quiet
-make -j4 --quiet
-make install --quiet
+make -j4 --quiet 2>&1 | tee $IROOT/python-install.log | awk '{ if (NR%100 == 0) printf "."}'
+make install --quiet 2>&1 | tee -a $IROOT/python-install.log | awk '{ if (NR%100 == 0) printf "."}'
+cd ..
 
 
 ${IROOT}/py2/bin/python -m ensurepip -U
 ${IROOT}/py2/bin/python -m ensurepip -U
 ${IROOT}/py2/bin/pip install -U setuptools pip
 ${IROOT}/py2/bin/pip install -U setuptools pip

+ 3 - 2
toolset/setup/linux/languages/python3.sh

@@ -7,8 +7,9 @@ fw_get http://www.python.org/ftp/python/3.4.2/Python-3.4.2.tar.xz
 fw_untar Python-3.4.2.tar.xz
 fw_untar Python-3.4.2.tar.xz
 cd Python-3.4.2
 cd Python-3.4.2
 ./configure --prefix=${IROOT}/py3 --disable-shared --quiet
 ./configure --prefix=${IROOT}/py3 --disable-shared --quiet
-make -j4 --quiet
-make install --quiet
+make -j4 --quiet 2>&1 | tee $IROOT/python3-install.log | awk '{ if (NR%100 == 0) printf "."}'
+make install --quiet 2>&1 | tee -a $IROOT/python3-install.log | awk '{ if (NR%100 == 0) printf "."}'
+cd ..
 
 
 ln -s ${IROOT}/py3/bin/python3.4m ${IROOT}/py3/bin/python3.4
 ln -s ${IROOT}/py3/bin/python3.4m ${IROOT}/py3/bin/python3.4
 ${IROOT}/py3/bin/python3 -m ensurepip -U
 ${IROOT}/py3/bin/python3 -m ensurepip -U

+ 3 - 3
toolset/setup/linux/prerequisites.sh

@@ -20,7 +20,7 @@ sudo apt-get -yq update
 sudo apt-get -yq upgrade -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"
 sudo apt-get -yq upgrade -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold"
 
 
 # WARNING: DONT PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
 # WARNING: DONT PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
-sudo apt-get -yq install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
+sudo apt-get -qqy install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
   cmake build-essential automake    `# Needed for building code` \
   cmake build-essential automake    `# Needed for building code` \
   curl wget unzip                   `# Common tools` \
   curl wget unzip                   `# Common tools` \
   software-properties-common        `# Needed for add-apt-repository` \
   software-properties-common        `# Needed for add-apt-repository` \
@@ -40,14 +40,14 @@ sudo apt-get -yq install -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::
   liborc-0.4-0 libwxbase2.8-0 libwxgtk2.8-0 libgnutls-dev \
   liborc-0.4-0 libwxbase2.8-0 libwxgtk2.8-0 libgnutls-dev \
   libjson0-dev libmcrypt-dev libicu-dev gettext \
   libjson0-dev libmcrypt-dev libicu-dev gettext \
   libpq-dev mlton \
   libpq-dev mlton \
-  libjemalloc-dev                   `# Needed by lwan at least` \
+  libjemalloc-dev libluajit-5.1-dev `# Needed by lwan at least` \
   libhiredis-dev                    `# Redis client - Needed by ngx_mruby at least` \
   libhiredis-dev                    `# Redis client - Needed by ngx_mruby at least` \
   cloc dstat                        `# Collect resource usage statistics`
   cloc dstat                        `# Collect resource usage statistics`
 
 
 # Install gcc-4.8
 # Install gcc-4.8
 sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
 sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
 sudo apt-get -yq update
 sudo apt-get -yq update
-sudo apt-get install -yq gcc-4.8 g++-4.8
+sudo apt-get install -qqy gcc-4.8 g++-4.8
 
 
 # Stop permanently overwriting people's files just for 
 # Stop permanently overwriting people's files just for 
 # trying out our software!
 # trying out our software!