Browse Source

[Kotlin / Hexagon] Add asynchronous and native image benchmarks (#8250)

* Fix error with URLs in JEE servers

* Clean up

* Avoid classpath URLs

* Fix template loading error

* Fix template loading error

* Chores

* Fix template loading error

* Delete MongoDB DB support

Storage support in Hexagon will be moved outside the Toolkit, and so, it will be left outside the benchmark.

* Fix runtime problem

* Update Hexagon version

* Make Jackson Blackbird module optional

* Add variation with Blackbird module enabled

* Upgrade Hexagon version

* Enable blackbird Jackson module by default

* Update dependencies

* Use Hexagon version 2.0.0-B1 (and a little cleanup)

* Use Hexagon version 2.0.0-B1 (and a little cleanup)

* Use Tomcat instead Resin to test JEE integration

* Remove unused environment variable

* Clean Tomcat dockerfile

* Minor improvements

* Minor improvements

* Update to release version

* Update to the latest Hexagon release

* Add Netty adapter test

* Remove Gradle Wrapper

* Update version

* Update version

* Minimize template

* Skip Hexagon checks in the container

* Add Netty Epoll benchmark

* Database and template improvements

* Update Hexagon version

* Update Hexagon version

* Update DB settings

* Use a single store and template engine to simplify benchmark

* Bump mysql-connector-java in /frameworks/Java/wicket

Bumps [mysql-connector-java](https://github.com/mysql/mysql-connector-j) from 8.0.27 to 8.0.28.
- [Release notes](https://github.com/mysql/mysql-connector-j/releases)
- [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/8.0/CHANGES)
- [Commits](https://github.com/mysql/mysql-connector-j/compare/8.0.27...8.0.28)

---
updated-dependencies:
- dependency-name: mysql:mysql-connector-java
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump mongodb-driver-sync from 4.2.0 to 4.2.1 in /frameworks/Java/javalin

Bumps [mongodb-driver-sync](https://github.com/mongodb/mongo-java-driver) from 4.2.0 to 4.2.1.
- [Release notes](https://github.com/mongodb/mongo-java-driver/releases)
- [Commits](https://github.com/mongodb/mongo-java-driver/compare/r4.2.0...r4.2.1)

---
updated-dependencies:
- dependency-name: org.mongodb:mongodb-driver-sync
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/starlette

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/django

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/routerling

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/japronto

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/fastapi

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/uvicorn

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/flask

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump ujson from 5.1 to 5.4.0 in /frameworks/Python/aiohttp

Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.1 to 5.4.0.
- [Release notes](https://github.com/ultrajson/ultrajson/releases)
- [Commits](https://github.com/ultrajson/ultrajson/compare/5.1.0...5.4.0)

---
updated-dependencies:
- dependency-name: ujson
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump rails-html-sanitizer from 1.4.2 to 1.4.3 in /frameworks/Ruby/rails

Bumps [rails-html-sanitizer](https://github.com/rails/rails-html-sanitizer) from 1.4.2 to 1.4.3.
- [Release notes](https://github.com/rails/rails-html-sanitizer/releases)
- [Changelog](https://github.com/rails/rails-html-sanitizer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rails/rails-html-sanitizer/compare/v1.4.2...v1.4.3)

---
updated-dependencies:
- dependency-name: rails-html-sanitizer
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump jetty-server in /frameworks/Java/jetty

Bumps [jetty-server](https://github.com/eclipse/jetty.project) from 9.4.41.v20210516 to 10.0.10.
- [Release notes](https://github.com/eclipse/jetty.project/releases)
- [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.41.v20210516...jetty-10.0.10)

---
updated-dependencies:
- dependency-name: org.eclipse.jetty:jetty-server
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump undertow-core in /frameworks/Java/undertow

Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.11.Final to 2.2.15.Final.
- [Release notes](https://github.com/undertow-io/undertow/releases)
- [Commits](https://github.com/undertow-io/undertow/compare/2.2.11.Final...2.2.15.Final)

---
updated-dependencies:
- dependency-name: io.undertow:undertow-core
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Update versions

* Update README.md

* Bump sanic from 22.3.1 to 22.6.1 in /frameworks/Python/sanic

Bumps [sanic](https://github.com/sanic-org/sanic) from 22.3.1 to 22.6.1.
- [Release notes](https://github.com/sanic-org/sanic/releases)
- [Changelog](https://github.com/sanic-org/sanic/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/sanic-org/sanic/compare/v22.3.1...v22.6.1)

---
updated-dependencies:
- dependency-name: sanic
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/light-java

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/rapidoid

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/jooby

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/servlet

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/spring-webflux

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/smart-socket

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/act

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Kotlin/kooby

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/dropwizard

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/hserver

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.4.0 to 42.4.1 in /frameworks/Java/undertow

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.0 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.4.0...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump postgresql from 42.2.23 to 42.4.1 in /frameworks/Kotlin/ktor/ktor

Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.23 to 42.4.1.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.23...REL42.4.1)

---
updated-dependencies:
- dependency-name: org.postgresql:postgresql
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Update dependencies

* Bump undertow-core in /frameworks/Java/light-java

Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.15.Final to 2.2.19.Final.
- [Release notes](https://github.com/undertow-io/undertow/releases)
- [Commits](https://github.com/undertow-io/undertow/compare/2.2.15.Final...2.2.19.Final)

---
updated-dependencies:
- dependency-name: io.undertow:undertow-core
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Bump undertow-core in /frameworks/Java/undertow

Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.18.Final to 2.2.19.Final.
- [Release notes](https://github.com/undertow-io/undertow/releases)
- [Commits](https://github.com/undertow-io/undertow/compare/2.2.18.Final...2.2.19.Final)

---
updated-dependencies:
- dependency-name: io.undertow:undertow-core
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>

* Delete Gradle Wrapper

* Use different JSON serializer

* Restore non Hexagon files

* Update Hexagon version

* Run pipeline

* Run pipeline

* Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum

Bumps [axum-core](https://github.com/tokio-rs/axum) from 0.2.7 to 0.2.8.
- [Release notes](https://github.com/tokio-rs/axum/releases)
- [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/axum/compare/axum-core-v0.2.7...axum-core-v0.2.8)

---
updated-dependencies:
- dependency-name: axum-core
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>

* Revert "Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum"

This reverts commit 4422de8915e70cdca67a07c2e0fdb0610757924b.

* Version updates, code refactor and new benchmark cases

* Version updates

* Version updates

* Version updates

* [Hexagon] Refactor and updates:

* Update Hexagon version
* Use Rocker template
* Modularize the different scenarios

* Fix connection problems

* Update Hexagon

* Update Gradle

* Update dependencies

* Update Hexagon version

* Update Gradle Wrapper

* Add async and native support

* Add async and native support

* Add async and native support

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Juanjo Aguililla 2 years ago
parent
commit
3dbce5ab89
54 changed files with 837 additions and 139 deletions
  1. 2 0
      frameworks/Kotlin/hexagon/.dockerignore
  2. 69 0
      frameworks/Kotlin/hexagon/benchmark_config.json
  3. 12 7
      frameworks/Kotlin/hexagon/build.gradle
  4. 54 0
      frameworks/Kotlin/hexagon/config.toml
  5. 4 5
      frameworks/Kotlin/hexagon/core/build.gradle
  6. 12 12
      frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt
  7. 7 0
      frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties
  8. 23 0
      frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json
  9. 0 21
      frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html
  10. 32 0
      frameworks/Kotlin/hexagon/core_async/build.gradle
  11. 28 0
      frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt
  12. 133 0
      frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt
  13. 34 0
      frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt
  14. 7 0
      frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties
  15. 23 0
      frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json
  16. 24 0
      frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html
  17. BIN
      frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar
  18. 1 1
      frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties
  19. 6 5
      frameworks/Kotlin/hexagon/gradlew
  20. 21 0
      frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile
  21. 7 8
      frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile
  22. 7 8
      frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile
  23. 23 0
      frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile
  24. 21 0
      frameworks/Kotlin/hexagon/hexagon-netty-native.dockerfile
  25. 7 8
      frameworks/Kotlin/hexagon/hexagon-netty.dockerfile
  26. 7 8
      frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile
  27. 7 8
      frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile
  28. 6 6
      frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile
  29. 23 0
      frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile
  30. 7 8
      frameworks/Kotlin/hexagon/hexagon.dockerfile
  31. 0 6
      frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle
  32. 1 6
      frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle
  33. 7 0
      frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle
  34. 25 0
      frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt
  35. 1 6
      frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle
  36. 7 0
      frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt
  37. 0 6
      frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle
  38. 7 0
      frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt
  39. 0 6
      frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle
  40. 7 0
      frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt
  41. 2 2
      frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt
  42. 9 0
      frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle
  43. 33 0
      frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/src/main/kotlin/Benchmark.kt
  44. 4 0
      frameworks/Kotlin/hexagon/model/build.gradle
  45. 0 0
      frameworks/Kotlin/hexagon/model/src/main/kotlin/Settings.kt
  46. 0 0
      frameworks/Kotlin/hexagon/model/src/main/kotlin/model/CachedWorld.kt
  47. 0 0
      frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Fortune.kt
  48. 0 0
      frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Message.kt
  49. 0 0
      frameworks/Kotlin/hexagon/model/src/main/kotlin/model/World.kt
  50. 5 0
      frameworks/Kotlin/hexagon/settings.gradle
  51. 1 1
      frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt
  52. 6 0
      frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle
  53. 114 0
      frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt
  54. 1 1
      frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt

+ 2 - 0
frameworks/Kotlin/hexagon/.dockerignore

@@ -0,0 +1,2 @@
+
+**/build/

+ 69 - 0
frameworks/Kotlin/hexagon/benchmark_config.json

@@ -136,6 +136,75 @@
                 "notes": "http://hexagonkt.com",
                 "notes": "http://hexagonkt.com",
                 "versus": "netty"
                 "versus": "netty"
             },
             },
+            "netty-native": {
+                "json_url": "/json",
+                "db_url": "/db",
+                "query_url": "/query?queries=",
+                "fortune_url": "/fortunes",
+                "update_url": "/update?queries=",
+                "cached_query_url": "/cached-queries?count=",
+                "plaintext_url": "/plaintext",
+                "port": 9090,
+                "approach": "Realistic",
+                "classification": "Micro",
+                "database": "postgres",
+                "framework": "Hexagon",
+                "language": "Kotlin",
+                "orm": "Raw",
+                "platform": "Netty",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "Hexagon Netty Native PostgreSQL",
+                "notes": "http://hexagonkt.com",
+                "versus": "netty"
+            },
+            "netty-async-pgclient": {
+                "json_url": "/json",
+                "db_url": "/db",
+                "query_url": "/query?queries=",
+                "fortune_url": "/fortunes",
+                "update_url": "/update?queries=",
+                "cached_query_url": "/cached-queries?count=",
+                "plaintext_url": "/plaintext",
+                "port": 9090,
+                "approach": "Realistic",
+                "classification": "Micro",
+                "database": "postgres",
+                "framework": "Hexagon",
+                "language": "Kotlin",
+                "orm": "Raw",
+                "platform": "Netty",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "Hexagon Netty Async PgClient",
+                "notes": "http://hexagonkt.com",
+                "versus": "netty"
+            },
+            "vertx-pgclient": {
+                "json_url": "/json",
+                "db_url": "/db",
+                "query_url": "/query?queries=",
+                "fortune_url": "/fortunes",
+                "update_url": "/update?queries=",
+                "cached_query_url": "/cached-queries?count=",
+                "plaintext_url": "/plaintext",
+                "port": 9090,
+                "approach": "Realistic",
+                "classification": "Micro",
+                "database": "postgres",
+                "framework": "Hexagon",
+                "language": "Kotlin",
+                "orm": "Raw",
+                "platform": "Vertx",
+                "webserver": "None",
+                "os": "Linux",
+                "database_os": "Linux",
+                "display_name": "Hexagon Vertx PgClient",
+                "notes": "http://hexagonkt.com",
+                "versus": "vertx"
+            },
             "tomcat": {
             "tomcat": {
                 "json_url": "/json",
                 "json_url": "/json",
                 "db_url": "/db",
                 "db_url": "/db",

+ 12 - 7
frameworks/Kotlin/hexagon/build.gradle

@@ -1,6 +1,7 @@
 
 
 plugins {
 plugins {
-    id "org.jetbrains.kotlin.jvm" version "1.8.10" apply false
+    id "org.jetbrains.kotlin.jvm" version "1.8.21" apply false
+    id "org.graalvm.buildtools.native" version "0.9.22" apply false
 }
 }
 
 
 version = "1.0.0"
 version = "1.0.0"
@@ -8,19 +9,23 @@ description = "TFB benchmark"
 group = "com.hexagonkt"
 group = "com.hexagonkt"
 
 
 ext {
 ext {
-    hexagonVersion = "2.6.6"
+    hexagonVersion = "3.0.0-B1"
+    jettyVersion = "11.0.15"
+    nettyVersion = "4.1.93.Final"
+
     hikariVersion = "5.0.1"
     hikariVersion = "5.0.1"
-    jettyVersion = "11.0.14"
     postgresqlVersion = "42.6.0"
     postgresqlVersion = "42.6.0"
-    vertxVersion = "4.4.0"
+    vertxVersion = "4.4.2"
     cache2kVersion = "2.6.1.Final"
     cache2kVersion = "2.6.1.Final"
-    nettyVersion = "4.1.90.Final"
 
 
+    applicationClass = "com.hexagonkt.BenchmarkKt"
+    modules = "java.naming,java.sql,java.management"
+    options = "--enable-preview"
     gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle"
     gradleScripts = "https://raw.githubusercontent.com/hexagonkt/hexagon/$hexagonVersion/gradle"
 }
 }
 
 
-defaultTasks("build")
-
 subprojects {
 subprojects {
+    version = rootProject.version
+
     apply(from: "$gradleScripts/kotlin.gradle")
     apply(from: "$gradleScripts/kotlin.gradle")
 }
 }

+ 54 - 0
frameworks/Kotlin/hexagon/config.toml

@@ -73,6 +73,24 @@ platform = "Netty"
 webserver = "None"
 webserver = "None"
 versus = "netty"
 versus = "netty"
 
 
+[netty-native]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/query?queries="
+urls.update = "/update?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached-queries?count="
+approach = "Realistic"
+classification = "Micro"
+database = "postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "Netty"
+webserver = "None"
+versus = "netty"
+
 [nettyepoll]
 [nettyepoll]
 urls.plaintext = "/plaintext"
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.json = "/json"
@@ -109,6 +127,24 @@ platform = "Netty"
 webserver = "None"
 webserver = "None"
 versus = "netty"
 versus = "netty"
 
 
+[nettyepoll-async-pgclient]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/query?queries="
+urls.update = "/update?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached-queries?count="
+approach = "Realistic"
+classification = "Micro"
+database = "postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "Netty"
+webserver = "None"
+versus = "netty"
+
 [tomcat]
 [tomcat]
 urls.plaintext = "/plaintext"
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.json = "/json"
@@ -126,3 +162,21 @@ orm = "Raw"
 platform = "Servlet"
 platform = "Servlet"
 webserver = "Tomcat"
 webserver = "Tomcat"
 versus = "servlet"
 versus = "servlet"
+
+[vertx-pgclient]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/query?queries="
+urls.update = "/update?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached-queries?count="
+approach = "Realistic"
+classification = "Micro"
+database = "postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "Vertx"
+webserver = "None"
+versus = "vertx"

+ 4 - 5
frameworks/Kotlin/hexagon/core/build.gradle

@@ -4,6 +4,7 @@ plugins {
 }
 }
 
 
 dependencies {
 dependencies {
+    api(project(":model"))
     api("com.hexagonkt:http_server:$hexagonVersion")
     api("com.hexagonkt:http_server:$hexagonVersion")
     api("com.hexagonkt:templates_rocker:$hexagonVersion")
     api("com.hexagonkt:templates_rocker:$hexagonVersion")
     api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion")
     api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion")
@@ -13,11 +14,9 @@ dependencies {
 
 
 tasks.register("minimizeTemplate") {
 tasks.register("minimizeTemplate") {
     doLast {
     doLast {
-        [ "fortunes.pebble.html", "fortunes.rocker.html" ].forEach { t ->
-            File template = file("$buildDir/resources/main/$t")
-            List<String> lines = template.readLines().collect { it.trim() }
-            template.write(lines.join(""))
-        }
+        File template = file("$buildDir/resources/main/fortunes.rocker.html")
+        List<String> lines = template.readLines().collect { it.trim() }
+        template.write(lines.join(""))
     }
     }
 }
 }
 
 

+ 12 - 12
frameworks/Kotlin/hexagon/core/src/main/kotlin/Controller.kt

@@ -8,9 +8,9 @@ import com.hexagonkt.http.model.ContentType
 import com.hexagonkt.http.model.Header
 import com.hexagonkt.http.model.Header
 import com.hexagonkt.http.model.Headers
 import com.hexagonkt.http.model.Headers
 import com.hexagonkt.http.server.callbacks.DateCallback
 import com.hexagonkt.http.server.callbacks.DateCallback
-import com.hexagonkt.http.server.handlers.HttpServerContext
-import com.hexagonkt.http.server.handlers.PathHandler
-import com.hexagonkt.http.server.handlers.path
+import com.hexagonkt.http.handlers.HttpContext
+import com.hexagonkt.http.handlers.PathHandler
+import com.hexagonkt.http.handlers.path
 import com.hexagonkt.model.*
 import com.hexagonkt.model.*
 import com.hexagonkt.serialization.jackson.json.Json
 import com.hexagonkt.serialization.jackson.json.Json
 import com.hexagonkt.serialization.serialize
 import com.hexagonkt.serialization.serialize
@@ -55,9 +55,9 @@ class Controller(
     private fun Message.toJson(): String =
     private fun Message.toJson(): String =
         toMap().serialize(Json.raw)
         toMap().serialize(Json.raw)
 
 
-    private fun HttpServerContext.listFortunes(
+    private fun HttpContext.listFortunes(
         store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort
         store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort
-    ): HttpServerContext {
+    ): HttpContext {
 
 
         val fortunes = store.findAllFortunes() + Fortune(0, "Additional fortune added at request time.")
         val fortunes = store.findAllFortunes() + Fortune(0, "Additional fortune added at request time.")
         val sortedFortunes = fortunes.sortedBy { it.message }
         val sortedFortunes = fortunes.sortedBy { it.message }
@@ -67,7 +67,7 @@ class Controller(
         return ok(body, contentType = html)
         return ok(body, contentType = html)
     }
     }
 
 
-    private fun HttpServerContext.dbQuery(store: BenchmarkStore): HttpServerContext {
+    private fun HttpContext.dbQuery(store: BenchmarkStore): HttpContext {
         val ids = listOf(randomWorld())
         val ids = listOf(randomWorld())
         val worlds = store.findWorlds(ids)
         val worlds = store.findWorlds(ids)
         val world = worlds.first().toMap()
         val world = worlds.first().toMap()
@@ -75,7 +75,7 @@ class Controller(
         return sendJson(world)
         return sendJson(world)
     }
     }
 
 
-    private fun HttpServerContext.getWorlds(store: BenchmarkStore): HttpServerContext {
+    private fun HttpContext.getWorlds(store: BenchmarkStore): HttpContext {
         val worldsCount = getWorldsCount(queriesParam)
         val worldsCount = getWorldsCount(queriesParam)
         val ids = (1..worldsCount).map { randomWorld() }
         val ids = (1..worldsCount).map { randomWorld() }
         val worlds = store.findWorlds(ids).map { it.toMap() }
         val worlds = store.findWorlds(ids).map { it.toMap() }
@@ -83,7 +83,7 @@ class Controller(
         return sendJson(worlds)
         return sendJson(worlds)
     }
     }
 
 
-    private fun HttpServerContext.getCachedWorlds(store: BenchmarkStore): HttpServerContext {
+    private fun HttpContext.getCachedWorlds(store: BenchmarkStore): HttpContext {
         val worldsCount = getWorldsCount(cachedQueriesParam)
         val worldsCount = getWorldsCount(cachedQueriesParam)
         val ids = (1..worldsCount).map { randomWorld() }
         val ids = (1..worldsCount).map { randomWorld() }
         val worlds = store.findCachedWorlds(ids).map { it.toMap() }
         val worlds = store.findCachedWorlds(ids).map { it.toMap() }
@@ -91,7 +91,7 @@ class Controller(
         return sendJson(worlds)
         return sendJson(worlds)
     }
     }
 
 
-    private fun HttpServerContext.updateWorlds(store: BenchmarkStore): HttpServerContext {
+    private fun HttpContext.updateWorlds(store: BenchmarkStore): HttpContext {
         val worldsCount = getWorldsCount(queriesParam)
         val worldsCount = getWorldsCount(queriesParam)
         val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) }
         val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) }
 
 
@@ -100,11 +100,11 @@ class Controller(
         return sendJson(worlds.map { it.toMap() })
         return sendJson(worlds.map { it.toMap() })
     }
     }
 
 
-    private fun HttpServerContext.sendJson(body: Any): HttpServerContext =
+    private fun HttpContext.sendJson(body: Any): HttpContext =
         ok(body.serialize(Json.raw), contentType = json)
         ok(body.serialize(Json.raw), contentType = json)
 
 
-    private fun HttpServerContext.getWorldsCount(parameter: String): Int =
-        request.queryParameters[parameter]?.value?.toIntOrNull().let {
+    private fun HttpContext.getWorldsCount(parameter: String): Int =
+        request.queryParameters[parameter]?.string()?.toIntOrNull().let {
             when {
             when {
                 it == null -> 1
                 it == null -> 1
                 it < 1 -> 1
                 it < 1 -> 1

+ 7 - 0
frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties

@@ -0,0 +1,7 @@
+Args= \
+  -H:IncludeResources=.*\\.(html|class) \
+  --enable-preview \
+  --static \
+  --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \
+  --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \
+  --initialize-at-build-time=org.slf4j.LoggerFactory

+ 23 - 0
frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json

@@ -0,0 +1,23 @@
+[
+  {
+    "name": "fortunes",
+    "allPublicMethods": true,
+    "allDeclaredFields": true,
+    "allDeclaredMethods": true,
+    "allDeclaredConstructors": true
+  },
+  {
+    "name": "fortunes$Template",
+    "allPublicMethods": true,
+    "allDeclaredFields": true,
+    "allDeclaredMethods": true,
+    "allDeclaredConstructors": true
+  },
+  {
+    "name": "fortunes$PlainText",
+    "allPublicMethods": true,
+    "allDeclaredFields": true,
+    "allDeclaredMethods": true,
+    "allDeclaredConstructors": true
+  }
+]

+ 0 - 21
frameworks/Kotlin/hexagon/core/src/main/resources/fortunes.pebble.html

@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<head>
-  <title>Fortunes</title>
-</head>
-<body>
-<table>
-  <tr>
-    <th>id</th>
-    <th>message</th>
-  </tr>
-  {% for fortune in fortunes %}
-  <tr>
-    <td>{{ fortune.id }}</td>
-    <td>{{ fortune.message }}</td>
-  </tr>
-  {% endfor %}
-</table>
-</body>
-</html>

+ 32 - 0
frameworks/Kotlin/hexagon/core_async/build.gradle

@@ -0,0 +1,32 @@
+
+plugins {
+    id("nu.studer.rocker") version("3.0.4")
+}
+
+dependencies {
+    api(project(":model"))
+    api("com.hexagonkt:http_server_async:$hexagonVersion")
+    api("com.hexagonkt:templates_rocker:$hexagonVersion")
+    api("com.hexagonkt:logging_slf4j_jul:$hexagonVersion")
+    api("com.hexagonkt:serialization_jackson_json:$hexagonVersion")
+    api("org.cache2k:cache2k-core:$cache2kVersion")
+}
+
+tasks.register("minimizeTemplate") {
+    doLast {
+        File template = file("$buildDir/resources/main/fortunes.rocker.html")
+        List<String> lines = template.readLines().collect { it.trim() }
+        template.write(lines.join(""))
+    }
+}
+
+jar.dependsOn("minimizeTemplate")
+
+rocker {
+    configurations {
+        create("main") {
+            templateDir.set(file("src/main/resources"))
+            optimize.set(true)
+        }
+    }
+}

+ 28 - 0
frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Benchmark.kt

@@ -0,0 +1,28 @@
+package com.hexagonkt.async
+
+import com.hexagonkt.Settings
+import com.hexagonkt.http.server.async.HttpServer
+import com.hexagonkt.http.server.async.HttpServerPort
+import com.hexagonkt.http.server.async.HttpServerSettings
+import com.hexagonkt.async.store.BenchmarkStore
+import com.hexagonkt.templates.TemplatePort
+import java.net.InetAddress
+import java.net.URL
+
+class Benchmark(
+    private val engine: HttpServerPort,
+    private val store: BenchmarkStore,
+    private val template: TemplatePort,
+    private val templateUrl: URL,
+    private val settings: Settings = Settings(),
+) {
+    val server: HttpServer by lazy {
+        val controller = Controller(settings, store, template, templateUrl)
+        val serverSettings = HttpServerSettings(
+            bindAddress = InetAddress.getByName(settings.bindAddress),
+            bindPort = settings.bindPort,
+        )
+
+        HttpServer(engine, controller.path, serverSettings)
+    }
+}

+ 133 - 0
frameworks/Kotlin/hexagon/core_async/src/main/kotlin/Controller.kt

@@ -0,0 +1,133 @@
+package com.hexagonkt.async
+
+import com.hexagonkt.Settings
+import com.hexagonkt.core.fieldsMapOf
+import com.hexagonkt.core.media.APPLICATION_JSON
+import com.hexagonkt.core.media.TEXT_HTML
+import com.hexagonkt.core.media.TEXT_PLAIN
+import com.hexagonkt.handlers.async.done
+import com.hexagonkt.http.model.ContentType
+import com.hexagonkt.http.model.Header
+import com.hexagonkt.http.model.Headers
+import com.hexagonkt.http.server.async.callbacks.DateCallback
+import com.hexagonkt.http.handlers.async.HttpContext
+import com.hexagonkt.http.handlers.async.PathHandler
+import com.hexagonkt.http.handlers.async.path
+import com.hexagonkt.model.*
+import com.hexagonkt.serialization.jackson.json.Json
+import com.hexagonkt.serialization.serialize
+import com.hexagonkt.async.store.BenchmarkStore
+import com.hexagonkt.templates.TemplatePort
+import java.net.URL
+import java.util.concurrent.CompletableFuture
+import java.util.concurrent.ThreadLocalRandom
+import kotlin.text.Charsets.UTF_8
+
+class Controller(
+    settings: Settings,
+    store: BenchmarkStore,
+    templateEngine: TemplatePort,
+    templateUrl: URL,
+) {
+    private val queriesParam: String = settings.queriesParam
+    private val cachedQueriesParam: String = settings.cachedQueriesParam
+    private val worldRows: Int = settings.worldRows
+    private val textMessage: String = settings.textMessage
+
+    private val plain: ContentType = ContentType(TEXT_PLAIN)
+    private val json: ContentType = ContentType(APPLICATION_JSON)
+    private val html: ContentType = ContentType(TEXT_HTML, charset = UTF_8)
+
+    private val headers = Headers(Header("server", "Hexagon"))
+
+    val path: PathHandler by lazy {
+        path {
+            on("*") { send(headers = headers).done() }
+            on("*", DateCallback())
+
+            get("/plaintext") { ok(textMessage, contentType = plain).done() }
+            get("/json") { ok(Message(textMessage).toJson(), contentType = json).done() }
+            get("/fortunes") { listFortunes(store, templateUrl, templateEngine) }
+            get("/db") { dbQuery(store) }
+            get("/query") { getWorlds(store) }
+            get("/cached-queries") { getCachedWorlds(store) }
+            get("/update") { updateWorlds(store) }
+        }
+    }
+
+    private fun Message.toJson(): String =
+        toMap().serialize(Json.raw)
+
+    private fun HttpContext.listFortunes(
+        store: BenchmarkStore, templateUrl: URL, templateAdapter: TemplatePort
+    ): CompletableFuture<HttpContext> =
+        store
+            .findAllFortunes()
+            .thenApply { it + Fortune(0, "Additional fortune added at request time.")  }
+            .thenApply { fortunes -> fortunes.sortedBy { it.message } }
+            .thenApply { sortedFortunes -> mapOf("fortunes" to sortedFortunes) }
+            .thenApply { context -> templateAdapter.render(templateUrl, context) }
+            .thenApply { body -> ok(body, contentType = html) }
+
+    private fun HttpContext.dbQuery(store: BenchmarkStore): CompletableFuture<HttpContext> {
+        val ids = listOf(randomWorld())
+        return store.findWorlds(ids)
+            .thenApply { worlds -> worlds.first().toMap()}
+            .thenApply { world -> sendJson(world) }
+    }
+
+    private fun HttpContext.getWorlds(store: BenchmarkStore): CompletableFuture<HttpContext> {
+        val worldsCount = getWorldsCount(queriesParam)
+        val ids = (1..worldsCount).map { randomWorld() }
+        return store.findWorlds(ids)
+            .thenApply { worlds -> worlds.map { it.toMap() } }
+            .thenApply { worlds -> sendJson(worlds) }
+    }
+
+    private fun HttpContext.getCachedWorlds(store: BenchmarkStore): CompletableFuture<HttpContext> {
+        val worldsCount = getWorldsCount(cachedQueriesParam)
+        val ids = (1..worldsCount).map { randomWorld() }
+        val worlds = store.findCachedWorlds(ids).map { it.toMap() }
+
+        return sendJson(worlds).done()
+    }
+
+    private fun HttpContext.updateWorlds(store: BenchmarkStore): CompletableFuture<HttpContext> {
+        val worldsCount = getWorldsCount(queriesParam)
+        val worlds = (1..worldsCount).map { World(randomWorld(), randomWorld()) }
+
+        return store.replaceWorlds(worlds)
+            .thenApply { sendJson(worlds.map { it.toMap() }) }
+    }
+
+    private fun HttpContext.sendJson(body: Any): HttpContext =
+        ok(body.serialize(Json.raw), contentType = json)
+
+    private fun HttpContext.getWorldsCount(parameter: String): Int =
+        request.queryParameters[parameter]?.string()?.toIntOrNull().let {
+            when {
+                it == null -> 1
+                it < 1 -> 1
+                it > 500 -> 500
+                else -> it
+            }
+        }
+
+    private fun randomWorld(): Int =
+        ThreadLocalRandom.current().nextInt(worldRows) + 1
+
+    private fun Message.toMap(): Map<String, *> =
+        fieldsMapOf(Message::message to message)
+
+    private fun World.toMap(): Map<String, *> =
+        fieldsMapOf(
+            World::id to id,
+            World::randomNumber to randomNumber,
+        )
+
+    private fun CachedWorld.toMap(): Map<String, *> =
+        fieldsMapOf(
+            CachedWorld::id to id,
+            CachedWorld::randomNumber to randomNumber,
+        )
+}

+ 34 - 0
frameworks/Kotlin/hexagon/core_async/src/main/kotlin/store/BenchmarkStore.kt

@@ -0,0 +1,34 @@
+package com.hexagonkt.async.store
+
+import com.hexagonkt.model.CachedWorld
+import com.hexagonkt.model.Fortune
+import com.hexagonkt.Settings
+import com.hexagonkt.model.World
+import org.cache2k.Cache
+import org.cache2k.Cache2kBuilder
+import java.util.concurrent.CompletableFuture
+
+abstract class BenchmarkStore(settings: Settings) {
+
+    abstract fun findAllFortunes(): CompletableFuture<List<Fortune>>
+    abstract fun findWorlds(ids: List<Int>): CompletableFuture<List<World>>
+    abstract fun replaceWorlds(worlds: List<World>): CompletableFuture<*>
+    abstract fun initWorldsCache(cache: Cache<Int, CachedWorld>)
+    abstract fun loadCachedWorld(id: Int): CachedWorld
+    abstract fun close()
+
+    private val worldsCache: Cache<Int, CachedWorld> by lazy {
+        object : Cache2kBuilder<Int, CachedWorld>() {}
+            .eternal(true)
+            .disableMonitoring(true)
+            .disableStatistics(true)
+            .entryCapacity(settings.worldRows.toLong())
+            .loader { id -> loadCachedWorld(id) }
+            .build()
+            .apply { initWorldsCache(this) }
+    }
+
+    fun findCachedWorlds(ids: List<Int>): List<CachedWorld> {
+        return ids.mapNotNull { worldsCache.get(it) }
+    }
+}

+ 7 - 0
frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties

@@ -0,0 +1,7 @@
+Args= \
+  -H:IncludeResources=.*\\.(html|class) \
+  --enable-preview \
+  --static \
+  --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter \
+  --initialize-at-build-time=org.slf4j.jul.JDK14LoggerAdapter$1 \
+  --initialize-at-build-time=org.slf4j.LoggerFactory

+ 23 - 0
frameworks/Kotlin/hexagon/core_async/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/reflect-config.json

@@ -0,0 +1,23 @@
+[
+  {
+    "name": "fortunes",
+    "allPublicMethods": true,
+    "allDeclaredFields": true,
+    "allDeclaredMethods": true,
+    "allDeclaredConstructors": true
+  },
+  {
+    "name": "fortunes$Template",
+    "allPublicMethods": true,
+    "allDeclaredFields": true,
+    "allDeclaredMethods": true,
+    "allDeclaredConstructors": true
+  },
+  {
+    "name": "fortunes$PlainText",
+    "allPublicMethods": true,
+    "allDeclaredFields": true,
+    "allDeclaredMethods": true,
+    "allDeclaredConstructors": true
+  }
+]

+ 24 - 0
frameworks/Kotlin/hexagon/core_async/src/main/resources/fortunes.rocker.html

@@ -0,0 +1,24 @@
+@import java.util.*
+@import com.hexagonkt.model.Fortune
+@args(Map<String, Object> context)
+<!DOCTYPE html>
+
+<html>
+<head>
+  <title>Fortunes</title>
+</head>
+<body>
+<table>
+  <tr>
+    <th>id</th>
+    <th>message</th>
+  </tr>
+  @for ((fortune) : (Collection<Fortune>)context.get("fortunes")) {
+  <tr>
+    <td>@fortune.getId()</td>
+    <td>@fortune.getMessage()</td>
+  </tr>
+  }
+</table>
+</body>
+</html>

BIN
frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar


+ 1 - 1
frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties

@@ -1,6 +1,6 @@
 distributionBase=GRADLE_USER_HOME
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 distributionPath=wrapper/dists
-distributionUrl=https://services.gradle.org/distributions/gradle-8.0.2-bin.zip
+distributionUrl=https://services.gradle.org/distributions/gradle-8.1.1-bin.zip
 networkTimeout=10000
 networkTimeout=10000
 zipStoreBase=GRADLE_USER_HOME
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
 zipStorePath=wrapper/dists

+ 6 - 5
frameworks/Kotlin/hexagon/gradlew

@@ -85,9 +85,6 @@ done
 APP_BASE_NAME=${0##*/}
 APP_BASE_NAME=${0##*/}
 APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
 APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
 
 
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD=maximum
 MAX_FD=maximum
 
 
@@ -144,7 +141,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
     case $MAX_FD in #(
     case $MAX_FD in #(
       max*)
       max*)
         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
-        # shellcheck disable=SC3045 
+        # shellcheck disable=SC3045
         MAX_FD=$( ulimit -H -n ) ||
         MAX_FD=$( ulimit -H -n ) ||
             warn "Could not query maximum file descriptor limit"
             warn "Could not query maximum file descriptor limit"
     esac
     esac
@@ -152,7 +149,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
       '' | soft) :;; #(
       '' | soft) :;; #(
       *)
       *)
         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
-        # shellcheck disable=SC3045 
+        # shellcheck disable=SC3045
         ulimit -n "$MAX_FD" ||
         ulimit -n "$MAX_FD" ||
             warn "Could not set maximum file descriptor limit to $MAX_FD"
             warn "Could not set maximum file descriptor limit to $MAX_FD"
     esac
     esac
@@ -197,6 +194,10 @@ if "$cygwin" || "$msys" ; then
     done
     done
 fi
 fi
 
 
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
 # Collect all arguments for the java command;
 # Collect all arguments for the java command;
 #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
 #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
 #     shell script including quotes and variable substitutions, so put them in
 #     shell script including quotes and variable substitutions, so put them in

+ 21 - 0
frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile

@@ -0,0 +1,21 @@
+#
+# BUILD
+#
+FROM ghcr.io/graalvm/native-image:ol9-java17-22.3.2 as build
+USER root
+WORKDIR /hexagon
+
+ADD . .
+RUN microdnf -y install findutils
+RUN ./gradlew --quiet classes
+RUN ./gradlew --quiet -x test nativeCompile
+
+#
+# RUNTIME
+#
+FROM scratch
+ARG PROJECT=hexagon_jetty_postgresql
+
+COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT /
+
+ENTRYPOINT [ "/hexagon_jetty_postgresql" ]

+ 7 - 8
frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile

@@ -1,24 +1,23 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM eclipse-temurin:19-jre-alpine
+FROM docker.io/eclipse-temurin:20-jre-alpine
+ARG PROJECT=hexagon_jetty_pgclient
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV PROJECT hexagon_jetty_pgclient
 ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true
 ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true
 
 
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 
 
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT
+ENTRYPOINT [ "/opt/hexagon_jetty_pgclient/bin/hexagon_jetty_pgclient" ]

+ 7 - 8
frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile

@@ -1,24 +1,23 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM eclipse-temurin:19-jre-alpine
+FROM docker.io/eclipse-temurin:20-jre-alpine
+ARG PROJECT=hexagon_jetty_postgresql
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV PROJECT hexagon_jetty_postgresql
 ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true
 ENV JDK_JAVA_OPTIONS --enable-preview -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA -DvirtualThreads=true
 
 
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 
 
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT
+ENTRYPOINT [ "/opt/hexagon_jetty_postgresql/bin/hexagon_jetty_postgresql" ]

+ 23 - 0
frameworks/Kotlin/hexagon/hexagon-netty-async-pgclient.dockerfile

@@ -0,0 +1,23 @@
+#
+# BUILD
+#
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
+USER root
+WORKDIR /hexagon
+
+ADD . .
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
+
+#
+# RUNTIME
+#
+FROM docker.io/eclipse-temurin:17-jre-alpine
+ARG PROJECT=hexagon_netty_async_pgclient
+
+ENV POSTGRESQL_DB_HOST tfb-database
+ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
+
+COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
+
+ENTRYPOINT [ "/opt/hexagon_netty_async_pgclient/bin/hexagon_netty_async_pgclient" ]

+ 21 - 0
frameworks/Kotlin/hexagon/hexagon-netty-native.dockerfile

@@ -0,0 +1,21 @@
+#
+# BUILD
+#
+FROM ghcr.io/graalvm/native-image:ol9-java17-22.3.2 as build
+USER root
+WORKDIR /hexagon
+
+ADD . .
+RUN microdnf -y install findutils
+RUN ./gradlew --quiet classes
+RUN ./gradlew --quiet -x test nativeCompile
+
+#
+# RUNTIME
+#
+FROM scratch
+ARG PROJECT=hexagon_netty_postgresql
+
+COPY --from=build /hexagon/$PROJECT/build/native/nativeCompile/$PROJECT /
+
+ENTRYPOINT [ "/hexagon_netty_postgresql" ]

+ 7 - 8
frameworks/Kotlin/hexagon/hexagon-netty.dockerfile

@@ -1,24 +1,23 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM eclipse-temurin:17-jre-alpine
+FROM docker.io/eclipse-temurin:17-jre-alpine
+ARG PROJECT=hexagon_netty_postgresql
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV PROJECT hexagon_netty_postgresql
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 
 
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 
 
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT
+ENTRYPOINT [ "/opt/hexagon_netty_postgresql/bin/hexagon_netty_postgresql" ]

+ 7 - 8
frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile

@@ -1,24 +1,23 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM eclipse-temurin:17-jre-alpine
+FROM docker.io/eclipse-temurin:17-jre-alpine
+ARG PROJECT=hexagon_nettyepoll_pgclient
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV PROJECT hexagon_nettyepoll_pgclient
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 
 
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 
 
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT
+ENTRYPOINT [ "/opt/hexagon_nettyepoll_pgclient/bin/hexagon_nettyepoll_pgclient" ]

+ 7 - 8
frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile

@@ -1,24 +1,23 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM eclipse-temurin:17-jre-alpine
+FROM docker.io/eclipse-temurin:17-jre-alpine
+ARG PROJECT=hexagon_nettyepoll_postgresql
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV PROJECT hexagon_nettyepoll_postgresql
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 
 
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 
 
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT
+ENTRYPOINT [ "/opt/hexagon_nettyepoll_postgresql/bin/hexagon_nettyepoll_postgresql" ]

+ 6 - 6
frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile

@@ -1,21 +1,21 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test war
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM tomcat:10.1.2-jre17-temurin
+FROM docker.io/tomcat:10-jre17-temurin-jammy
+ARG MODULE=/hexagon/hexagon_tomcat_postgresql
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV MODULE /hexagon/hexagon_tomcat_postgresql
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 
 
 COPY --from=build $MODULE/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war
 COPY --from=build $MODULE/build/libs/ROOT.war /usr/local/tomcat/webapps/ROOT.war
-EXPOSE 8080

+ 23 - 0
frameworks/Kotlin/hexagon/hexagon-vertx-pgclient.dockerfile

@@ -0,0 +1,23 @@
+#
+# BUILD
+#
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
+USER root
+WORKDIR /hexagon
+
+ADD . .
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
+
+#
+# RUNTIME
+#
+FROM docker.io/eclipse-temurin:17-jre-alpine
+ARG PROJECT=hexagon_vertx_pgclient
+
+ENV POSTGRESQL_DB_HOST tfb-database
+ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
+
+COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
+
+ENTRYPOINT [ "/opt/hexagon_vertx_pgclient/bin/hexagon_vertx_pgclient" ]

+ 7 - 8
frameworks/Kotlin/hexagon/hexagon.dockerfile

@@ -1,24 +1,23 @@
 #
 #
 # BUILD
 # BUILD
 #
 #
-FROM gradle:8.0.2-jdk17-alpine AS build
+FROM docker.io/gradle:8.1.1-jdk17-alpine AS build
 USER root
 USER root
 WORKDIR /hexagon
 WORKDIR /hexagon
 
 
 ADD . .
 ADD . .
-RUN gradle --quiet compileRocker
-RUN gradle --quiet -x test
+RUN gradle --quiet classes
+RUN gradle --quiet -x test installDist
 
 
 #
 #
 # RUNTIME
 # RUNTIME
 #
 #
-FROM eclipse-temurin:17-jre-alpine
+FROM docker.io/eclipse-temurin:17-jre-alpine
+ARG PROJECT=hexagon_jetty_postgresql
+
 ENV POSTGRESQL_DB_HOST tfb-database
 ENV POSTGRESQL_DB_HOST tfb-database
-ENV PROJECT hexagon_jetty_postgresql
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 ENV JDK_JAVA_OPTIONS -XX:+AlwaysPreTouch -XX:+UseParallelGC -XX:+UseNUMA
 
 
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 COPY --from=build /hexagon/$PROJECT/build/install/$PROJECT /opt/$PROJECT
 
 
-EXPOSE 9090
-
-ENTRYPOINT /opt/$PROJECT/bin/$PROJECT
+ENTRYPOINT [ "/opt/hexagon_jetty_postgresql/bin/hexagon_jetty_postgresql" ]

+ 0 - 6
frameworks/Kotlin/hexagon/hexagon_jetty_pgclient/build.gradle

@@ -1,13 +1,7 @@
 
 
 apply(from: "$gradleScripts/application.gradle")
 apply(from: "$gradleScripts/application.gradle")
 
 
-application {
-    mainClass.set("com.hexagonkt.BenchmarkKt")
-}
-
 dependencies {
 dependencies {
     api(project(":store_pgclient"))
     api(project(":store_pgclient"))
     api("com.hexagonkt:http_server_jetty:$hexagonVersion")
     api("com.hexagonkt:http_server_jetty:$hexagonVersion")
 }
 }
-
-build.dependsOn("installDist")

+ 1 - 6
frameworks/Kotlin/hexagon/hexagon_jetty_postgresql/build.gradle

@@ -1,13 +1,8 @@
 
 
 apply(from: "$gradleScripts/application.gradle")
 apply(from: "$gradleScripts/application.gradle")
-
-application {
-    mainClass.set("com.hexagonkt.BenchmarkKt")
-}
+apply(from: "$gradleScripts/native.gradle")
 
 
 dependencies {
 dependencies {
     api(project(":store_sql"))
     api(project(":store_sql"))
     api("com.hexagonkt:http_server_jetty:$hexagonVersion")
     api("com.hexagonkt:http_server_jetty:$hexagonVersion")
 }
 }
-
-build.dependsOn("installDist")

+ 7 - 0
frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/build.gradle

@@ -0,0 +1,7 @@
+
+apply(from: "$gradleScripts/application.gradle")
+
+dependencies {
+    api(project(":store_pgclient_async"))
+    api("com.hexagonkt:http_server_netty_async:$hexagonVersion")
+}

+ 25 - 0
frameworks/Kotlin/hexagon/hexagon_netty_async_pgclient/src/main/kotlin/Benchmark.kt

@@ -0,0 +1,25 @@
+package com.hexagonkt
+
+import com.hexagonkt.async.Benchmark
+import com.hexagonkt.async.store.BenchmarkPgClientStore
+import com.hexagonkt.http.server.netty.async.NettyServerAdapter
+import com.hexagonkt.templates.rocker.RockerAdapter
+import io.netty.util.ResourceLeakDetector
+import io.netty.util.ResourceLeakDetector.Level.DISABLED
+import java.net.URL
+
+fun main() {
+    ResourceLeakDetector.setLevel(DISABLED)
+
+    System.setProperty("io.netty.buffer.checkBounds", "false")
+    System.setProperty("io.netty.buffer.checkAccessible", "false")
+
+    val settings = Settings()
+    val store = BenchmarkPgClientStore("postgresql")
+    val templateEngine = RockerAdapter()
+    val templateUrl = URL("classpath:fortunes.rocker.html")
+    val engine = NettyServerAdapter(bossGroupThreads = 48)
+
+    val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings)
+    benchmark.server.start()
+}

+ 1 - 6
frameworks/Kotlin/hexagon/hexagon_netty_postgresql/build.gradle

@@ -1,13 +1,8 @@
 
 
 apply(from: "$gradleScripts/application.gradle")
 apply(from: "$gradleScripts/application.gradle")
-
-application {
-    mainClass.set("com.hexagonkt.BenchmarkKt")
-}
+apply(from: "$gradleScripts/native.gradle")
 
 
 dependencies {
 dependencies {
     api(project(":store_sql"))
     api(project(":store_sql"))
     api("com.hexagonkt:http_server_netty:$hexagonVersion")
     api("com.hexagonkt:http_server_netty:$hexagonVersion")
 }
 }
-
-build.dependsOn("installDist")

+ 7 - 0
frameworks/Kotlin/hexagon/hexagon_netty_postgresql/src/main/kotlin/Benchmark.kt

@@ -3,9 +3,16 @@ package com.hexagonkt
 import com.hexagonkt.http.server.netty.NettyServerAdapter
 import com.hexagonkt.http.server.netty.NettyServerAdapter
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.templates.rocker.RockerAdapter
 import com.hexagonkt.templates.rocker.RockerAdapter
+import io.netty.util.ResourceLeakDetector
+import io.netty.util.ResourceLeakDetector.Level.DISABLED
 import java.net.URL
 import java.net.URL
 
 
 fun main() {
 fun main() {
+    ResourceLeakDetector.setLevel(DISABLED)
+
+    System.setProperty("io.netty.buffer.checkBounds", "false")
+    System.setProperty("io.netty.buffer.checkAccessible", "false")
+
     val settings = Settings()
     val settings = Settings()
     val store = BenchmarkSqlStore("postgresql")
     val store = BenchmarkSqlStore("postgresql")
     val templateEngine = RockerAdapter()
     val templateEngine = RockerAdapter()

+ 0 - 6
frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/build.gradle

@@ -1,14 +1,8 @@
 
 
 apply(from: "$gradleScripts/application.gradle")
 apply(from: "$gradleScripts/application.gradle")
 
 
-application {
-    mainClass.set("com.hexagonkt.BenchmarkKt")
-}
-
 dependencies {
 dependencies {
     api(project(":store_pgclient"))
     api(project(":store_pgclient"))
     api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion")
     api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion")
     api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64")
     api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64")
 }
 }
-
-build.dependsOn("installDist")

+ 7 - 0
frameworks/Kotlin/hexagon/hexagon_nettyepoll_pgclient/src/main/kotlin/Benchmark.kt

@@ -3,9 +3,16 @@ package com.hexagonkt
 import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter
 import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter
 import com.hexagonkt.store.BenchmarkPgClientStore
 import com.hexagonkt.store.BenchmarkPgClientStore
 import com.hexagonkt.templates.rocker.RockerAdapter
 import com.hexagonkt.templates.rocker.RockerAdapter
+import io.netty.util.ResourceLeakDetector
+import io.netty.util.ResourceLeakDetector.Level.DISABLED
 import java.net.URL
 import java.net.URL
 
 
 fun main() {
 fun main() {
+    ResourceLeakDetector.setLevel(DISABLED)
+
+    System.setProperty("io.netty.buffer.checkBounds", "false")
+    System.setProperty("io.netty.buffer.checkAccessible", "false")
+
     val settings = Settings()
     val settings = Settings()
     val store = BenchmarkPgClientStore("postgresql")
     val store = BenchmarkPgClientStore("postgresql")
     val templateEngine = RockerAdapter()
     val templateEngine = RockerAdapter()

+ 0 - 6
frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/build.gradle

@@ -1,14 +1,8 @@
 
 
 apply(from: "$gradleScripts/application.gradle")
 apply(from: "$gradleScripts/application.gradle")
 
 
-application {
-    mainClass.set("com.hexagonkt.BenchmarkKt")
-}
-
 dependencies {
 dependencies {
     api(project(":store_sql"))
     api(project(":store_sql"))
     api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion")
     api("com.hexagonkt:http_server_netty_epoll:$hexagonVersion")
     api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64")
     api("io.netty:netty-transport-native-epoll:$nettyVersion:linux-x86_64")
 }
 }
-
-build.dependsOn("installDist")

+ 7 - 0
frameworks/Kotlin/hexagon/hexagon_nettyepoll_postgresql/src/main/kotlin/Benchmark.kt

@@ -3,9 +3,16 @@ package com.hexagonkt
 import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter
 import com.hexagonkt.http.server.netty.epoll.NettyEpollServerAdapter
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.templates.rocker.RockerAdapter
 import com.hexagonkt.templates.rocker.RockerAdapter
+import io.netty.util.ResourceLeakDetector
+import io.netty.util.ResourceLeakDetector.Level.DISABLED
 import java.net.URL
 import java.net.URL
 
 
 fun main() {
 fun main() {
+    ResourceLeakDetector.setLevel(DISABLED)
+
+    System.setProperty("io.netty.buffer.checkBounds", "false")
+    System.setProperty("io.netty.buffer.checkAccessible", "false")
+
     val settings = Settings()
     val settings = Settings()
     val store = BenchmarkSqlStore("postgresql")
     val store = BenchmarkSqlStore("postgresql")
     val templateEngine = RockerAdapter()
     val templateEngine = RockerAdapter()

+ 2 - 2
frameworks/Kotlin/hexagon/hexagon_tomcat_postgresql/src/main/kotlin/WebListenerServer.kt

@@ -2,8 +2,8 @@ package com.hexagonkt
 
 
 import com.hexagonkt.http.model.Header
 import com.hexagonkt.http.model.Header
 import com.hexagonkt.http.model.Headers
 import com.hexagonkt.http.model.Headers
-import com.hexagonkt.http.server.handlers.HttpHandler
-import com.hexagonkt.http.server.handlers.OnHandler
+import com.hexagonkt.http.handlers.HttpHandler
+import com.hexagonkt.http.handlers.OnHandler
 import com.hexagonkt.http.server.servlet.ServletServer
 import com.hexagonkt.http.server.servlet.ServletServer
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.store.BenchmarkSqlStore
 import com.hexagonkt.templates.rocker.RockerAdapter
 import com.hexagonkt.templates.rocker.RockerAdapter

+ 9 - 0
frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/build.gradle

@@ -0,0 +1,9 @@
+
+apply(from: "$gradleScripts/application.gradle")
+
+dependencies {
+    api(project(":store_pgclient_async"))
+    api("com.hexagonkt:http_server_vertx_async:$hexagonVersion")
+    api("io.vertx:vertx-io_uring-incubator:4.4.2")
+    api("io.netty:netty-transport-native-epoll:4.1.93.Final")
+}

+ 33 - 0
frameworks/Kotlin/hexagon/hexagon_vertx_pgclient/src/main/kotlin/Benchmark.kt

@@ -0,0 +1,33 @@
+package com.hexagonkt
+
+import com.hexagonkt.async.Benchmark
+import com.hexagonkt.async.store.BenchmarkPgClientStore
+import com.hexagonkt.http.server.vertx.VertxServerAdapter
+import com.hexagonkt.templates.rocker.RockerAdapter
+import io.netty.util.ResourceLeakDetector
+import io.netty.util.ResourceLeakDetector.Level.DISABLED
+import java.net.URL
+
+fun main() {
+    ResourceLeakDetector.setLevel(DISABLED)
+
+    System.setProperty("vertx.disableMetrics", "true")
+    System.setProperty("vertx.disableH2c", "true")
+    System.setProperty("vertx.disableWebsockets", "true")
+    System.setProperty("vertx.flashPolicyHandler", "false")
+    System.setProperty("vertx.threadChecks", "false")
+    System.setProperty("vertx.disableContextTimings", "true")
+    System.setProperty("vertx.disableTCCL", "true")
+    System.setProperty("vertx.disableHttpHeadersValidation", "true")
+    System.setProperty("io.netty.buffer.checkBounds", "false")
+    System.setProperty("io.netty.buffer.checkAccessible", "false")
+
+    val settings = Settings()
+    val store = BenchmarkPgClientStore("postgresql")
+    val templateEngine = RockerAdapter()
+    val templateUrl = URL("classpath:fortunes.rocker.html")
+    val engine = VertxServerAdapter(preferNativeTransport = true)
+
+    val benchmark = Benchmark(engine, store, templateEngine, templateUrl, settings)
+    benchmark.server.start()
+}

+ 4 - 0
frameworks/Kotlin/hexagon/model/build.gradle

@@ -0,0 +1,4 @@
+
+dependencies {
+    api("com.hexagonkt:core:$hexagonVersion")
+}

+ 0 - 0
frameworks/Kotlin/hexagon/core/src/main/kotlin/Settings.kt → frameworks/Kotlin/hexagon/model/src/main/kotlin/Settings.kt


+ 0 - 0
frameworks/Kotlin/hexagon/core/src/main/kotlin/model/CachedWorld.kt → frameworks/Kotlin/hexagon/model/src/main/kotlin/model/CachedWorld.kt


+ 0 - 0
frameworks/Kotlin/hexagon/core/src/main/kotlin/model/Fortune.kt → frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Fortune.kt


+ 0 - 0
frameworks/Kotlin/hexagon/core/src/main/kotlin/model/Message.kt → frameworks/Kotlin/hexagon/model/src/main/kotlin/model/Message.kt


+ 0 - 0
frameworks/Kotlin/hexagon/core/src/main/kotlin/model/World.kt → frameworks/Kotlin/hexagon/model/src/main/kotlin/model/World.kt


+ 5 - 0
frameworks/Kotlin/hexagon/settings.gradle

@@ -1,13 +1,18 @@
 
 
 include(
 include(
+    "model",
     "core",
     "core",
+    "core_async",
     "store_pgclient",
     "store_pgclient",
+    "store_pgclient_async",
     "store_sql",
     "store_sql",
 
 
     "hexagon_jetty_pgclient",
     "hexagon_jetty_pgclient",
     "hexagon_jetty_postgresql",
     "hexagon_jetty_postgresql",
     "hexagon_netty_postgresql",
     "hexagon_netty_postgresql",
+    "hexagon_netty_async_pgclient",
     "hexagon_nettyepoll_pgclient",
     "hexagon_nettyepoll_pgclient",
     "hexagon_nettyepoll_postgresql",
     "hexagon_nettyepoll_postgresql",
+    "hexagon_vertx_pgclient",
     "hexagon_tomcat_postgresql",
     "hexagon_tomcat_postgresql",
 )
 )

+ 1 - 1
frameworks/Kotlin/hexagon/store_pgclient/src/main/kotlin/BenchmarkPgClientStore.kt

@@ -24,7 +24,7 @@ class BenchmarkPgClientStore(
 
 
     private val connectOptions: PgConnectOptions by lazy {
     private val connectOptions: PgConnectOptions by lazy {
         PgConnectOptions().apply {
         PgConnectOptions().apply {
-            host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost"
+            host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database"
             database = settings.databaseName
             database = settings.databaseName
             user = settings.databaseUsername
             user = settings.databaseUsername
             password = settings.databasePassword
             password = settings.databasePassword

+ 6 - 0
frameworks/Kotlin/hexagon/store_pgclient_async/build.gradle

@@ -0,0 +1,6 @@
+
+dependencies {
+    api(project(":core_async"))
+    implementation("io.vertx:vertx-pg-client:$vertxVersion")
+    implementation("com.ongres.scram:client:2.1")
+}

+ 114 - 0
frameworks/Kotlin/hexagon/store_pgclient_async/src/main/kotlin/BenchmarkPgClientStore.kt

@@ -0,0 +1,114 @@
+package com.hexagonkt.async.store
+
+import com.hexagonkt.Settings
+import com.hexagonkt.core.Jvm
+import com.hexagonkt.model.CachedWorld
+import com.hexagonkt.model.Fortune
+import com.hexagonkt.model.World
+import io.vertx.core.CompositeFuture.all
+import io.vertx.core.Future
+import io.vertx.core.Vertx.vertx
+import io.vertx.pgclient.PgConnectOptions
+import io.vertx.pgclient.PgPool
+import io.vertx.sqlclient.*
+import org.cache2k.Cache
+import java.util.concurrent.CompletableFuture
+
+class BenchmarkPgClientStore(
+    engine: String,
+    private val settings: Settings = Settings(),
+) : BenchmarkStore(settings) {
+
+    companion object {
+        private const val SELECT_WORLD: String = "select * from world where id = $1"
+        private const val UPDATE_WORLD: String = "update world set randomNumber = $1 where id = $2"
+        private const val SELECT_ALL_FORTUNES: String = "select * from fortune"
+    }
+
+    private val connectOptions: PgConnectOptions by lazy {
+        PgConnectOptions().apply {
+            host = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database"
+            database = settings.databaseName
+            user = settings.databaseUsername
+            password = settings.databasePassword
+            cachePreparedStatements = true
+        }
+    }
+
+    private val poolOptions: PoolOptions by lazy {
+        PoolOptions().apply {
+            val environment = Jvm.systemSettingOrNull<String>("BENCHMARK_ENV")?.lowercase()
+            maxSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2
+        }
+    }
+
+    private val dataSource: SqlClient by lazy { PgPool.pool(vertx(), connectOptions, poolOptions) }
+
+    override fun findAllFortunes(): CompletableFuture<List<Fortune>> =
+        dataSource.preparedQuery(SELECT_ALL_FORTUNES)
+            .execute()
+            .map { rowSet ->
+                rowSet.map { row -> Fortune(row.getInteger(0), row.getString(1)) }
+            }
+            .toCompletionStage()
+            .toCompletableFuture()
+
+    override fun findWorlds(ids: List<Int>): CompletableFuture<List<World>> {
+        val futures = ids.map { findWorld(it, dataSource) }
+        return all(futures).map { it.list<World>() }.toCompletionStage().toCompletableFuture()
+    }
+
+    override fun replaceWorlds(worlds: List<World>): CompletableFuture<*> {
+        val futures = worlds.map {
+            val worldId = it.id
+            val newRandomNumber = it.randomNumber
+            dataSource
+                .preparedQuery(SELECT_WORLD)
+                .execute(Tuple.of(worldId))
+                .flatMap { rowSet ->
+                    val row = rowSet.iterator().next()
+                    row.getInteger(1) // Read 'randomNumber' to comply with Test type 5, point 6
+                    dataSource
+                        .preparedQuery(UPDATE_WORLD)
+                        .execute(Tuple.of(newRandomNumber, worldId))
+                }
+        }
+        return all(futures).toCompletionStage().toCompletableFuture()
+    }
+
+    override fun initWorldsCache(cache: Cache<Int, CachedWorld>) {
+        dataSource
+            .preparedQuery("select * from world")
+            .execute()
+            .map { rowSet ->
+                rowSet.map { row ->
+                    val id = row.getInteger(0)
+                    val randomNumber = row.getInteger(1)
+                    cache.put(id, CachedWorld(id, randomNumber))
+                }
+            }
+            .toCompletionStage()
+            .toCompletableFuture()
+            .get()
+    }
+
+    override fun loadCachedWorld(id: Int): CachedWorld =
+        findWorld(id, dataSource)
+            .map { world -> CachedWorld(world.id, world.randomNumber) }
+            .toCompletionStage()
+            .toCompletableFuture()
+            .get()
+
+    override fun close() {
+        dataSource.close()
+    }
+
+    private fun findWorld(id: Int, client: SqlClient): Future<World> =
+        client
+            .preparedQuery(SELECT_WORLD)
+            .execute(Tuple.of(id))
+            .map { rowSet ->
+                val row = rowSet.iterator().next()
+                World(row.getInteger(0), row.getInteger(1))
+            }
+}

+ 1 - 1
frameworks/Kotlin/hexagon/store_sql/src/main/kotlin/BenchmarkSqlStore.kt

@@ -22,7 +22,7 @@ class BenchmarkSqlStore(
     }
     }
 
 
     private val dataSource: HikariDataSource by lazy {
     private val dataSource: HikariDataSource by lazy {
-        val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "localhost"
+        val dbHost = Jvm.systemSettingOrNull("${engine.uppercase()}_DB_HOST") ?: "tfb-database"
         val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase()
         val environment = Jvm.systemSettingOrNull(String::class, "BENCHMARK_ENV")?.lowercase()
         val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2
         val poolSize = 8 + if (environment == "citrine") Jvm.cpuCount else Jvm.cpuCount * 2
         val postgresqlSettings = listOf(
         val postgresqlSettings = listOf(