From 60b959244ced369bfd41100af9c0ffe943ef6d82 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 29 Mar 2021 06:32:34 +0800 Subject: [PATCH 01/11] Update 2.3.0 (#6492) * Update benchmark_config.json * Update config.toml * Update 2.3.0 * Update 2.3.0 * Update benchmark_config.json * Rename redkale-jdk16.dockerfile to redkale-pgc.dockerfile * Update config.toml --- frameworks/Java/redkale/benchmark_config.json | 9 ++++++--- frameworks/Java/redkale/config.toml | 16 ++++++++++------ ...e-jdk16.dockerfile => redkale-pgc.dockerfile} | 0 frameworks/Java/redkale/redkale.dockerfile | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) rename frameworks/Java/redkale/{redkale-jdk16.dockerfile => redkale-pgc.dockerfile} (100%) diff --git a/frameworks/Java/redkale/benchmark_config.json b/frameworks/Java/redkale/benchmark_config.json index 3fb2f8753c1..56cf569cb03 100644 --- a/frameworks/Java/redkale/benchmark_config.json +++ b/frameworks/Java/redkale/benchmark_config.json @@ -60,9 +60,10 @@ "notes": "", "versus": "Redkale" }, - "jdk16": { + "pgc": { "plaintext_url": "/plaintext", "json_url": "/json", + "cached_query_url": "/cached-worlds?q=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -75,13 +76,14 @@ "webserver": "Redkale", "os": "Linux", "database_os": "Linux", - "display_name": "redkale-io", + "display_name": "redkale-pgc", "notes": "", "versus": "Redkale" }, "zgc": { "plaintext_url": "/plaintext", "json_url": "/json", + "cached_query_url": "/cached-worlds?q=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -94,13 +96,14 @@ "webserver": "Redkale", "os": "Linux", "database_os": "Linux", - "display_name": "redkale-io", + "display_name": "redkale-zgc", "notes": "", "versus": "Redkale" }, "io": { "plaintext_url": "/plaintext", "json_url": "/json", + "cached_query_url": "/cached-worlds?q=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", diff --git a/frameworks/Java/redkale/config.toml b/frameworks/Java/redkale/config.toml index f2bcfa25230..e12546fdf2d 100644 --- a/frameworks/Java/redkale/config.toml +++ b/frameworks/Java/redkale/config.toml @@ -41,12 +41,13 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[io] +[pgc] urls.plaintext = "/plaintext" urls.json = "/json" +urls.cached_query = "/cached-worlds?q=" approach = "Realistic" classification = "Fullstack" -database = "None" +database = "Postgres" database_os = "Linux" os = "Linux" orm = "Raw" @@ -54,12 +55,13 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[jdk16] +[zgc] urls.plaintext = "/plaintext" urls.json = "/json" +urls.cached_query = "/cached-worlds?q=" approach = "Realistic" classification = "Fullstack" -database = "None" +database = "Postgres" database_os = "Linux" os = "Linux" orm = "Raw" @@ -67,15 +69,17 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[zgc] +[io] urls.plaintext = "/plaintext" urls.json = "/json" +urls.cached_query = "/cached-worlds?q=" approach = "Realistic" classification = "Fullstack" -database = "None" +database = "Postgres" database_os = "Linux" os = "Linux" orm = "Raw" platform = "Redkale" webserver = "Redkale" versus = "Redkale" + diff --git a/frameworks/Java/redkale/redkale-jdk16.dockerfile b/frameworks/Java/redkale/redkale-pgc.dockerfile similarity index 100% rename from frameworks/Java/redkale/redkale-jdk16.dockerfile rename to frameworks/Java/redkale/redkale-pgc.dockerfile diff --git a/frameworks/Java/redkale/redkale.dockerfile b/frameworks/Java/redkale/redkale.dockerfile index 8ba5a17e88d..bca46bb7106 100644 --- a/frameworks/Java/redkale/redkale.dockerfile +++ b/frameworks/Java/redkale/redkale.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:AutoBoxCacheMax=320000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] From 4c7d9415a4e81453fe94aad7f1b0e3e3a4eb3651 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 28 Mar 2021 15:32:59 -0700 Subject: [PATCH 02/11] Bump pyyaml from 3.11 to 5.4 in /frameworks/Python/api_hour (#6490) Bumps [pyyaml](https://github.com/yaml/pyyaml) from 3.11 to 5.4. - [Release notes](https://github.com/yaml/pyyaml/releases) - [Changelog](https://github.com/yaml/pyyaml/blob/master/CHANGES) - [Commits](https://github.com/yaml/pyyaml/compare/3.11...5.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/api_hour/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/api_hour/requirements.txt b/frameworks/Python/api_hour/requirements.txt index 44475e9a848..d45e196827c 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -10,7 +10,7 @@ Jinja2==2.11.3 MarkupSafe==0.23 piprot==0.9.1 psycopg2==2.7.5 -PyYAML==3.11 +PyYAML==5.4 requests==2.20.0 requests-futures==0.9.5 setproctitle==1.1.8 From 5fdac662147334025a6e38156f8e8ebc7770fd9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BF=9E=E6=99=94?= <39583360+yuyenews@users.noreply.github.com> Date: Tue, 30 Mar 2021 05:09:09 +0800 Subject: [PATCH 03/11] update martian (#6500) * test martian * martian * martian * add readme.md * edit dockerfile * edit dockerfile * edit dockerfile * test martian * test martian * test martian * test martian * test martian * test martian * test martian * add martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian --- frameworks/Java/martian/martian.dockerfile | 2 +- frameworks/Java/martian/pom.xml | 2 +- .../martian/src/main/java/com/text/config/TestConfig.java | 4 +++- .../martian/src/main/java/com/text/service/TestService.java | 5 ++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/frameworks/Java/martian/martian.dockerfile b/frameworks/Java/martian/martian.dockerfile index 77a70975ddf..014401ed748 100644 --- a/frameworks/Java/martian/martian.dockerfile +++ b/frameworks/Java/martian/martian.dockerfile @@ -11,4 +11,4 @@ COPY --from=maven /martian/target/lib lib EXPOSE 8080 -CMD ["java", "-jar", "martian.jar", "--illegal-access=deny", "--add-opens","java.base/java.lang=ALL-UNNAMED"] \ No newline at end of file +CMD ["java", "-jar", "martian.jar"] \ No newline at end of file diff --git a/frameworks/Java/martian/pom.xml b/frameworks/Java/martian/pom.xml index bbfd4288289..f3a8f1c7eb1 100644 --- a/frameworks/Java/martian/pom.xml +++ b/frameworks/Java/martian/pom.xml @@ -18,7 +18,7 @@ com.github.yuyenews mars-starter - 3.2.15 + 3.3.1 diff --git a/frameworks/Java/martian/src/main/java/com/text/config/TestConfig.java b/frameworks/Java/martian/src/main/java/com/text/config/TestConfig.java index da855b8cee2..07a669aa521 100644 --- a/frameworks/Java/martian/src/main/java/com/text/config/TestConfig.java +++ b/frameworks/Java/martian/src/main/java/com/text/config/TestConfig.java @@ -10,10 +10,12 @@ public int port() { return 8080; } + + @Override public ThreadPoolConfig threadPoolConfig() { ThreadPoolConfig threadPoolConfig = new ThreadPoolConfig(); - threadPoolConfig.setCorePoolSize(2); + threadPoolConfig.setCorePoolSize(200); threadPoolConfig.setMaxPoolSize(10000000); threadPoolConfig.setKeepAliveTime(20); threadPoolConfig.setBackLog(2000); diff --git a/frameworks/Java/martian/src/main/java/com/text/service/TestService.java b/frameworks/Java/martian/src/main/java/com/text/service/TestService.java index 19483de9e10..20ab9f2d428 100644 --- a/frameworks/Java/martian/src/main/java/com/text/service/TestService.java +++ b/frameworks/Java/martian/src/main/java/com/text/service/TestService.java @@ -1,15 +1,14 @@ package com.text.service; +import com.mars.aio.constant.HttpConstant; +import com.mars.aio.server.impl.MarsHttpExchange; import com.mars.common.annotation.bean.MarsBean; -import com.mars.iserver.constant.HttpConstant; -import com.mars.iserver.server.impl.MarsHttpExchange; import com.mars.server.server.request.HttpMarsResponse; import com.text.api.vo.MessageVO; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import java.util.TimeZone; @MarsBean public class TestService { From 73eb2abec4e5c594e40812250ebe061234fe9473 Mon Sep 17 00:00:00 2001 From: Ian Bennett Date: Wed, 31 Mar 2021 09:47:17 -0700 Subject: [PATCH 04/11] Bump Finagle and Finatra benchmarks to 21.3.0 release (#6501) --- frameworks/Scala/finagle/build.sbt | 4 ++-- frameworks/Scala/finatra/build.sbt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Scala/finagle/build.sbt b/frameworks/Scala/finagle/build.sbt index b7a4ed1659e..14d960f2eac 100644 --- a/frameworks/Scala/finagle/build.sbt +++ b/frameworks/Scala/finagle/build.sbt @@ -1,7 +1,7 @@ -lazy val finagleVersion = "21.2.0" +lazy val finagleVersion = "21.3.0" name := "finagle-benchmark" -scalaVersion := "2.12.8" +scalaVersion := "2.12.12" version := finagleVersion libraryDependencies ++= Seq( diff --git a/frameworks/Scala/finatra/build.sbt b/frameworks/Scala/finatra/build.sbt index fa1b0e16c6d..bc5f9c44d27 100644 --- a/frameworks/Scala/finatra/build.sbt +++ b/frameworks/Scala/finatra/build.sbt @@ -1,10 +1,10 @@ -lazy val finatraVersion = "21.2.0" +lazy val finatraVersion = "21.3.0" name := "techempower-benchmarks-finatra" organization := "com.twitter" version := finatraVersion -scalaVersion := "2.12.8" +scalaVersion := "2.12.12" resolvers ++= Seq( Resolver.sonatypeRepo("releases") @@ -18,7 +18,7 @@ assemblyMergeStrategy in assembly := { case other => MergeStrategy.first} libraryDependencies ++= Seq( - ("com.twitter" %% "finatra-http" % finatraVersion). + ("com.twitter" %% "finatra-http-server" % finatraVersion). exclude("com.sun.activation", "javax.activation"), "org.slf4j" % "slf4j-nop" % "1.7.30", "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.11.2", From f55090125c8b12960be1f56302e9ffa681a1fcaf Mon Sep 17 00:00:00 2001 From: John Towler Date: Fri, 2 Apr 2021 19:37:31 -0700 Subject: [PATCH 05/11] Fix #6511: go/go-std fortunes test throws Route for fortunes must be at least 9 characters, found '/fortune' instead (#6512) --- frameworks/Go/go-std/README.md | 2 +- frameworks/Go/go-std/benchmark_config.json | 12 ++++++------ frameworks/Go/go-std/src/main.go | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/Go/go-std/README.md b/frameworks/Go/go-std/README.md index 22edea4b7c4..f8def5f809f 100644 --- a/frameworks/Go/go-std/README.md +++ b/frameworks/Go/go-std/README.md @@ -11,4 +11,4 @@ This is the go portion of a [benchmarking test suite](https://www.techempower.co http://localhost:8080/queries?queries=[1-500] http://localhost:8080/update?queries=[1-500] http://localhost:8080/plaintext - http://localhost:8080/fortune + http://localhost:8080/fortunes diff --git a/frameworks/Go/go-std/benchmark_config.json b/frameworks/Go/go-std/benchmark_config.json index 881cb9c7c16..ae371ee0ad4 100644 --- a/frameworks/Go/go-std/benchmark_config.json +++ b/frameworks/Go/go-std/benchmark_config.json @@ -23,7 +23,7 @@ "pgx": { "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortune", + "fortune_url": "/fortunes", "update_url": "/update?queries=", "port": 8080, "approach": "Realistic", @@ -85,7 +85,7 @@ "plaintext_url": "/plaintext", "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortune", + "fortune_url": "/fortunes", "update_url": "/update?queries=", "port": 8080, "approach": "Realistic", @@ -145,7 +145,7 @@ "my": { "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortune", + "fortune_url": "/fortunes", "update_url": "/update?queries=", "port": 8080, "approach": "Realistic", @@ -166,7 +166,7 @@ "my-prefork": { "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortune", + "fortune_url": "/fortunes", "update_url": "/update?queries=", "port": 8080, "approach": "Realistic", @@ -187,7 +187,7 @@ "mgo": { "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortune", + "fortune_url": "/fortunes", "update_url": "/update?queries=", "port": 8080, "approach": "Realistic", @@ -208,7 +208,7 @@ "mgo-prefork": { "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortune", + "fortune_url": "/fortunes", "update_url": "/update?queries=", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Go/go-std/src/main.go b/frameworks/Go/go-std/src/main.go index b9316734a88..2f7bd835cd4 100644 --- a/frameworks/Go/go-std/src/main.go +++ b/frameworks/Go/go-std/src/main.go @@ -63,7 +63,7 @@ func main() { if db != nil { defer db.Close() // http.HandleFunc("/fortune", handlers.FortuneHandler(db)) - http.HandleFunc("/fortune", handlers.FortuneHandlerPool(db)) + http.HandleFunc("/fortunes", handlers.FortuneHandlerPool(db)) // http.HandleFunc("/fortune-quick", handlers.FortuneQuickHandler(db)) http.HandleFunc("/fortune-quick", handlers.FortuneQuickHandlerPool(db)) if *easyjson { From 7dae68ecf0226335007b7aef859e16fe8886b90c Mon Sep 17 00:00:00 2001 From: Francesco Iapicca Date: Sat, 3 Apr 2021 20:35:35 +0300 Subject: [PATCH 06/11] aqueduct, angel and redstone removed (#6509) * aqueduct and angel removed * redstone removed --- frameworks/Dart/angel/.gitignore | 6 - frameworks/Dart/angel/README.md | 39 --- .../Dart/angel/angel-postgres.dockerfile | 11 - frameworks/Dart/angel/angel.dockerfile | 11 - frameworks/Dart/angel/benchmark_config.json | 55 ---- frameworks/Dart/angel/bin/main.dart | 72 ----- frameworks/Dart/angel/config.toml | 36 --- frameworks/Dart/angel/config/default.yaml | 6 - frameworks/Dart/angel/config/production.yaml | 1 - .../Dart/angel/lib/dart_angel_benchmark.dart | 138 --------- .../Dart/angel/lib/src/models/fortune.dart | 9 - .../Dart/angel/lib/src/models/models.dart | 2 - .../Dart/angel/lib/src/models/world.dart | 9 - .../Dart/angel/lib/src/query/mongo.dart | 37 --- .../Dart/angel/lib/src/query/postgres.dart | 41 --- .../Dart/angel/lib/src/query/querier.dart | 10 - .../Dart/angel/lib/src/query/query.dart | 3 - frameworks/Dart/angel/pubspec.yaml | 18 -- frameworks/Dart/angel/views/fortunes.mustache | 1 - frameworks/Dart/aqueduct/README.md | 37 --- frameworks/Dart/aqueduct/aqueduct.dockerfile | 9 - .../Dart/aqueduct/benchmark_config.json | 28 -- frameworks/Dart/aqueduct/config.toml | 19 -- frameworks/Dart/aqueduct/config.yaml | 6 - frameworks/Dart/aqueduct/fortunes.mustache | 20 -- frameworks/Dart/aqueduct/pubspec.yaml | 11 - frameworks/Dart/aqueduct/server.dart | 227 --------------- frameworks/Dart/redstone/README.md | 65 ----- .../Dart/redstone/benchmark_config.json | 49 ---- frameworks/Dart/redstone/config.toml | 34 --- frameworks/Dart/redstone/fortunes.mustache | 20 -- frameworks/Dart/redstone/mongodb.yaml | 2 - frameworks/Dart/redstone/postgresql.yaml | 5 - frameworks/Dart/redstone/pubspec.yaml | 15 - .../Dart/redstone/redstone-mongodb.dockerfile | 14 - frameworks/Dart/redstone/redstone.dockerfile | 14 - frameworks/Dart/redstone/server.dart | 272 ------------------ 37 files changed, 1352 deletions(-) delete mode 100644 frameworks/Dart/angel/.gitignore delete mode 100755 frameworks/Dart/angel/README.md delete mode 100644 frameworks/Dart/angel/angel-postgres.dockerfile delete mode 100644 frameworks/Dart/angel/angel.dockerfile delete mode 100755 frameworks/Dart/angel/benchmark_config.json delete mode 100644 frameworks/Dart/angel/bin/main.dart delete mode 100644 frameworks/Dart/angel/config.toml delete mode 100644 frameworks/Dart/angel/config/default.yaml delete mode 100644 frameworks/Dart/angel/config/production.yaml delete mode 100644 frameworks/Dart/angel/lib/dart_angel_benchmark.dart delete mode 100644 frameworks/Dart/angel/lib/src/models/fortune.dart delete mode 100644 frameworks/Dart/angel/lib/src/models/models.dart delete mode 100644 frameworks/Dart/angel/lib/src/models/world.dart delete mode 100644 frameworks/Dart/angel/lib/src/query/mongo.dart delete mode 100644 frameworks/Dart/angel/lib/src/query/postgres.dart delete mode 100644 frameworks/Dart/angel/lib/src/query/querier.dart delete mode 100644 frameworks/Dart/angel/lib/src/query/query.dart delete mode 100644 frameworks/Dart/angel/pubspec.yaml delete mode 100644 frameworks/Dart/angel/views/fortunes.mustache delete mode 100644 frameworks/Dart/aqueduct/README.md delete mode 100644 frameworks/Dart/aqueduct/aqueduct.dockerfile delete mode 100644 frameworks/Dart/aqueduct/benchmark_config.json delete mode 100644 frameworks/Dart/aqueduct/config.toml delete mode 100644 frameworks/Dart/aqueduct/config.yaml delete mode 100644 frameworks/Dart/aqueduct/fortunes.mustache delete mode 100644 frameworks/Dart/aqueduct/pubspec.yaml delete mode 100644 frameworks/Dart/aqueduct/server.dart delete mode 100644 frameworks/Dart/redstone/README.md delete mode 100644 frameworks/Dart/redstone/benchmark_config.json delete mode 100644 frameworks/Dart/redstone/config.toml delete mode 100644 frameworks/Dart/redstone/fortunes.mustache delete mode 100644 frameworks/Dart/redstone/mongodb.yaml delete mode 100644 frameworks/Dart/redstone/postgresql.yaml delete mode 100644 frameworks/Dart/redstone/pubspec.yaml delete mode 100644 frameworks/Dart/redstone/redstone-mongodb.dockerfile delete mode 100644 frameworks/Dart/redstone/redstone.dockerfile delete mode 100644 frameworks/Dart/redstone/server.dart diff --git a/frameworks/Dart/angel/.gitignore b/frameworks/Dart/angel/.gitignore deleted file mode 100644 index b84388bd30b..00000000000 --- a/frameworks/Dart/angel/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -!bin/ -.dart_tool -.packages -*.reflectable.dart -*.g.part -*.g.dart diff --git a/frameworks/Dart/angel/README.md b/frameworks/Dart/angel/README.md deleted file mode 100755 index d148041e909..00000000000 --- a/frameworks/Dart/angel/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Angel Framework Benchmarking Test -This test adds [Angel](https://angel-dart.github.io), -a full-featured framework for Dart, to the -[benchmarking test suite](https://github.com/TechEmpower/FrameworkBenchmarks/blob/master/frameworks/Dart). The test is based on the Dart Benchmarking Test. - -## Versions -The `pubspec.lock` file is included; so that dependencies are kept consistent between deployments. -The tests included in this benchmark are a demonstration of: -* [Dart SDK version 2.2.0](http://www.dartlang.org/) -* [Angel Framework version `^2.0.0-alpha.22`](https://pub.dartlang.org/packages/angel_framework/versions/2.0.0-alpha.22) - -## Test URLs -### JSON - -http://localhost:8080/json - -### PLAINTEXT - -http://localhost:8080/plaintext - -### DB - -http://localhost:8080/db - -### QUERY - -http://localhost:8080/query?queries= - -### CACHED QUERY - -http://localhost:8080/cached_query?queries= - -### UPDATE - -http://localhost:8080/update?queries= - -### FORTUNES - -http://localhost:8080/fortunes diff --git a/frameworks/Dart/angel/angel-postgres.dockerfile b/frameworks/Dart/angel/angel-postgres.dockerfile deleted file mode 100644 index 1aa37ff8472..00000000000 --- a/frameworks/Dart/angel/angel-postgres.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM google/dart:2.2 - -COPY ./ ./ - -RUN pub get - -RUN pub run build_runner build - -EXPOSE 8080 - -CMD ANGEL_ENV=production dart bin/main.dart --type=postgres diff --git a/frameworks/Dart/angel/angel.dockerfile b/frameworks/Dart/angel/angel.dockerfile deleted file mode 100644 index cde0b5929e0..00000000000 --- a/frameworks/Dart/angel/angel.dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM google/dart:2.2 - -COPY ./ ./ - -RUN pub get - -RUN pub run build_runner build - -EXPOSE 8080 - -CMD ANGEL_ENV=production dart bin/main.dart --type=mongo diff --git a/frameworks/Dart/angel/benchmark_config.json b/frameworks/Dart/angel/benchmark_config.json deleted file mode 100755 index d18816036bc..00000000000 --- a/frameworks/Dart/angel/benchmark_config.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "framework": "angel", - "tests": [ - { - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries/?queryCount=", - "update_url": "/updates/?queryCount=", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "mongodb", - "framework": "angel-mongo", - "language": "Dart", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Angel (MongoDB)", - "notes": "", - "versus": "dart", - "tags": ["broken"] - }, - "postgres": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries/?queryCount=", - "update_url": "/updates/?queryCount=", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "postgres", - "framework": "angel-postgres", - "language": "Dart", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Angel (MongoDB)", - "notes": "", - "versus": "dart", - "tags": ["broken"] - } - } - ] -} diff --git a/frameworks/Dart/angel/bin/main.dart b/frameworks/Dart/angel/bin/main.dart deleted file mode 100644 index d56668b8e6e..00000000000 --- a/frameworks/Dart/angel/bin/main.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:isolate'; -import 'package:angel_framework/angel_framework.dart'; -import 'package:angel_framework/http.dart'; -import 'package:args/args.dart'; -import 'package:dart_angel_benchmark/dart_angel_benchmark.dart' - as dart_angel_benchmark; -import 'main.reflectable.dart'; - -main(List args) async { - initializeReflectable(); - var argParser = ArgParser() - ..addOption('type', - abbr: 't', allowed: ['mongo', 'postgres'], defaultsTo: 'mongo'); - - try { - var argResults = argParser.parse(args); - serverMain(StartConfig(0, argResults)); - - for (int i = 1; i < Platform.numberOfProcessors; i++) { - var onError = new ReceivePort(); - onError.first.then((data) { - print(data); - - if (data is List) { - Zone.current.errorCallback(data[0], data[1] as StackTrace); - } - }); - Isolate.spawn(serverMain, StartConfig(i, argResults), - onError: onError.sendPort); - } - } on ArgParserException catch (e) { - stderr - ..writeln('fatal error: ${e.message}') - ..writeln('usage: bin/main.dart [options...]') - ..writeln() - ..writeln(argParser.usage); - exitCode = 1; - } -} - -void serverMain(StartConfig config) { - var app = Angel( - //logger: Logger('tfb'), - ); - - // hierarchicalLoggingEnabled = true; - - //app.logger.onRecord.listen((rec) { - // print(rec); - // if (rec.error != null) print(rec.error); - // if (rec.stackTrace != null) print(rec.stackTrace); - //}); - - app - .configure(dart_angel_benchmark.configureServer(config.argResults)) - .then((_) async { - var http = AngelHttp.custom(app, startShared); - var server = await http.startServer('0.0.0.0', 8080); - var url = - Uri(scheme: 'http', host: server.address.address, port: server.port); - print('Instance #${config.id} listening at $url'); - }); -} - -class StartConfig { - final int id; - final ArgResults argResults; - - StartConfig(this.id, this.argResults); -} diff --git a/frameworks/Dart/angel/config.toml b/frameworks/Dart/angel/config.toml deleted file mode 100644 index a14dc2fba7d..00000000000 --- a/frameworks/Dart/angel/config.toml +++ /dev/null @@ -1,36 +0,0 @@ -[framework] -name = "angel" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/?queryCount=" -urls.update = "/updates/?queryCount=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "mongodb" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "dart" - -[postgres] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/?queryCount=" -urls.update = "/updates/?queryCount=" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Fullstack" -database = "postgres" -database_os = "Linux" -os = "Linux" -orm = "Raw" -platform = "None" -webserver = "None" -versus = "dart" diff --git a/frameworks/Dart/angel/config/default.yaml b/frameworks/Dart/angel/config/default.yaml deleted file mode 100644 index 4aeb7fff1db..00000000000 --- a/frameworks/Dart/angel/config/default.yaml +++ /dev/null @@ -1,6 +0,0 @@ -postgres: - username: benchmarkdbuser - password: benchmarkdbpass - host: tfb-database - port: 5432 - databaseName: hello_world \ No newline at end of file diff --git a/frameworks/Dart/angel/config/production.yaml b/frameworks/Dart/angel/config/production.yaml deleted file mode 100644 index ada804d23c2..00000000000 --- a/frameworks/Dart/angel/config/production.yaml +++ /dev/null @@ -1 +0,0 @@ -mongo_db: "mongodb://tfb-database/hello_world" \ No newline at end of file diff --git a/frameworks/Dart/angel/lib/dart_angel_benchmark.dart b/frameworks/Dart/angel/lib/dart_angel_benchmark.dart deleted file mode 100644 index e3c91518942..00000000000 --- a/frameworks/Dart/angel/lib/dart_angel_benchmark.dart +++ /dev/null @@ -1,138 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:math'; -import 'package:angel_configuration/angel_configuration.dart'; -import 'package:angel_framework/angel_framework.dart'; -import 'package:args/args.dart'; -import 'package:file/local.dart'; -import 'package:http_parser/http_parser.dart'; -import 'package:mongo_dart/mongo_dart.dart'; -import 'package:mustache4dart/mustache4dart.dart' as mustache; -import 'package:postgres/postgres.dart'; -import 'src/models/models.dart'; -import 'src/query/query.dart'; - -AngelConfigurer configureServer(ArgResults argResults) { - var rnd = new Random(); - var minQueryCount = 1; - var maxQueryCount = 500; - var worldTableSize = 10000; - var fs = const LocalFileSystem(); - - return (Angel app) async { - // Load configuration. - await app.configure(configuration(fs)); - - // Set up the view engine. - var fortunesTemplate = - await fs.file('views/fortunes.mustache').readAsString(); - - app.viewGenerator = - (name, [data]) => mustache.render(fortunesTemplate, data); - - // Select a querier, either MongoDB or PostgreSQL. - // - // Either way, the container *must* contain a `Querier`. - if (argResults['type'] == 'mongo') { - var db = Db(app.configuration['mongo_db']); - app.container - .registerSingleton(MongoQuerier(db, rnd, worldTableSize)); - await db.open(); - app.shutdownHooks.add((_) => db.close()); - } else if (argResults['type'] == 'postgres') { - var postgresConfig = app.configuration['postgres'] as Map; - var connection = PostgreSQLConnection( - postgresConfig['host'], - postgresConfig['port'], - postgresConfig['databaseName'], - username: postgresConfig['username'], - password: postgresConfig['password'], - ); - app.container.registerSingleton(PostgresQuerier(connection)); - await connection.open(); - app.shutdownHooks.add((_) => connection.close()); - } else { - throw UnsupportedError('Unsupported DB ${argResults['type']}'); - } - - // Always add a Date header. - app.fallback((req, res) { - res.headers['date'] = HttpDate.format(DateTime.now()); - }); - - // JSON response. - app.get('/json', (req, res) { - res.serialize({'message': 'Hello, World!'}); - }); - - // Plaintext response. - app.get('/plaintext', (req, res) { - res - ..write('Hello, World!') - ..close(); - }); - - // Fetch random world object. - app.get('/db', (req, res) async { - var querier = req.container.make(); - res.serialize(await querier.getRandomWorld()); - }); - - // DB queries - app.get('/queries', (req, res) async { - // Get the querier and query count. - var querier = req.container.make(); - var queryCount = - int.tryParse(req.uri.queryParameters['queryCount'].toString()) ?? - minQueryCount; - queryCount = queryCount.clamp(minQueryCount, maxQueryCount); - - // Fetch the objects. - var worlds = await Future.wait( - List.generate(queryCount, (_) => querier.getRandomWorld())); - res.serialize(worlds); - }); - - // DB updates - app.get('/updates', (req, res) async { - // Get the querier and query count. - var querier = req.container.make(); - var queryCount = - int.tryParse(req.uri.queryParameters['queryCount'].toString()) ?? - minQueryCount; - queryCount = queryCount.clamp(minQueryCount, maxQueryCount); - - // Fetch the objects. - var worlds = - await Future.wait(List.generate(queryCount, (_) async { - var world = await querier.getRandomWorld(); - world = world.copyWith(randomNumber: rnd.nextInt(worldTableSize) + 1); - await querier.updateWorld(world.id, world); - return world; - })); - res.serialize(worlds); - }); - - // Templating - app.get('/fortunes', (req, res) async { - var querier = req.container.make(); - var fortunes = await querier.getFortunes(); - - // Insert an additional fortune. - fortunes.add( - Fortune( - id: 0, - message: 'Additional fortune added at request time.', - ), - ); - - // Sort the fortunes. - fortunes.sort((a, b) => a.message.compareTo(b.message)); - - // Render the template. - res.contentType = new MediaType('text', 'html', {'charset': 'utf-8'}); - await res.render('fortunes', - {'fortunes': fortunes.map((f) => f.copyWith(id: f.id.toInt()))}); - }); - }; -} diff --git a/frameworks/Dart/angel/lib/src/models/fortune.dart b/frameworks/Dart/angel/lib/src/models/fortune.dart deleted file mode 100644 index 226bb9f87be..00000000000 --- a/frameworks/Dart/angel/lib/src/models/fortune.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:angel_serialize/angel_serialize.dart'; -part 'fortune.g.dart'; - -@Serializable(autoSnakeCaseNames: false) -abstract class _Fortune { - num get id; - - String get message; -} diff --git a/frameworks/Dart/angel/lib/src/models/models.dart b/frameworks/Dart/angel/lib/src/models/models.dart deleted file mode 100644 index 445c927fa46..00000000000 --- a/frameworks/Dart/angel/lib/src/models/models.dart +++ /dev/null @@ -1,2 +0,0 @@ -export 'fortune.dart'; -export 'world.dart'; diff --git a/frameworks/Dart/angel/lib/src/models/world.dart b/frameworks/Dart/angel/lib/src/models/world.dart deleted file mode 100644 index 7c9e345a07b..00000000000 --- a/frameworks/Dart/angel/lib/src/models/world.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:angel_serialize/angel_serialize.dart'; -part 'world.g.dart'; - -@Serializable(autoSnakeCaseNames: false) -abstract class _World { - num get id; - - num get randomNumber; -} diff --git a/frameworks/Dart/angel/lib/src/query/mongo.dart b/frameworks/Dart/angel/lib/src/query/mongo.dart deleted file mode 100644 index 5734c8581da..00000000000 --- a/frameworks/Dart/angel/lib/src/query/mongo.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'dart:async'; -import 'dart:math'; -import 'package:dart_angel_benchmark/src/models/fortune.dart'; -import 'package:mongo_dart/mongo_dart.dart'; -import '../models/models.dart'; -import 'querier.dart'; - -class MongoQuerier implements Querier { - final Db db; - final Random rnd; - final int worldTableSize; - DbCollection _fortunes, _worlds; - - MongoQuerier(this.db, this.rnd, this.worldTableSize) { - _fortunes = db.collection('fortune'); - _worlds = db.collection('world'); - } - - @override - Future> getFortunes() { - return _fortunes.find().map(FortuneSerializer.fromMap).toList(); - } - - @override - Future getRandomWorld() { - return _worlds - .findOne(where.skip(rnd.nextInt(worldTableSize))) - .then(WorldSerializer.fromMap); - } - - @override - Future updateWorld(id, World world) { - return _worlds - .update(where.eq('id', id), world.toJson()) - .then(WorldSerializer.fromMap); - } -} diff --git a/frameworks/Dart/angel/lib/src/query/postgres.dart b/frameworks/Dart/angel/lib/src/query/postgres.dart deleted file mode 100644 index 4881c6a6913..00000000000 --- a/frameworks/Dart/angel/lib/src/query/postgres.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'dart:async'; -import 'package:dart_angel_benchmark/src/models/fortune.dart'; -import 'package:postgres/postgres.dart'; -import '../models/models.dart'; -import 'querier.dart'; - -class PostgresQuerier implements Querier { - final PostgreSQLConnection connection; - - PostgresQuerier(this.connection); - - static Fortune parseFortune(List row) { - return Fortune(id: row[0], message: row[1]); - } - - static World parseWorld(List row) { - return World(id: row[0], randomNumber: row[1]); - } - - @override - Future> getFortunes() { - return connection.query('SELECT id, message FROM fortune').then((rows) { - return rows.map((parseFortune)).toList(); - }); - } - - @override - Future getRandomWorld() async { - var rows = await connection - .query('SELECT id, randomNumber FROM world ORDER BY RANDOM() LIMIT 1'); - return parseWorld(rows[0]); - } - - @override - Future updateWorld(id, World world) async { - await connection.query( - 'UPDATE world SET randomNumber = @randomNumber WHERE id = @id', - substitutionValues: {'id': id, 'randomNumber': world.randomNumber}); - return world; - } -} diff --git a/frameworks/Dart/angel/lib/src/query/querier.dart b/frameworks/Dart/angel/lib/src/query/querier.dart deleted file mode 100644 index 9b884cfd8fb..00000000000 --- a/frameworks/Dart/angel/lib/src/query/querier.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'dart:async'; -import '../models/models.dart'; - -abstract class Querier { - Future> getFortunes(); - - Future getRandomWorld(); - - Future updateWorld(id, World world); -} diff --git a/frameworks/Dart/angel/lib/src/query/query.dart b/frameworks/Dart/angel/lib/src/query/query.dart deleted file mode 100644 index bb3c901738e..00000000000 --- a/frameworks/Dart/angel/lib/src/query/query.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'mongo.dart'; -export 'postgres.dart'; -export 'querier.dart'; diff --git a/frameworks/Dart/angel/pubspec.yaml b/frameworks/Dart/angel/pubspec.yaml deleted file mode 100644 index 2cc75c88001..00000000000 --- a/frameworks/Dart/angel/pubspec.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: dart_angel_benchmark -publish_to: none -environment: - sdk: ">=2.0.0-dev <3.0.0" -dependencies: - angel_configuration: ^2.0.0 - angel_framework: ^2.0.0-alpha.22 - angel_model: ^1.0.0 - angel_serialize: ^2.0.0 - args: ^1.0.0 - mongo_dart: ^0.3.4 - mustache4dart: ^3.0.0-dev.0.0 - postgres: ^1.0.0 -dev_dependencies: - angel_serialize_generator: ^2.0.0 - build_runner: ^1.0.0 -dependency_overrides: - uuid: ^2.0.0-rc.1 diff --git a/frameworks/Dart/angel/views/fortunes.mustache b/frameworks/Dart/angel/views/fortunes.mustache deleted file mode 100644 index d85a356925b..00000000000 --- a/frameworks/Dart/angel/views/fortunes.mustache +++ /dev/null @@ -1 +0,0 @@ -Fortunes{{#fortunes}}{{/fortunes}}
idmessage
{{id}}{{message}}
\ No newline at end of file diff --git a/frameworks/Dart/aqueduct/README.md b/frameworks/Dart/aqueduct/README.md deleted file mode 100644 index 3ced19c82be..00000000000 --- a/frameworks/Dart/aqueduct/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Aqueduct Framework Benchmarking Test - -This test adds [Aqueduct](https://aqueduct.io), a microframework for Dart, to the [benchmarking test suite](../). The test is based on the Dart Benchmarking Test. - -## Versions - -* [Dart SDK version >=1.7.0](http://www.dartlang.org/) -* [Dart aqueduct version 2.5.0+1](https://pub.dartlang.org/packages/aqueduct) -* [Dart Mustache version 1.0.0](https://pub.dartlang.org/packages/mustache) - -## Test URLs - -### Common - -#### JSON Encoding Test -http://localhost:8080/json - -#### Plaintext Test -http://localhost:8080/plaintext - - -### PostgreSQL - -#### Data-Store/Database Mapping Test -http://localhost:8080/db - -#### Variable Query Test -http://localhost:8080/queries/2 - -#### Fortunes Test -http://localhost:8080/fortunes - -#### Data-Store/Database Update Test -http://localhost:8080/updates - -#### Variable Update Test -http://localhost:8080/updates/2 diff --git a/frameworks/Dart/aqueduct/aqueduct.dockerfile b/frameworks/Dart/aqueduct/aqueduct.dockerfile deleted file mode 100644 index 36fa1625861..00000000000 --- a/frameworks/Dart/aqueduct/aqueduct.dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM google/dart:1.24 - -COPY ./ ./ - -RUN pub upgrade - -EXPOSE 8080 - -CMD dart server.dart diff --git a/frameworks/Dart/aqueduct/benchmark_config.json b/frameworks/Dart/aqueduct/benchmark_config.json deleted file mode 100644 index df700883ac9..00000000000 --- a/frameworks/Dart/aqueduct/benchmark_config.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "framework": "aqueduct", - "tests": [{ - "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "db_url": "/db", - "query_url": "/queries/", - "update_url": "/updates/", - "fortune_url": "/fortunes", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "aqueduct", - "language": "Dart", - "flavor": "None", - "orm": "Micro", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "Aqueduct", - "notes": "", - "versus": "dart" - } - }] -} diff --git a/frameworks/Dart/aqueduct/config.toml b/frameworks/Dart/aqueduct/config.toml deleted file mode 100644 index d3c7937e68f..00000000000 --- a/frameworks/Dart/aqueduct/config.toml +++ /dev/null @@ -1,19 +0,0 @@ -[framework] -name = "aqueduct" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/db" -urls.query = "/queries/" -urls.update = "/updates/" -urls.fortune = "/fortunes" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "None" -versus = "dart" diff --git a/frameworks/Dart/aqueduct/config.yaml b/frameworks/Dart/aqueduct/config.yaml deleted file mode 100644 index d40239ce35c..00000000000 --- a/frameworks/Dart/aqueduct/config.yaml +++ /dev/null @@ -1,6 +0,0 @@ -database: - username: benchmarkdbuser - password: benchmarkdbpass - host: tfb-database - port: 5432 - databaseName: hello_world \ No newline at end of file diff --git a/frameworks/Dart/aqueduct/fortunes.mustache b/frameworks/Dart/aqueduct/fortunes.mustache deleted file mode 100644 index 77ea1a96cf5..00000000000 --- a/frameworks/Dart/aqueduct/fortunes.mustache +++ /dev/null @@ -1,20 +0,0 @@ - - - - Fortunes - - - - - - - - {{#fortunes}} - - - - - {{/fortunes}} -
idmessage
{{id}}{{message}}
- - diff --git a/frameworks/Dart/aqueduct/pubspec.yaml b/frameworks/Dart/aqueduct/pubspec.yaml deleted file mode 100644 index dedde56a8ee..00000000000 --- a/frameworks/Dart/aqueduct/pubspec.yaml +++ /dev/null @@ -1,11 +0,0 @@ -name: DartAqueductBenchmark -description: A Benchmark of Dart Aqueduct -version: 1.0.0 -author: Alexander Haslam - -environment: - sdk: '>=1.20.0 <2.0.0' - -dependencies: - aqueduct: ^2.5.0+1 - mustache: ^1.0.0 diff --git a/frameworks/Dart/aqueduct/server.dart b/frameworks/Dart/aqueduct/server.dart deleted file mode 100644 index 40f0f1fb5eb..00000000000 --- a/frameworks/Dart/aqueduct/server.dart +++ /dev/null @@ -1,227 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'dart:math'; - -import 'package:aqueduct/aqueduct.dart'; -import 'package:mustache/mustache.dart' as mustache; - -export 'dart:async'; -export 'dart:io'; -export 'package:aqueduct/aqueduct.dart'; - -final _stripped_text = new ContentType("text", "plain"); -final _stripped_json = new ContentType("application", "json"); - -final _random = new Random(); - -// World table size -const int _world_table_size = 10000; -// Fortune table size used only for generation of data -const int _FORTUNE_TABLE_SIZE = 100; - -const int _min_query_count = 1; -const int _max_query_count = 500; - -Future main() async { - try { - var app = new Application(); - var config = new ApplicationConfiguration() - ..port = 8080 - ..configurationFilePath = "config.yaml"; - - app.configuration = config; - int optimalInstanceCount = - (Platform.numberOfProcessors > 1 ? Platform.numberOfProcessors - 1 : 1); - await app.start( - numberOfInstances: optimalInstanceCount, consoleLogging: false); - } catch (e, st) { - await writeError("$e\n $st"); - } -} - -Future writeError(String error) async { - print("$error"); -} - -class Fortune extends ManagedObject<_Fortune> - implements _Fortune, Comparable { - compareTo(Fortune other) => message.compareTo(other.message); -} - -class _Fortune { - static String tableName() => "fortune"; - - @ManagedColumnAttributes(primaryKey: true) - int id; - - String message; -} - -class World extends ManagedObject<_World> implements _World {} - -class _World { - static String tableName() => "world"; - - @ManagedColumnAttributes(primaryKey: true) - int id; - - int randomNumber; -} - -/// This type initializes an application. -/// -/// Override methods in this class to set up routes and initialize resources like -/// database connections. See http://aqueduct.io/docs/http/request_sink. -class DartAqueductBenchmarkSink extends RequestSink { - mustache.Template fortunesTemplate; - - /// Resource initialization code goes here. - /// - /// Resources like [AuthServer] and [PostgreSQLPersistentStore] should be instantiated - /// in this constructor. Configuration behavior - like [HTTPCodecRepository.add] - should be - /// configured in this constructor. - /// - /// The [appConfig] contains configuration data from `aqueduct serve`, e.g. - /// the port the application is running on and the path to a configuration file. - DartAqueductBenchmarkSink(ApplicationConfiguration appConfig) - : super(appConfig) { - // Use logging for debuging only -// logger.onRecord.listen( -// (rec) => print("$rec ${rec.error ?? ""} ${rec.stackTrace ?? ""}")); - - var options = - new DartAqueductBenchmarkConfiguration(appConfig.configurationFilePath); - ManagedContext.defaultContext = contextWithConnectionInfo(options.database); - } - - /// Final initialization method for this instance. - /// - /// This method allows any resources that require asynchronous initialization to complete their - /// initialization process. This method is invoked after [setupRouter] and prior to this - /// instance receiving any requests. - @override - Future willOpen() async { - // Load the Mustache Template - final template = await new File('fortunes.mustache').readAsString(); - fortunesTemplate = new mustache.Template(template); - } - - /// All routes must be configured in this method. - /// - /// This method is invoked after the constructor and before [willOpen]. - /// All routes must be set up in this method and cannot be added after this method completes. - @override - void setupRouter(Router router) { - router - .route("/json") - .listen((req) async => new Response.ok({"message": "Hello, World!"}) - ..contentType = _stripped_json - ..headers["date"] = new DateTime.now()); - - router - .route("/plaintext") - .listen((req) async => new Response.ok("Hello, World!") - ..contentType = _stripped_text - ..headers["date"] = new DateTime.now()); - - router.route("/db").listen((req) async { - World result = await getRandomWorldObject(); - return new Response.ok(result) - ..contentType = _stripped_json - ..headers["date"] = new DateTime.now(); - }); - - router.route("/queries/[:queryCount]").listen((req) async { - int queryCount = _min_query_count; - if (req.path.variables.containsKey("queryCount")) { - queryCount = int - .parse(req.path.variables["queryCount"], onError: (_) => queryCount) - .clamp(_min_query_count, _max_query_count); - } - List resultFutures = - new List.generate(queryCount, (_) => getRandomWorldObject()); - List results = await Future.wait(resultFutures); - return new Response.ok(results) - ..contentType = _stripped_json - ..headers["date"] = new DateTime.now(); - }); - - router.route("/updates/[:queryCount]").listen((req) async { - int queryCount = _min_query_count; - if (req.path.variables.containsKey("queryCount")) { - queryCount = int - .parse(req.path.variables["queryCount"], onError: (_) => queryCount) - .clamp(_min_query_count, _max_query_count); - } - List resultFutures = new List.generate( - queryCount, - (_) => getRandomWorldObject().then((World world) async { - Query query = new Query() - ..where.id = whereEqualTo(world.id) - ..values.randomNumber = - (_random.nextInt(_world_table_size) + 1); - return query.updateOne(); - })); - List results = await Future.wait(resultFutures); - return new Response.ok(results) - ..contentType = _stripped_json - ..headers["date"] = new DateTime.now(); - }); - - router.route("/fortunes").listen((req) async { - Query query = new Query(); - List results = await query.fetch(); - results.add(new Fortune() - ..id = 0 - ..message = "Additional fortune added at request time."); - results.sort(); - - List resultsMapped = results - .map((Fortune fortune) => - {'id': fortune.id, 'message': fortune.message}) - .toList(); - - String renderedTemplate = - fortunesTemplate.renderString({'fortunes': resultsMapped}); - return new Response.ok(renderedTemplate) - ..contentType = ContentType.HTML - ..headers["date"] = new DateTime.now(); - }); - } - - Future getRandomWorldObject() async { - int worldId = _random.nextInt(_world_table_size) + 1; - Query query = new Query()..where.id = worldId; - return query.fetchOne(); - } - - /* - * Helper methods - */ - - ManagedContext contextWithConnectionInfo( - DatabaseConnectionConfiguration connectionInfo) { - var dataModel = new ManagedDataModel.fromCurrentMirrorSystem(); - var psc = new PostgreSQLPersistentStore.fromConnectionInfo( - connectionInfo.username, - connectionInfo.password, - connectionInfo.host, - connectionInfo.port, - connectionInfo.databaseName); - - return new ManagedContext(dataModel, psc); - } -} - -/// An instance of this class reads values from a configuration -/// file specific to this application. -/// -/// Configuration files must have key-value for the properties in this class. -/// For more documentation on configuration files, see https://aqueduct.io/docs/configure/ and -/// https://pub.dartlang.org/packages/safe_config. -class DartAqueductBenchmarkConfiguration extends ConfigurationItem { - DartAqueductBenchmarkConfiguration(String fileName) - : super.fromFile(fileName); - - DatabaseConnectionConfiguration database; -} diff --git a/frameworks/Dart/redstone/README.md b/frameworks/Dart/redstone/README.md deleted file mode 100644 index c07a2e660ae..00000000000 --- a/frameworks/Dart/redstone/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# Redstone.dart Framework Benchmarking Test - -This test adds [Redstone.dart](http://redstonedart.org), a microframework for Dart, to the [benchmarking test suite](../). The test is based on the Dart Benchmarking Test. - -## Versions - -* [Dart SDK version >=1.7.0](http://www.dartlang.org/) -* [Dart args version 0.10.0+2](http://pub.dartlang.org/packages/args) -* [Dart crypto version 0.9.0](http://pub.dartlang.org/packages/crypto) -* [Dart mustache version 0.1.8](http://pub.dartlang.org/packages/mustache) -* [Dart mongo_dart version 0.1.44](http://pub.dartlang.org/packages/mongo_dart) -* [Dart postgresql version 0.2.14](http://pub.dartlang.org/packages/postgresql) -* [Dart redstone version 0.5.18](http://pub.dartlang.org/packages/redstone) -* [Dart yaml version 2.0.1+1](http://pub.dartlang.org/packages/yaml) -* [Dart redstone_mapper version 0.1.9](http://pub.dartlang.org/packages/redstone_mapper) -* [Dart redstone_mapper_mongo version 0.1.1+1](http://pub.dartlang.org/packages/redstone_mapper_mongo) -* [Dart redstone_mapper_pg version 0.1.1](http://pub.dartlang.org/packages/redstone_mapper_pg) - -## Test URLs - -### Common - -#### JSON Encoding Test -http://localhost:8080/json - -#### Plaintext Test -http://localhost:8080/plaintext - - -### PostgreSQL - -#### Data-Store/Database Mapping Test -http://localhost:8080/pg/db - -#### Variable Query Test -http://localhost:8080/pg/queries?queries=2 - -#### Fortunes Test -http://localhost:8080/pg/fortunes - -#### Data-Store/Database Update Test -http://localhost:8080/pg/updates - -#### Variable Update Test -http://localhost:8080/pg/updates?queries=2 - - -### MongoDB - -#### Data-Store/Database Mapping Test -http://localhost:8080/mongo/db - -#### Variable Query Test -http://localhost:8080/mongo/queries?queries=2 - -#### Fortunes Test -http://localhost:8080/mongo/fortunes - -#### Data-Store/Database Update Test -http://localhost:8080/mongo/updates - -#### Variable Update Test -http://localhost:8080/mongo/updates?queries=2 - - diff --git a/frameworks/Dart/redstone/benchmark_config.json b/frameworks/Dart/redstone/benchmark_config.json deleted file mode 100644 index cff39cd1f43..00000000000 --- a/frameworks/Dart/redstone/benchmark_config.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "framework": "redstone", - "tests": [{ - "default": { - "json_url": "/json", - "db_url": "/pg/db", - "query_url": "/pg/queries?queries=", - "fortune_url": "/pg/fortunes", - "update_url": "/pg/updates?queries=", - "plaintext_url": "/plaintext", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "Postgres", - "framework": "redstone", - "language": "Dart", - "flavor": "None", - "orm": "Micro", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "redstone", - "notes": "", - "versus": "dart" - }, - "mongodb": { - "db_url": "/mongo/db", - "query_url": "/mongo/queries?queries=", - "fortune_url": "/mongo/fortunes", - "update_url": "/mongo/updates?queries=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MongoDB", - "framework": "redstone", - "language": "Dart", - "flavor": "None", - "orm": "Micro", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "redstone", - "notes": "", - "versus": "dart" - } - }] -} diff --git a/frameworks/Dart/redstone/config.toml b/frameworks/Dart/redstone/config.toml deleted file mode 100644 index f314442f4e3..00000000000 --- a/frameworks/Dart/redstone/config.toml +++ /dev/null @@ -1,34 +0,0 @@ -[framework] -name = "redstone" - -[main] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.db = "/pg/db" -urls.query = "/pg/queries?queries=" -urls.update = "/pg/updates?queries=" -urls.fortune = "/pg/fortunes" -approach = "Realistic" -classification = "Micro" -database = "Postgres" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "None" -versus = "dart" - -[mongodb] -urls.db = "/mongo/db" -urls.query = "/mongo/queries?queries=" -urls.update = "/mongo/updates?queries=" -urls.fortune = "/mongo/fortunes" -approach = "Realistic" -classification = "Micro" -database = "MongoDB" -database_os = "Linux" -os = "Linux" -orm = "Micro" -platform = "None" -webserver = "None" -versus = "dart" diff --git a/frameworks/Dart/redstone/fortunes.mustache b/frameworks/Dart/redstone/fortunes.mustache deleted file mode 100644 index 77ea1a96cf5..00000000000 --- a/frameworks/Dart/redstone/fortunes.mustache +++ /dev/null @@ -1,20 +0,0 @@ - - - - Fortunes - - - - - - - - {{#fortunes}} - - - - - {{/fortunes}} -
idmessage
{{id}}{{message}}
- - diff --git a/frameworks/Dart/redstone/mongodb.yaml b/frameworks/Dart/redstone/mongodb.yaml deleted file mode 100644 index 3fc0ff375d7..00000000000 --- a/frameworks/Dart/redstone/mongodb.yaml +++ /dev/null @@ -1,2 +0,0 @@ -host: tfb-database -database: hello_world diff --git a/frameworks/Dart/redstone/postgresql.yaml b/frameworks/Dart/redstone/postgresql.yaml deleted file mode 100644 index b57e64ef9be..00000000000 --- a/frameworks/Dart/redstone/postgresql.yaml +++ /dev/null @@ -1,5 +0,0 @@ -host: tfb-database -port: 5432 -user: benchmarkdbuser -password: benchmarkdbpass -database: hello_world diff --git a/frameworks/Dart/redstone/pubspec.yaml b/frameworks/Dart/redstone/pubspec.yaml deleted file mode 100644 index 342a5b40a7a..00000000000 --- a/frameworks/Dart/redstone/pubspec.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: DartRedstoneBenchmark -description: A benchmark of Redstone.dart, a server-side microframework for Dart -environment: - sdk: ">=1.7.0 <2.0.0" -dependencies: - crypto: 0.9.0 - mongo_dart: 0.1.44 - mustache: 0.1.8 - postgresql: 0.2.14 - redstone: 0.5.18 - redstone_mapper: 0.1.9 - redstone_mapper_mongo: 0.1.1+1 - redstone_mapper_pg: 0.1.1 - system_info: 0.0.16 - yaml: 2.0.1+1 \ No newline at end of file diff --git a/frameworks/Dart/redstone/redstone-mongodb.dockerfile b/frameworks/Dart/redstone/redstone-mongodb.dockerfile deleted file mode 100644 index a586c249289..00000000000 --- a/frameworks/Dart/redstone/redstone-mongodb.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM google/dart:1.24 - -WORKDIR /redstone -COPY fortunes.mustache fortunes.mustache -COPY mongodb.yaml mongodb.yaml -COPY postgresql.yaml postgresql.yaml -COPY pubspec.yaml pubspec.yaml -COPY server.dart server.dart - -RUN pub upgrade - -EXPOSE 8080 - -CMD ["dart", "server.dart"] diff --git a/frameworks/Dart/redstone/redstone.dockerfile b/frameworks/Dart/redstone/redstone.dockerfile deleted file mode 100644 index a586c249289..00000000000 --- a/frameworks/Dart/redstone/redstone.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM google/dart:1.24 - -WORKDIR /redstone -COPY fortunes.mustache fortunes.mustache -COPY mongodb.yaml mongodb.yaml -COPY postgresql.yaml postgresql.yaml -COPY pubspec.yaml pubspec.yaml -COPY server.dart server.dart - -RUN pub upgrade - -EXPOSE 8080 - -CMD ["dart", "server.dart"] diff --git a/frameworks/Dart/redstone/server.dart b/frameworks/Dart/redstone/server.dart deleted file mode 100644 index 265320d75d7..00000000000 --- a/frameworks/Dart/redstone/server.dart +++ /dev/null @@ -1,272 +0,0 @@ -import "dart:core"; -import "dart:io"; -import "dart:isolate"; -import 'dart:async' show Future; -import 'dart:math' show Random, max; -import "package:redstone/server.dart" as app; -import "package:redstone_mapper/mapper.dart"; -import "package:redstone_mapper/plugin.dart"; -import "package:redstone_mapper_mongo/manager.dart"; -import "package:redstone_mapper_pg/manager.dart"; -import "package:postgresql/postgresql.dart" as pg; -import "package:di/di.dart"; -import 'package:yaml/yaml.dart' as yaml; -import 'package:mustache/mustache.dart' as mustache; -import 'package:system_info/system_info.dart'; - -final _NUM_PROCESSORS = SysInfo.processors.length; - -const _WORLD_TABLE_SIZE = 10000; - -final _RANDOM = new Random(); - -class Fortune implements Comparable { - - @Field() - int id; - - @Field() - String message; - - Fortune([this.id, this.message]); - - compareTo(Fortune other) => message.compareTo(other.message); - -} - -class World { - - @Field() - int id; - - @Field(model: "randomnumber") - int randomNumber; - -} - -class MongoFortune implements Comparable { - - int _id; - - @Field(model: "_id") - int get id => _id; - - @Field(model: "_id") - set id(num value) => _id = value.toInt(); - - @Field() - String message; - - MongoFortune([this._id, this.message]); - - compareTo(MongoFortune other) => message.compareTo(other.message); - -} - -class MongoWorld { - - int _id; - int _randomNumber; - - @Field(model: "_id") - int get id => _id; - - @Field(model: "_id") - set id(num value) => _id = value.toInt(); - - @Field() - int get randomNumber => _randomNumber; - - @Field() - set randomNumber(num value) => _randomNumber = value.toInt(); - -} - -///Handle PostgreSql connections -@app.Interceptor(r'/pg/.+') -pgSqlManager(PostgreSqlManager pgSql) { - pgSql.getConnection().then((conn) { - app.request.attributes["dbConn"] = conn; - app.chain.next(() { - pgSql.closeConnection(conn, error: app.chain.error); - }); - }); -} - -///Handle MongoDb connections -@app.Interceptor(r'/mongo/.+') -mongoDbManager(MongoDbManager mongoDb) { - mongoDb.getConnection().then((conn) { - app.request.attributes["dbConn"] = conn; - app.chain.next(() { - mongoDb.closeConnection(conn, error: app.chain.error); - }); - }); -} - -///JSON test -@app.Route("/json") -getJson() => {"message": "Hello, World!"}; - -///PlainText test -@app.Route("/plaintext") -getPlainText() => "Hello, World!"; - -///PostgreSql tests -@app.Group("/pg") -@Encode() -class PgTests { - - static const worldQuery = 'SELECT id, randomnumber FROM world WHERE id = @id;'; - static const worldUpdt = 'UPDATE world SET randomnumber = @randomnumber WHERE id = @id;'; - - static const fortuneQuery = 'SELECT id, message FROM fortune;'; - - PostgreSql get pgSql => app.request.attributes["dbConn"]; - - @app.Route("/db") - Future queryTest() { - var params = { 'id': _RANDOM.nextInt(_WORLD_TABLE_SIZE) + 1 }; - return pgSql.query(worldQuery, World, params).then((list) => list[0]); - } - - @app.Route("/queries") - Future> queriesTest() { - var queries = _parseQueriesParam(app.request.queryParams.queries); - return Future.wait(new List.generate(queries, (_) => queryTest())); - } - - @app.Route("/updates") - Future> updateTest() { - var queries = _parseQueriesParam(app.request.queryParams.queries); - return Future.wait(new List.generate(queries, (_) => queryTest().then((world) { - world.randomNumber = _RANDOM.nextInt(_WORLD_TABLE_SIZE) + 1; - return pgSql.execute(worldUpdt, world).then((_) => world); - }))); - } - - @app.Route("/fortunes", responseType: "text/html;charset=utf-8") - Future fortunesTest(@app.Inject() mustache.Template template) { - return pgSql.query(fortuneQuery, Fortune).then((values) { - values - ..add(new Fortune(0, 'Additional fortune added at request time.')) - ..sort(); - - return template.renderString({ - "fortunes": encode(values) - }); - }); - } - -} - -///MongoDb tests -@app.Group("/mongo") -@Encode() -class MongoTests { - - static const worldCollection = "world"; - static const fortuneCollection = "fortune"; - - MongoDb get mongoDb => app.request.attributes["dbConn"]; - - @app.Route("/db") - Future queryTest() { - return mongoDb.findOne(worldCollection, MongoWorld, { - "_id": _RANDOM.nextInt(_WORLD_TABLE_SIZE) + 1 - }); - } - - @app.Route("/queries") - Future> queriesTest() { - var queries = _parseQueriesParam(app.request.queryParams.queries); - return Future.wait(new List.generate(queries, (_) => queryTest())); - } - - @app.Route("/updates") - Future> updateTest() { - var queries = _parseQueriesParam(app.request.queryParams.queries); - return Future.wait(new List.generate(queries, (_) => queryTest().then((world) { - world.randomNumber = _RANDOM.nextInt(_WORLD_TABLE_SIZE) + 1; - return mongoDb.update(worldCollection, { "_id": world.id }, world) - .then((_) => world); - }))); - } - - @app.Route("/fortunes", responseType: "text/html;charset=utf-8") - Future fortunesTest(@app.Inject() mustache.Template template) { - return mongoDb.find(fortuneCollection, MongoFortune).then((values) { - values - ..add(new MongoFortune(0, 'Additional fortune added at request time.')) - ..sort(); - - return template.renderString({ - "fortunes": encode(values) - }); - }); - } - -} - -main(List args) { - ReceivePort errorPort = new ReceivePort(); - errorPort.listen((e) => print(e)); - for (int i = 0; i < _NUM_PROCESSORS; i++) { - Isolate.spawn( - startInIsolate, - [], - onError: errorPort.sendPort); - } -} - -startInIsolate(List args) { - _startServer(); -} - -_startServer() { - var dbConnections = max(1, (256 / _NUM_PROCESSORS).floor()); - - var mongoDbManager = new MongoDbManager( - "mongodb://tfb-database/hello_world", - poolSize: dbConnections); - - var pgSqlManager = new PostgreSqlManager( - "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world", - min: dbConnections, - max: dbConnections); - - mustache.Template fortunesTemplate; - - Future.wait([ - - HttpServer.bind("0.0.0.0", 8080, shared: true), - - new File('fortunes.mustache').readAsString().then((template) { - fortunesTemplate = mustache.parse(template); - }) - - ]).then((List waitResults) { - var server = waitResults[0]; - - //app.setupConsoleLog(); - - //install module for dependency injection - app.addModule(new Module() - ..bind(MongoDbManager, toValue: mongoDbManager) - ..bind(PostgreSqlManager, toValue: pgSqlManager) - ..bind(mustache.Template, toValue: fortunesTemplate)); - - //initialize mapper plugin - app.addPlugin(getMapperPlugin()); - - //start the server - app.serveRequests(server); - - }); - -} - -_parseQueriesParam(param) { - return param == null || param.isEmpty ? 1 : - int.parse(param, radix: 10, onError: (_) => 1).clamp(1, 500); -} From 7f1100a9550a091862c4637613543f94a60c3d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BF=9E=E6=99=94?= <39583360+yuyenews@users.noreply.github.com> Date: Mon, 5 Apr 2021 07:56:42 +0800 Subject: [PATCH 07/11] update martian (#6516) * test martian * martian * martian * add readme.md * edit dockerfile * edit dockerfile * edit dockerfile * test martian * test martian * test martian * test martian * test martian * test martian * test martian * add martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian * update martian --- frameworks/Java/martian/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/martian/pom.xml b/frameworks/Java/martian/pom.xml index f3a8f1c7eb1..e26a84d4acf 100644 --- a/frameworks/Java/martian/pom.xml +++ b/frameworks/Java/martian/pom.xml @@ -18,7 +18,7 @@ com.github.yuyenews mars-starter - 3.3.1 + 3.3.3 From ef78f27ee2bc9d815bf3594c7027676b6e895d5d Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Mon, 5 Apr 2021 07:56:55 +0800 Subject: [PATCH 08/11] Update 2.3.0 (#6513) * Delete redkale-zgc.dockerfile * Delete redkale-io.dockerfile * Delete redkale.dockerfile * Update and rename redkale-pgc.dockerfile to redkale.dockerfile * Update redkale-cache.dockerfile * Update redkale-postgres.dockerfile * Update Service.java * Update config.toml * Update benchmark_config.json * Update benchmark_config.json * Update Service.java * Update benchmark_config.json * Create Message.java * Update Service.java * Update redkale-postgres.dockerfile * Update pom.xml * Update benchmark_config.json * Update pom.xml * Update FortunesTemplate.rocker.html * Update FortunesTemplate.rocker.html * Update benchmark_config.json * Update application.xml --- frameworks/Java/redkale/benchmark_config.json | 29 +++++++------------ frameworks/Java/redkale/conf/application.xml | 3 +- frameworks/Java/redkale/config.toml | 25 +++++----------- .../Java/redkale/redkale-cache.dockerfile | 6 ++-- ...e-pgc.dockerfile => redkale-db.dockerfile} | 2 +- ....dockerfile => redkale-fortune.dockerfile} | 2 +- ...io.dockerfile => redkale-query.dockerfile} | 6 ++-- ...s.dockerfile => redkale-update.dockerfile} | 6 ++-- frameworks/Java/redkale/redkale.dockerfile | 6 ++-- .../java/org/redkalex/benchmark/Message.java | 7 +++++ .../java/org/redkalex/benchmark/Service.java | 10 +++---- .../benchmark/FortunesTemplate.rocker.html | 19 ++++-------- 12 files changed, 51 insertions(+), 70 deletions(-) rename frameworks/Java/redkale/{redkale-pgc.dockerfile => redkale-db.dockerfile} (77%) rename frameworks/Java/redkale/{redkale-zgc.dockerfile => redkale-fortune.dockerfile} (63%) rename frameworks/Java/redkale/{redkale-io.dockerfile => redkale-query.dockerfile} (62%) rename frameworks/Java/redkale/{redkale-postgres.dockerfile => redkale-update.dockerfile} (62%) diff --git a/frameworks/Java/redkale/benchmark_config.json b/frameworks/Java/redkale/benchmark_config.json index 56cf569cb03..3268f50ddbf 100644 --- a/frameworks/Java/redkale/benchmark_config.json +++ b/frameworks/Java/redkale/benchmark_config.json @@ -39,11 +39,8 @@ "notes": "", "versus": "Redkale" }, - "postgres": { + "db": { "db_url": "/db", - "fortune_url": "/fortunes", - "query_url": "/queries?q=", - "update_url": "/updates?q=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -60,10 +57,8 @@ "notes": "", "versus": "Redkale" }, - "pgc": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "cached_query_url": "/cached-worlds?q=", + "query": { + "query_url": "/queries?q=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -76,14 +71,12 @@ "webserver": "Redkale", "os": "Linux", "database_os": "Linux", - "display_name": "redkale-pgc", + "display_name": "redkale", "notes": "", "versus": "Redkale" }, - "zgc": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "cached_query_url": "/cached-worlds?q=", + "fortune": { + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -96,14 +89,12 @@ "webserver": "Redkale", "os": "Linux", "database_os": "Linux", - "display_name": "redkale-zgc", + "display_name": "redkale", "notes": "", "versus": "Redkale" }, - "io": { - "plaintext_url": "/plaintext", - "json_url": "/json", - "cached_query_url": "/cached-worlds?q=", + "update": { + "update_url": "/updates?q=", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -116,7 +107,7 @@ "webserver": "Redkale", "os": "Linux", "database_os": "Linux", - "display_name": "redkale-io", + "display_name": "redkale", "notes": "", "versus": "Redkale" } diff --git a/frameworks/Java/redkale/conf/application.xml b/frameworks/Java/redkale/conf/application.xml index 4bcc0112d6d..7e709c30812 100644 --- a/frameworks/Java/redkale/conf/application.xml +++ b/frameworks/Java/redkale/conf/application.xml @@ -6,12 +6,13 @@ + - + diff --git a/frameworks/Java/redkale/config.toml b/frameworks/Java/redkale/config.toml index e12546fdf2d..1983c168f36 100644 --- a/frameworks/Java/redkale/config.toml +++ b/frameworks/Java/redkale/config.toml @@ -6,7 +6,7 @@ urls.plaintext = "/plaintext" urls.json = "/json" approach = "Realistic" classification = "Fullstack" -database = "None" +database = "Postgres" database_os = "Linux" os = "Linux" orm = "Raw" @@ -26,11 +26,8 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[postgres] +[db] urls.db = "/db" -urls.fortune = "/fortunes" -urls.query = "/queries?q=" -urls.update = "/updates?q=" approach = "Realistic" classification = "Fullstack" database = "Postgres" @@ -41,10 +38,8 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[pgc] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.cached_query = "/cached-worlds?q=" +[fortune] +urls.fortune = "/fortunes" approach = "Realistic" classification = "Fullstack" database = "Postgres" @@ -55,10 +50,8 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[zgc] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.cached_query = "/cached-worlds?q=" +[query] +urls.query = "/queries?q=" approach = "Realistic" classification = "Fullstack" database = "Postgres" @@ -69,10 +62,8 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" -[io] -urls.plaintext = "/plaintext" -urls.json = "/json" -urls.cached_query = "/cached-worlds?q=" +[update] +urls.update = "/updates?q=" approach = "Realistic" classification = "Fullstack" database = "Postgres" diff --git a/frameworks/Java/redkale/redkale-cache.dockerfile b/frameworks/Java/redkale/redkale-cache.dockerfile index 8e7552fb8b1..173f5708d3b 100644 --- a/frameworks/Java/redkale/redkale-cache.dockerfile +++ b/frameworks/Java/redkale/redkale-cache.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.6.3-openjdk-16-slim as maven WORKDIR /redkale COPY src src COPY conf conf COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:16-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dbenchmarks.cache=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=20000", "-Dbenchmarks.cache=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] diff --git a/frameworks/Java/redkale/redkale-pgc.dockerfile b/frameworks/Java/redkale/redkale-db.dockerfile similarity index 77% rename from frameworks/Java/redkale/redkale-pgc.dockerfile rename to frameworks/Java/redkale/redkale-db.dockerfile index 09f8f665881..38e8fe0c0f6 100644 --- a/frameworks/Java/redkale/redkale-pgc.dockerfile +++ b/frameworks/Java/redkale/redkale-db.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=160000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=20000", "-Dbenchmarks.db=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] diff --git a/frameworks/Java/redkale/redkale-zgc.dockerfile b/frameworks/Java/redkale/redkale-fortune.dockerfile similarity index 63% rename from frameworks/Java/redkale/redkale-zgc.dockerfile rename to frameworks/Java/redkale/redkale-fortune.dockerfile index e8174ab3508..38e8fe0c0f6 100644 --- a/frameworks/Java/redkale/redkale-zgc.dockerfile +++ b/frameworks/Java/redkale/redkale-fortune.dockerfile @@ -12,4 +12,4 @@ COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark. EXPOSE 8080 -CMD ["java", "-server", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseZGC", "-XX:AutoBoxCacheMax=160000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=20000", "-Dbenchmarks.db=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] diff --git a/frameworks/Java/redkale/redkale-io.dockerfile b/frameworks/Java/redkale/redkale-query.dockerfile similarity index 62% rename from frameworks/Java/redkale/redkale-io.dockerfile rename to frameworks/Java/redkale/redkale-query.dockerfile index a1cf0456b78..38e8fe0c0f6 100644 --- a/frameworks/Java/redkale/redkale-io.dockerfile +++ b/frameworks/Java/redkale/redkale-query.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.6.3-openjdk-16-slim as maven WORKDIR /redkale COPY src src COPY conf conf COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:16-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-Dio.direct.fd=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=20000", "-Dbenchmarks.db=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] diff --git a/frameworks/Java/redkale/redkale-postgres.dockerfile b/frameworks/Java/redkale/redkale-update.dockerfile similarity index 62% rename from frameworks/Java/redkale/redkale-postgres.dockerfile rename to frameworks/Java/redkale/redkale-update.dockerfile index 8ba5a17e88d..38e8fe0c0f6 100644 --- a/frameworks/Java/redkale/redkale-postgres.dockerfile +++ b/frameworks/Java/redkale/redkale-update.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.6.3-openjdk-16-slim as maven WORKDIR /redkale COPY src src COPY conf conf COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:16-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=20000", "-Dbenchmarks.db=true", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] diff --git a/frameworks/Java/redkale/redkale.dockerfile b/frameworks/Java/redkale/redkale.dockerfile index bca46bb7106..2f5508fc106 100644 --- a/frameworks/Java/redkale/redkale.dockerfile +++ b/frameworks/Java/redkale/redkale.dockerfile @@ -1,15 +1,15 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.6.3-openjdk-16-slim as maven WORKDIR /redkale COPY src src COPY conf conf COPY pom.xml pom.xml RUN mvn package -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:16-jdk-slim WORKDIR /redkale COPY conf conf COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-XX:AutoBoxCacheMax=320000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:AutoBoxCacheMax=20000", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java index 905e1b0612e..05b65cb3b48 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Message.java @@ -14,6 +14,8 @@ */ public final class Message { + private static final Message instance = new Message(); + @ConvertSmallString private String message; @@ -24,6 +26,11 @@ public Message(String message) { this.message = message; } + public static Message create(String str) { + instance.message = str; + return instance; + } + public String getMessage() { return message; } diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Service.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Service.java index b3b2b645917..74a1c981cc9 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Service.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/Service.java @@ -31,8 +31,8 @@ public class Service extends AbstractService { @Override public void init(AnyValue conf) { - if (source instanceof DataSqlSource) { - this.cache = ((DataSqlSource) source).loadCache(CachedWorld.class); + if (Boolean.getBoolean("benchmarks.cache")) { + this.cache = ((DataSqlSource) source).loadCache(CachedWorld.class).array(); } } @@ -41,9 +41,9 @@ public byte[] getHelloBytes() { return helloBytes; } - @RestMapping(name = "json") + @RestMapping(name = "json", length = 27) public Message getHelloMessage() { - return new Message("Hello, World!"); + return Message.create("Hello, World!"); } @RestMapping(name = "db") @@ -93,7 +93,7 @@ public CachedWorld[] cachedWorlds(int q) { final int size = Math.min(500, Math.max(1, q)); final CachedWorld[] worlds = new CachedWorld[size]; for (int i = 0; i < size; i++) { - worlds[i] = cache.find(randomId()); + worlds[i] = cache.findAt(randomId()); } return worlds; } diff --git a/frameworks/Java/redkale/src/main/templates/org/redkalex/benchmark/FortunesTemplate.rocker.html b/frameworks/Java/redkale/src/main/templates/org/redkalex/benchmark/FortunesTemplate.rocker.html index b314745d9d8..dc54b86e47e 100644 --- a/frameworks/Java/redkale/src/main/templates/org/redkalex/benchmark/FortunesTemplate.rocker.html +++ b/frameworks/Java/redkale/src/main/templates/org/redkalex/benchmark/FortunesTemplate.rocker.html @@ -1,18 +1,9 @@ @import org.redkalex.benchmark.Fortune @import java.util.List @args(List fortunes) - - + Fortunes - - - - - - @for (fortune : fortunes) { - - - - }
idmessage
@fortune.getId()@fortune.getMessage()
- - + +@for (fortune : fortunes) { +} +
idmessage
@fortune.getId()@fortune.getMessage()
From 5e1032e15b95121db58484bcbfc40723b4600bc5 Mon Sep 17 00:00:00 2001 From: James Bates Date: Sun, 4 Apr 2021 23:57:45 +0000 Subject: [PATCH 09/11] Add FaF (rust) framework (#6491) * add faf framework * add faf framework * clean up code and slight reorg * add HTTP methods and cleanup * converted to a library format, updated docker to point to a tag, generally simplified * simplified README.md --- frameworks/Rust/faf/.gitignore | 4 + frameworks/Rust/faf/Cargo.toml | 18 ++++ frameworks/Rust/faf/README.md | 4 + frameworks/Rust/faf/benchmark_config.json | 25 ++++++ frameworks/Rust/faf/config.toml | 15 ++++ frameworks/Rust/faf/faf.dockerfile | 14 ++++ frameworks/Rust/faf/merged.profdata | Bin 0 -> 113872 bytes frameworks/Rust/faf/src/main.rs | 97 ++++++++++++++++++++++ 8 files changed, 177 insertions(+) create mode 100644 frameworks/Rust/faf/.gitignore create mode 100644 frameworks/Rust/faf/Cargo.toml create mode 100644 frameworks/Rust/faf/README.md create mode 100644 frameworks/Rust/faf/benchmark_config.json create mode 100644 frameworks/Rust/faf/config.toml create mode 100644 frameworks/Rust/faf/faf.dockerfile create mode 100644 frameworks/Rust/faf/merged.profdata create mode 100644 frameworks/Rust/faf/src/main.rs diff --git a/frameworks/Rust/faf/.gitignore b/frameworks/Rust/faf/.gitignore new file mode 100644 index 00000000000..4c97c40457d --- /dev/null +++ b/frameworks/Rust/faf/.gitignore @@ -0,0 +1,4 @@ +/target +/docs +/.vscode +/prof diff --git a/frameworks/Rust/faf/Cargo.toml b/frameworks/Rust/faf/Cargo.toml new file mode 100644 index 00000000000..432cb421243 --- /dev/null +++ b/frameworks/Rust/faf/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "faf-ex" +version = "0.1.0" +authors = ["James Bates "] +edition = "2018" + +[profile.release] +opt-level = 3 +panic = 'unwind' +codegen-units = 1 +lto = "thin" +debug = false +overflow-checks = false + +[dependencies] +mimalloc = { version = "*", default-features = false } +faf = { git = "https://github.com/errantmind/faf" } +#faf = { path = "/home/errant/dev/projects/faf-epoll" } diff --git a/frameworks/Rust/faf/README.md b/frameworks/Rust/faf/README.md new file mode 100644 index 00000000000..9f26cb0fc83 --- /dev/null +++ b/frameworks/Rust/faf/README.md @@ -0,0 +1,4 @@ +# faf +FaF is a Linux webserver written in Rust. It has a single goal: to demonstrate the upper bound of possible single-node performance. It is meant as a living reference project and may have cutting edge dependencies. Being a reference project, documentation and simplicity are essential and will be maintained to the best of my ability. + +[FaF Repo](https://github.com/errantmind/faf) diff --git a/frameworks/Rust/faf/benchmark_config.json b/frameworks/Rust/faf/benchmark_config.json new file mode 100644 index 00000000000..283500e21a3 --- /dev/null +++ b/frameworks/Rust/faf/benchmark_config.json @@ -0,0 +1,25 @@ +{ + "framework": "faf", + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "port": 8089, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "faf", + "language": "Rust", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "None", + "display_name": "faf", + "notes": "", + "versus": "None" + } + } + ] +} diff --git a/frameworks/Rust/faf/config.toml b/frameworks/Rust/faf/config.toml new file mode 100644 index 00000000000..f086428aa5a --- /dev/null +++ b/frameworks/Rust/faf/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "faf" + +[main] +urls.plaintext = "/plaintext" +# urls.json = "/j" +approach = "Realistic" +classification = "Platform" +database = "None" +database_os = "None" +os = "Linux" +orm = "None" +platform = "None" +webserver = "None" +versus = "None" diff --git a/frameworks/Rust/faf/faf.dockerfile b/frameworks/Rust/faf/faf.dockerfile new file mode 100644 index 00000000000..b738144ff78 --- /dev/null +++ b/frameworks/Rust/faf/faf.dockerfile @@ -0,0 +1,14 @@ +FROM errantmind/debian-faf:v2 + +COPY ./Cargo.toml ./Cargo.toml +COPY ./src ./src +COPY ./merged.profdata ./merged.profdata +ENV CC=/usr/bin/clang-12 +ENV CXX=/usr/bin/clang++-12 +RUN /root/.cargo/bin/cargo update +RUN RUSTFLAGS="-Ctarget-cpu=native -Clinker=/usr/bin/clang-12 -Clink-arg=-fuse-ld=lld-12 -Clink-arg=-flto=thin \ + -Clto=thin -Cembed-bitcode=yes -Copt-level=3 -Ccodegen-units=1 -Cforce-frame-pointers=n -Cprofile-use=/faf/merged.profdata" \ + /root/.cargo/bin/cargo build --verbose --release && strip --strip-all target/release/faf-ex + +EXPOSE 8089 +CMD ./target/release/faf-ex diff --git a/frameworks/Rust/faf/merged.profdata b/frameworks/Rust/faf/merged.profdata new file mode 100644 index 0000000000000000000000000000000000000000..5e0bf74e1804ef51bbe82b76894fa937c0718df1 GIT binary patch literal 113872 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 literal 0 HcmV?d00001 diff --git a/frameworks/Rust/faf/src/main.rs b/frameworks/Rust/faf/src/main.rs new file mode 100644 index 00000000000..38df62a5585 --- /dev/null +++ b/frameworks/Rust/faf/src/main.rs @@ -0,0 +1,97 @@ +#[global_allocator] +static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; + +use faf::const_concat_bytes; +use faf::const_config::*; +use faf::const_http::*; +use faf::extern_http_date; +use faf::util::{const_len, memcmp}; + +const ROUTE_PLAINTEXT: &[u8] = b"/p"; +const ROUTE_PLAINTEXT_LEN: usize = const_len(ROUTE_PLAINTEXT); +const ROUTE_JSON: &[u8] = b"/j"; +const ROUTE_JSON_LEN: usize = const_len(ROUTE_JSON); + +const TEXT_PLAIN_CONTENT_TYPE: &[u8] = b"Content-Type: text/plain"; +const CONTENT_LENGTH: &[u8] = b"Content-Length: "; +const PLAINTEXT_BODY: &[u8] = b"Hello, World!"; +const PLAINTEXT_BODY_LEN: usize = const_len(PLAINTEXT_BODY); +const PLAINTEXT_BODY_SIZE: &[u8] = b"13"; + +const PLAINTEXT_BASE: &[u8] = const_concat_bytes!( + HTTP_200_OK, + CRLF, + SERVER, + CRLF, + TEXT_PLAIN_CONTENT_TYPE, + CRLF, + CONTENT_LENGTH, + PLAINTEXT_BODY_SIZE, + CRLF +); + +const PLAINTEXT_BASE_LEN: usize = const_len(PLAINTEXT_BASE); + +#[inline] +fn cb( + method: *const i8, + method_len: usize, + path: *const i8, + path_len: usize, + _headers: &[faf::phr_header; MAX_HEADERS_TO_PARSE], + _num_headers: usize, + response_buffer: &mut [u8; REQ_RES_BUFF_SIZE], +) -> usize { + if method_len < GET_LEN || path_len < ROUTE_PLAINTEXT_LEN { + return 0; + } + unsafe { + if memcmp(GET.as_ptr() as *const i8, method, GET_LEN) == 0 { + // For performance purposes, this will successfully match '/p' to '/plaintext' and '/pickle'. Use with caution + if memcmp(ROUTE_PLAINTEXT.as_ptr() as *const i8, path, ROUTE_PLAINTEXT_LEN) == 0 { + let mut date_buff = crate::extern_http_date::get_buff_with_date(); + extern_http_date::get_http_date(&mut date_buff); + std::ptr::copy_nonoverlapping(PLAINTEXT_BASE.as_ptr(), response_buffer.as_mut_ptr(), PLAINTEXT_BASE_LEN); + std::ptr::copy_nonoverlapping( + date_buff.as_ptr(), + response_buffer.as_mut_ptr().add(PLAINTEXT_BASE_LEN), + DATE_LEN, + ); + std::ptr::copy_nonoverlapping( + CRLFCRLF.as_ptr(), + response_buffer.as_mut_ptr().add(PLAINTEXT_BASE_LEN + DATE_LEN), + CRLFCRLF_LEN, + ); + std::ptr::copy_nonoverlapping( + PLAINTEXT_BODY.as_ptr(), + response_buffer.as_mut_ptr().add(PLAINTEXT_BASE_LEN + DATE_LEN + CRLFCRLF_LEN), + PLAINTEXT_BODY_LEN, + ); + + return PLAINTEXT_BASE_LEN + DATE_LEN + CRLFCRLF_LEN + PLAINTEXT_BODY_LEN; + } else if memcmp(ROUTE_JSON.as_ptr() as *const i8, path, ROUTE_JSON_LEN) == 0 { + } else { + std::ptr::copy_nonoverlapping( + HTTP_404_NOTFOUND.as_ptr(), + response_buffer.as_mut_ptr(), + HTTP_404_NOTFOUND_LEN, + ); + return HTTP_404_NOTFOUND_LEN; + } + } else { + std::ptr::copy_nonoverlapping( + HTTP_405_NOTALLOWED.as_ptr(), + response_buffer.as_mut_ptr(), + HTTP_405_NOTALLOWED_LEN, + ); + return HTTP_405_NOTALLOWED_LEN; + } + }; + + 0 +} + +#[inline] +fn main() { + faf::epoll::go(8089, cb); +} From ba6b3a3618e023497f71f41e666e31fc3d66f7f7 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 5 Apr 2021 01:00:49 +0100 Subject: [PATCH 10/11] ASP.NET Core naming clarity (#6507) --- .../aspnetcore-corert/benchmark_config.json | 2 +- .../aspcore-mono-mvc-my.dockerfile | 14 ----- .../aspcore-mono-mw-my.dockerfile | 14 ----- .../aspnetcore-mono/benchmark_config.json | 54 +++---------------- .../CSharp/aspnetcore/benchmark_config.json | 42 +++++++-------- frameworks/CSharp/ben/benchmark_config.json | 2 +- frameworks/CSharp/nancy/benchmark_config.json | 4 +- 7 files changed, 31 insertions(+), 101 deletions(-) delete mode 100644 frameworks/CSharp/aspnetcore-mono/aspcore-mono-mvc-my.dockerfile delete mode 100644 frameworks/CSharp/aspnetcore-mono/aspcore-mono-mw-my.dockerfile diff --git a/frameworks/CSharp/aspnetcore-corert/benchmark_config.json b/frameworks/CSharp/aspnetcore-corert/benchmark_config.json index d40f6754e07..a11a6220f07 100644 --- a/frameworks/CSharp/aspnetcore-corert/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore-corert/benchmark_config.json @@ -16,7 +16,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core", + "display_name": "ASP.NET Core [Platform, CoreRT]", "notes": "", "versus": "aspcore" } diff --git a/frameworks/CSharp/aspnetcore-mono/aspcore-mono-mvc-my.dockerfile b/frameworks/CSharp/aspnetcore-mono/aspcore-mono-mvc-my.dockerfile deleted file mode 100644 index ac9cfa2c615..00000000000 --- a/frameworks/CSharp/aspnetcore-mono/aspcore-mono-mvc-my.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build -WORKDIR /app -COPY Benchmarks . -RUN dotnet publish -c Release -o out - -FROM mcr.microsoft.com/dotnet/runtime-deps:5.0 AS runtime -ENV ASPNETCORE_URLS http://+:8080 -WORKDIR /app -COPY --from=build /app/out ./ -COPY Benchmarks/appsettings.mysql.json ./appsettings.json - -EXPOSE 8080 - -ENTRYPOINT ["./Benchmarks", "scenarios=MvcDbSingleQueryRaw,MvcDbMultiQueryRaw,MvcDbMultiUpdateRaw,MvcDbFortunesRaw"] \ No newline at end of file diff --git a/frameworks/CSharp/aspnetcore-mono/aspcore-mono-mw-my.dockerfile b/frameworks/CSharp/aspnetcore-mono/aspcore-mono-mw-my.dockerfile deleted file mode 100644 index 4ff4bcab899..00000000000 --- a/frameworks/CSharp/aspnetcore-mono/aspcore-mono-mw-my.dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build -WORKDIR /app -COPY Benchmarks . -RUN dotnet publish -c Release -o out - -FROM mcr.microsoft.com/dotnet/runtime-deps:5.0 AS runtime -ENV ASPNETCORE_URLS http://+:8080 -WORKDIR /app -COPY --from=build /app/out ./ -COPY Benchmarks/appsettings.mysql.json ./appsettings.json - -EXPOSE 8080 - -ENTRYPOINT ["./Benchmarks", "scenarios=DbSingleQueryRaw,DbMultiQueryRaw,DbMultiUpdateRaw,DbFortunesRaw"] \ No newline at end of file diff --git a/frameworks/CSharp/aspnetcore-mono/benchmark_config.json b/frameworks/CSharp/aspnetcore-mono/benchmark_config.json index 734d119f444..e52c7d74b55 100644 --- a/frameworks/CSharp/aspnetcore-mono/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore-mono/benchmark_config.json @@ -16,7 +16,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core on Mono", + "display_name": "ASP.NET Core [Platform, Mono]", "notes": "", "versus": "aspcore" }, @@ -38,7 +38,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core on Mono", + "display_name": "ASP.NET Core [Platform, Mono, Pg]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -57,7 +57,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core on Mono, Middleware", + "display_name": "ASP.NET Core [Middleware, Mono]", "notes": "", "versus": "aspcore-mono" }, @@ -78,31 +78,10 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core on Mono, Middleware", + "display_name": "ASP.NET Core [Middleware, Mono, Pg]", "notes": "", "versus": "aspcore-mono-pg" }, - "mw-my": { - "db_url": "/db/raw", - "query_url": "/queries/raw?queries=", - "update_url": "/updates/raw?queries=", - "fortune_url": "/fortunes/raw", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "MySQL", - "framework": "ASP.NET Core", - "language": "C#", - "orm": "Raw", - "platform": ".NET", - "flavor": "Mono", - "webserver": "Kestrel", - "os": "Linux", - "database_os": "Linux", - "display_name": "ASP.NET Core on Mono, Middleware", - "notes": "", - "versus": "aspcore-mono-my" - }, "mvc": { "plaintext_url": "/mvc/plaintext", "json_url": "/mvc/json", @@ -118,7 +97,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core on Mono, MVC", + "display_name": "ASP.NET Core [MVC, Mono]", "notes": "", "versus": "aspcore-mono" }, @@ -139,30 +118,9 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core on Mono, MVC", + "display_name": "ASP.NET Core [MVC, Mono, Pg]", "notes": "", "versus": "aspcore-mono-pg" - }, - "mvc-my": { - "db_url": "/mvc/db/raw", - "query_url": "/mvc/queries/raw?queries=", - "update_url": "/mvc/updates/raw?queries=", - "fortune_url": "/mvc/fortunes/raw", - "port": 8080, - "approach": "Realistic", - "classification": "Fullstack", - "database": "MySQL", - "framework": "ASP.NET Core", - "language": "C#", - "orm": "Raw", - "platform": ".NET", - "flavor": "Mono", - "webserver": "Kestrel", - "os": "Linux", - "database_os": "Linux", - "display_name": "ASP.NET Core on Mono, MVC", - "notes": "", - "versus": "aspcore-mono-my" } }] } \ No newline at end of file diff --git a/frameworks/CSharp/aspnetcore/benchmark_config.json b/frameworks/CSharp/aspnetcore/benchmark_config.json index c024cd665eb..d7dcaff7afd 100644 --- a/frameworks/CSharp/aspnetcore/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore/benchmark_config.json @@ -16,7 +16,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core", + "display_name": "ASP.NET Core [Platform]", "notes": "", "versus": "aspcore" }, @@ -37,7 +37,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, ADO.NET", + "display_name": "ASP.NET Core [Platform, Pg]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -55,7 +55,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, ADO.NET", + "display_name": "ASP.NET Core [Platform,Pg]", "notes": "", "versus": "aspcore-ado-pg-up" }, @@ -73,7 +73,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware", + "display_name": "ASP.NET Core [Middleware]", "notes": "", "versus": "aspcore" }, @@ -91,7 +91,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, Json", + "display_name": "ASP.NET Core [Middleware]", "notes": "", "versus": "aspcore" }, @@ -111,7 +111,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, ADO.NET", + "display_name": "ASP.NET Core [Middleware, Pg]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -129,7 +129,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, ADO.NET", + "display_name": "ASP.NET Core [Middleware, Pg]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -149,7 +149,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, Entity Framework Core", + "display_name": "ASP.NET Core [Middleware, Pg, EF]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -167,7 +167,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, Entity Framework Core", + "display_name": "ASP.NET Core [Middleware, Pg, EF]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -187,7 +187,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, Dapper", + "display_name": "ASP.NET Core {Middleware, Pg, Dapper]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -205,7 +205,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, Dapper", + "display_name": "ASP.NET Core [Middleware, Pg, Dapper]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -226,7 +226,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, ADO.NET", + "display_name": "ASP.NET Core [Middleware, My]", "notes": "", "versus": "aspcore-ado-my" }, @@ -247,7 +247,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, Middleware, Dapper", + "display_name": "ASP.NET Core [Middleware, My, Dapper]", "notes": "", "versus": "aspcore-ado-my" }, @@ -286,7 +286,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, ADO.NET", + "display_name": "ASP.NET Core [MVC, Pg]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -304,7 +304,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, ADO.NET", + "display_name": "ASP.NET Core [MVC, Pg]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -324,7 +324,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, Entity Framework Core", + "display_name": "ASP.NET Core [MVC, Pg, EF]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -342,7 +342,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, Entity Framework Core", + "display_name": "ASP.NET Core [MVC, Pg, EF]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -362,7 +362,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, Dapper", + "display_name": "ASP.NET Core [MVC, Pg, Dapper]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -380,7 +380,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, Dapper", + "display_name": "ASP.NET Core [MVC, Pg, Dapper]", "notes": "", "versus": "aspcore-ado-pg" }, @@ -401,7 +401,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, Raw", + "display_name": "ASP.NET Core [MVC, My]", "notes": "", "versus": "aspcore-ado-my" }, @@ -422,7 +422,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "ASP.NET Core, MVC, Dapper", + "display_name": "ASP.NET Core [MVC, My, Dapper]", "notes": "", "versus": "aspcore-ado-my" } diff --git a/frameworks/CSharp/ben/benchmark_config.json b/frameworks/CSharp/ben/benchmark_config.json index 8081f86b5a1..b2678519679 100644 --- a/frameworks/CSharp/ben/benchmark_config.json +++ b/frameworks/CSharp/ben/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "Ben", + "display_name": "Ben [Kestrel]", "notes": "", "versus": "aspcore" } diff --git a/frameworks/CSharp/nancy/benchmark_config.json b/frameworks/CSharp/nancy/benchmark_config.json index 0d6df139beb..60286ac81ae 100644 --- a/frameworks/CSharp/nancy/benchmark_config.json +++ b/frameworks/CSharp/nancy/benchmark_config.json @@ -18,7 +18,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "Nancy on ASP.NET Core on Mono", + "display_name": "Nancy [ASP.NET Core, Mono, My]", "notes": "", "versus": "aspcore-mono" }, @@ -39,7 +39,7 @@ "webserver": "Kestrel", "os": "Linux", "database_os": "Linux", - "display_name": "Nancy on ASP.NET Core on .NET Core", + "display_name": "Nancy [ASP.NET Core, My]", "notes": "", "versus": "aspcore" } From 26ab4804f967fb7af1d8ebdf99dbc18c9a1e39e4 Mon Sep 17 00:00:00 2001 From: Michael Spiz Date: Sun, 4 Apr 2021 17:01:28 -0700 Subject: [PATCH 11/11] Rails tweaks (#6463) * move common code out to a function * update_columns is more commonly used * update gems and add redis * set up redis in container for caching * move cached_query * update readme * add rails gitignores * ignore pyc files in toolset dir * use bash * clean up app controller * be noisy if redis is down * simplify update and cached query * update mysql dockerfile * oops, set mysql as rails env * remove rails gitignore as this lives in a docker container --- frameworks/Ruby/rails/Gemfile | 7 +-- frameworks/Ruby/rails/Gemfile.lock | 20 ++++---- frameworks/Ruby/rails/README.md | 6 +-- .../app/controllers/application_controller.rb | 5 +- .../app/controllers/hello_world_controller.rb | 49 +++++++++---------- .../rails/config/environments/production.rb | 12 ++++- frameworks/Ruby/rails/rails-mysql.dockerfile | 10 ++-- frameworks/Ruby/rails/rails.dockerfile | 10 ++-- frameworks/Ruby/rails/run-with-redis.sh | 3 ++ toolset/.gitignore | 1 + 10 files changed, 70 insertions(+), 53 deletions(-) create mode 100755 frameworks/Ruby/rails/run-with-redis.sh create mode 100644 toolset/.gitignore diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 80100b37f48..492f8e66b14 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -1,9 +1,10 @@ source 'https://rubygems.org' do gem 'listen', '~> 3.3', group: :development gem 'mysql2', '0.5.3', group: :mysql - gem 'oj', '3.11.2' + gem 'oj', '~> 3.11.2' gem 'pg', '1.2.3', group: :postgresql - gem 'puma', '5.2.1' - gem 'rails', '6.1.3' + gem 'puma', '~> 5.2.1' + gem 'rails', '~> 6.1.3' + gem 'redis', '~> 4.0' gem 'tzinfo-data', '1.2021.1' end \ No newline at end of file diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index f724daac6d1..7aeaa3e10e6 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -64,7 +64,7 @@ GEM concurrent-ruby (1.1.8) crass (1.0.6) erubi (1.10.0) - ffi (1.14.2) + ffi (1.15.0) globalid (0.4.2) activesupport (>= 4.2.0) i18n (1.8.9) @@ -82,14 +82,14 @@ GEM method_source (1.0.0) mimemagic (0.3.5) mini_mime (1.0.2) - minitest (5.14.3) + minitest (5.14.4) mysql2 (0.5.3) - nio4r (2.5.5) - nokogiri (1.11.1-arm64-darwin) + nio4r (2.5.7) + nokogiri (1.11.2-arm64-darwin) racc (~> 1.4) - oj (3.11.2) + oj (3.11.3) pg (1.2.3) - puma (5.2.1) + puma (5.2.2) nio4r (~> 2.0) racc (1.5.2) rack (2.2.3) @@ -125,6 +125,7 @@ GEM rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) + redis (4.2.5) sprockets (4.0.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -148,10 +149,11 @@ PLATFORMS DEPENDENCIES listen (~> 3.3)! mysql2 (= 0.5.3)! - oj (= 3.11.2)! + oj (~> 3.11.2)! pg (= 1.2.3)! - puma (= 5.2.1)! - rails (= 6.1.3)! + puma (~> 5.2.1)! + rails (~> 6.1.3)! + redis (~> 4.0)! tzinfo-data (= 1.2021.1)! BUNDLED WITH diff --git a/frameworks/Ruby/rails/README.md b/frameworks/Ruby/rails/README.md index a9e3f58be99..03b227b8409 100644 --- a/frameworks/Ruby/rails/README.md +++ b/frameworks/Ruby/rails/README.md @@ -17,12 +17,13 @@ The tests were run with: - [Puma 5.2.1](http://puma.io/) - [MySQL 5.5](https://dev.mysql.com/) - [PostgreSQL 11](https://www.postgresql.org/) - +- [Redis 5.0](https://redis.io) ## Paths & Source for Tests - [JSON Serialization](app/controllers/hello_world_controller.rb): "/json" - [Single Database Query](app/controllers/hello_world_controller.rb): "/db", [World Model](app/models/world.rb) -- [Multiple Database Queries](app/controllers/hello_world_controller.rb): "/db?queries={#}", [World Model](app/models/world.rb) +- [Multiple Database Queries](app/controllers/hello_world_controller.rb): "/queries?queries={#}", [World Model](app/models/world.rb) +- [Cached Database Queries](app/controllers/hello_world_controller.rb): "/cached?queries={#}", [World Model] - [Fortunes](app/controllers/hello_world_controller.rb): "/fortune" , [Fortunes Model](app/models/fortune.rb) - [Database Updates](app/controllers/hello_world_controller.rb): "/update?queries={#}", [World Model](app/models/world.rb) - [Plaintext](app/controllers/hello_world_controller.rb): "/plaintext" @@ -42,4 +43,3 @@ The tests were run with: ### Resources - [Ruby on Rails Source Code](https://github.com/rails/rails) -- [PR: passenger-install-apache2-module doesn't work on ruby 2.0](https://github.com/FooBarWidget/passenger/pull/71) diff --git a/frameworks/Ruby/rails/app/controllers/application_controller.rb b/frameworks/Ruby/rails/app/controllers/application_controller.rb index bc62d8e6dda..312bea18d1a 100644 --- a/frameworks/Ruby/rails/app/controllers/application_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/application_controller.rb @@ -1,11 +1,10 @@ +# frozen_string_literal: true class ApplicationController < ActionController::Base - before_action :add_header -protected + private def add_header response.set_header('Date', Time.now.httpdate) end - end diff --git a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb index b0677e1b951..ed5e52f3894 100644 --- a/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb +++ b/frameworks/Ruby/rails/app/controllers/hello_world_controller.rb @@ -16,53 +16,50 @@ def db end def query - queries = params[:queries].to_i - queries = 1 if queries < 1 - queries = 500 if queries > 500 - - results = QUERY_RANGE.sample(queries).map do |id| + results = QUERY_RANGE.sample(query_count).map do |id| World.find(id) end render json: results end + def cached_query + results = QUERY_RANGE.sample(query_count).map do |id| + Rails.cache.fetch(id) do + World.find(id).as_json + end + end + + render json: results + end + def fortune @fortunes = Fortune.all.to_a @fortunes << Fortune.new(id: 0, message: 'Additional fortune added at request time.') - @fortunes = @fortunes.sort_by!(&:message) + @fortunes.sort_by!(&:message) end def update - queries = (params[:queries] || 1).to_i - queries = 1 if queries < 1 - queries = 500 if queries > 500 - - worlds = queries.times.map{Random.rand(1..10_000)}.map do |id| + worlds = query_count.times.map { Random.rand(1..10_000) }.map do |id| # get a random row from the database, which we know has 10000 # rows with ids 1 - 10000 - world = World.select(:id, :randomNumber).find(id) - begin - rn = Random.rand(1..10_000) - end while rn == world.randomNumber - world.update_column(:randomNumber, rn) + world = World.find(id) + random = Random.rand(1..10_000) + random = Random.rand(1..10_000) until random != world.randomNumber + world.update_columns(randomNumber: random) world end render json: worlds end - def cached_query - queries = params[:queries].to_i - queries = 1 if queries < 1 - queries = 500 if queries > 500 + private - results = QUERY_RANGE.sample(queries).map do |id| - Rails.cache.fetch("world-#{id}") do - World.find(id) - end - end + def query_count + queries = params[:queries].to_i + return 1 if queries < 1 + return 500 if queries > 500 - render json: results + queries end end diff --git a/frameworks/Ruby/rails/config/environments/production.rb b/frameworks/Ruby/rails/config/environments/production.rb index 8a12685ea32..053aabf89a1 100644 --- a/frameworks/Ruby/rails/config/environments/production.rb +++ b/frameworks/Ruby/rails/config/environments/production.rb @@ -28,7 +28,17 @@ config.log_tags = [ :request_id ] # Use a different cache store in production. - config.cache_store = :memory_store + config.cache_store = :redis_cache_store, { + url: ENV['REDIS_URL'], + connect_timeout: 30, # Defaults to 20 seconds + read_timeout: 0.2, # Defaults to 1 second + write_timeout: 0.2, # Defaults to 1 second + reconnect_attempts: 1, # Defaults to 0 + + error_handler: -> (method:, returning:, exception:) { + puts "NO REDIS DETECTED" + } + } # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index bc4571ea3a0..41174362aef 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -1,16 +1,18 @@ FROM ruby:3.0 -ENV BUNDLE_WITHOUT=postgresql -ENV RAILS_ENV=production_mysql -ENV PORT=8080 +RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server EXPOSE 8080 WORKDIR /rails COPY ./Gemfile* /rails/ +ENV BUNDLE_WITHOUT=postgresql RUN bundle install --jobs=8 COPY . /rails/ -CMD ["rails", "server"] \ No newline at end of file +ENV RAILS_ENV=production_mysql +ENV PORT=8080 +ENV REDIS_URL=redis://localhost:6379/0/cache +CMD ./run-with-redis.sh \ No newline at end of file diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index d1d198ff1ad..4c6f2400c2d 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -1,16 +1,18 @@ FROM ruby:3.0 -ENV BUNDLE_WITHOUT=mysql -ENV RAILS_ENV=production_postgresql -ENV PORT=8080 +RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server EXPOSE 8080 WORKDIR /rails COPY ./Gemfile* /rails/ +ENV BUNDLE_WITHOUT=mysql RUN bundle install --jobs=8 COPY . /rails/ -CMD ["rails", "server"] \ No newline at end of file +ENV RAILS_ENV=production_postgresql +ENV PORT=8080 +ENV REDIS_URL=redis://localhost:6379/0/cache +CMD ./run-with-redis.sh \ No newline at end of file diff --git a/frameworks/Ruby/rails/run-with-redis.sh b/frameworks/Ruby/rails/run-with-redis.sh new file mode 100755 index 00000000000..9ce9b243b74 --- /dev/null +++ b/frameworks/Ruby/rails/run-with-redis.sh @@ -0,0 +1,3 @@ +#!/bin/bash +service redis-server start +rails server diff --git a/toolset/.gitignore b/toolset/.gitignore new file mode 100644 index 00000000000..0d20b6487c6 --- /dev/null +++ b/toolset/.gitignore @@ -0,0 +1 @@ +*.pyc