Browse Source

Merge branch 'TechEmpower:master' into master

Huang ziquan 1 year ago
parent
commit
858f4438e6
100 changed files with 1009 additions and 247 deletions
  1. 12 13
      Dockerfile
  2. 1 0
      frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj
  3. 1 1
      frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj
  4. 1 1
      frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj
  5. 1 1
      frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj
  6. 1 1
      frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj
  7. 3 3
      frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj
  8. 1 1
      frameworks/CSharp/sisk/sisk/sisk.csproj
  9. 1 1
      frameworks/FSharp/falco/src/App/App.fsproj
  10. 1 1
      frameworks/FSharp/frank/src/App/App.fsproj
  11. 19 19
      frameworks/FSharp/giraffe/src/App/App.fsproj
  12. 360 0
      frameworks/FSharp/oxpecker/.gitignore
  13. 26 0
      frameworks/FSharp/oxpecker/README.md
  14. 27 0
      frameworks/FSharp/oxpecker/benchmark_config.json
  15. 16 0
      frameworks/FSharp/oxpecker/config.toml
  16. 14 0
      frameworks/FSharp/oxpecker/oxpecker.dockerfile
  17. 22 0
      frameworks/FSharp/oxpecker/src/App/App.fsproj
  18. 112 0
      frameworks/FSharp/oxpecker/src/App/Program.fs
  19. 7 0
      frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json
  20. 1 1
      frameworks/FSharp/zebra/src/App/App.fsproj
  21. 3 2
      frameworks/Java/inverno/inverno-postgres.dockerfile
  22. 4 4
      frameworks/Java/inverno/pom.xml
  23. 15 15
      frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java
  24. 3 1
      frameworks/Java/inverno/src/main/resources/configuration.cprops
  25. 2 2
      frameworks/Java/micronaut/buildSrc/build.gradle
  26. 1 1
      frameworks/Java/micronaut/gradle.properties
  27. BIN
      frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.jar
  28. 1 1
      frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.properties
  29. 10 10
      frameworks/Java/micronaut/gradlew.bat
  30. 4 5
      frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile
  31. 1 1
      frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile
  32. 4 5
      frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile
  33. 1 1
      frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile
  34. 1 1
      frameworks/Java/micronaut/micronaut-data-mongodb/build.gradle
  35. 4 5
      frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile
  36. 1 1
      frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile
  37. 4 4
      frameworks/Java/micronaut/micronaut-graalvm.dockerfile
  38. 4 5
      frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile
  39. 1 1
      frameworks/Java/micronaut/micronaut-jdbc.dockerfile
  40. 4 5
      frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile
  41. 1 1
      frameworks/Java/micronaut/micronaut-r2dbc.dockerfile
  42. 1 1
      frameworks/Java/micronaut/micronaut.dockerfile
  43. 2 13
      frameworks/Java/quarkus/pom.xml
  44. 2 2
      frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml
  45. 2 2
      frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml
  46. 0 1
      frameworks/Java/quarkus/vertx/pom.xml
  47. 1 1
      frameworks/JavaScript/express/express-mongodb.dockerfile
  48. 1 1
      frameworks/JavaScript/express/express-mysql.dockerfile
  49. 1 1
      frameworks/JavaScript/express/express-postgres.dockerfile
  50. 1 1
      frameworks/JavaScript/express/express.dockerfile
  51. 1 5
      frameworks/JavaScript/express/mongodb-app.js
  52. 1 1
      frameworks/JavaScript/express/package.json
  53. 1 7
      frameworks/JavaScript/fastify/db/mongo.js
  54. 1 1
      frameworks/JavaScript/fastify/fastify-mysql.dockerfile
  55. 1 1
      frameworks/JavaScript/fastify/fastify-postgres.dockerfile
  56. 1 1
      frameworks/JavaScript/fastify/fastify.dockerfile
  57. 1 1
      frameworks/JavaScript/fastify/package.json
  58. 1 1
      frameworks/JavaScript/sailsjs/package.json
  59. 4 1
      frameworks/JavaScript/uwebsockets.js/README.md
  60. 21 0
      frameworks/JavaScript/uwebsockets.js/benchmark_config.json
  61. 74 5
      frameworks/JavaScript/uwebsockets.js/package-lock.json
  62. 4 3
      frameworks/JavaScript/uwebsockets.js/package.json
  63. 16 0
      frameworks/JavaScript/uwebsockets.js/src/database/mysql.js
  64. 12 0
      frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile
  65. 1 1
      frameworks/PHP/amp/amp.dockerfile
  66. 1 1
      frameworks/PHP/comet/comet-mysql.dockerfile
  67. 1 1
      frameworks/PHP/comet/comet.dockerfile
  68. 1 1
      frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile
  69. 1 1
      frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile
  70. 1 1
      frameworks/PHP/kumbiaphp/server.php
  71. 23 0
      frameworks/PHP/laravel/benchmark_config.json
  72. 1 1
      frameworks/PHP/laravel/config/app.php
  73. 29 0
      frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile
  74. 1 1
      frameworks/PHP/laravel/laravel-workerman.dockerfile
  75. 1 1
      frameworks/PHP/leaf/leaf-workerman.dockerfile
  76. 1 1
      frameworks/PHP/lumen/lumen-workerman.dockerfile
  77. 1 1
      frameworks/PHP/mark/mark.dockerfile
  78. 1 1
      frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile
  79. 1 1
      frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile
  80. 1 1
      frameworks/PHP/php/php-workerman.dockerfile
  81. 1 1
      frameworks/PHP/slim/slim-workerman-pgsql.dockerfile
  82. 1 1
      frameworks/PHP/slim/slim-workerman.dockerfile
  83. 1 1
      frameworks/PHP/symfony/symfony-workerman.dockerfile
  84. 1 1
      frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile
  85. 1 1
      frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile
  86. 1 1
      frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile
  87. 1 1
      frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile
  88. 1 1
      frameworks/PHP/webman/webman.dockerfile
  89. 1 1
      frameworks/PHP/yii2/yii2-workerman.dockerfile
  90. 1 0
      frameworks/Pascal/mormot/benchmark_config.json
  91. 1 1
      frameworks/Pascal/mormot/setup_and_build.sh
  92. 78 51
      frameworks/Pascal/mormot/src/raw.pas
  93. 1 1
      frameworks/Python/aiohttp/requirements.txt
  94. 1 1
      frameworks/Python/aioworkers/requirements-pg.txt
  95. 1 1
      frameworks/Python/api_hour/requirements.txt
  96. 1 1
      frameworks/Python/apidaora/requirements.txt
  97. 1 1
      frameworks/Python/bareasgi/requirements.txt
  98. 1 1
      frameworks/Python/blacksheep/requirements.txt
  99. 1 1
      frameworks/Python/falcon/requirements.txt
  100. 1 1
      frameworks/Python/fastapi/requirements.txt

+ 12 - 13
Dockerfile

@@ -1,4 +1,4 @@
-FROM ubuntu:22.04
+FROM ubuntu:24.04
 
 
 ARG DEBIAN_FRONTEND=noninteractive
 ARG DEBIAN_FRONTEND=noninteractive
 # WARNING: DON'T PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
 # WARNING: DON'T PUT A SPACE AFTER ANY BACKSLASH OR APT WILL BREAK
@@ -20,22 +20,21 @@ RUN apt-get -yqq update && \
       python3 \
       python3 \
       python3-dev \
       python3-dev \
       python3-pip \
       python3-pip \
+      python3-psutil \
+      python3-psycopg2 \
+      python3-requests \
       siege \
       siege \
-      software-properties-common
-
-RUN pip3 install \
+      software-properties-common && \
+    # Ubuntu's equivalent packages are too old and/or broken.
+    pip3 install \
+      --break-system-packages \
       colorama==0.3.1 \
       colorama==0.3.1 \
-      docker==4.0.2 \
-      mysqlclient \
-      psutil \
-      psycopg2-binary \
-      pymongo==3.13.0 \
-      # urllib3 incompatibility:
-      # https://github.com/docker/docker-py/issues/3113#issuecomment-1525500104
-      requests==2.28.1
+      docker==7.0.0 \
+      mysqlclient==2.2.4 \
+      pymongo==3.13.0
 
 
 # Collect resource usage statistics
 # Collect resource usage statistics
-ARG DOOL_VERSION=v1.2.0
+ARG DOOL_VERSION=v1.3.1
 
 
 WORKDIR /tmp
 WORKDIR /tmp
 RUN curl -LSs "https://github.com/scottchiefbaker/dool/archive/${DOOL_VERSION}.tar.gz" | \
 RUN curl -LSs "https://github.com/scottchiefbaker/dool/archive/${DOOL_VERSION}.tar.gz" | \

+ 1 - 0
frameworks/CSharp/aspnetcore-mono/Benchmarks/Benchmarks.csproj

@@ -25,6 +25,7 @@
 
 
     <PackageReference Include="Dapper" Version="2.0.90" />
     <PackageReference Include="Dapper" Version="2.0.90" />
     <PackageReference Include="MySqlConnector" Version="1.0.1" />
     <PackageReference Include="MySqlConnector" Version="1.0.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0-rc1" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.0-rc1" />
     <PackageReference Include="System.IO.Pipelines" Version="5.0.0-rc.1.20451.14" />
     <PackageReference Include="System.IO.Pipelines" Version="5.0.0-rc.1.20451.14" />
   </ItemGroup>
   </ItemGroup>

+ 1 - 1
frameworks/CSharp/aspnetcore-mono/PlatformBenchmarks/PlatformBenchmarks.csproj

@@ -23,7 +23,7 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="5.0.0-alpha1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="System.IO.Pipelines" Version="5.0.0-rc.1.20451.14" />
     <PackageReference Include="System.IO.Pipelines" Version="5.0.0-rc.1.20451.14" />
   </ItemGroup>
   </ItemGroup>
 
 

+ 1 - 1
frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="8.0.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Dapper" Version="2.1.21" />
     <PackageReference Include="Dapper" Version="2.1.21" />
     <PackageReference Include="RazorSlices" Version="0.7.0" />
     <PackageReference Include="RazorSlices" Version="0.7.0" />
   </ItemGroup>
   </ItemGroup>

+ 1 - 1
frameworks/CSharp/aspnetcore/src/Mvc/Mvc.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
   </PropertyGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="8.0.0-rc.2" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0-rc.2" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0-rc.2" />
   </ItemGroup>
   </ItemGroup>
 
 

+ 1 - 1
frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj

@@ -19,7 +19,7 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Npgsql" Version="8.0.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="MySqlConnector" Version="2.3.1" />
     <PackageReference Include="MySqlConnector" Version="2.3.1" />
     <PackageReference Include="Dapper" Version="2.1.21" />
     <PackageReference Include="Dapper" Version="2.1.21" />
     <PackageReference Include="RazorSlices" Version="0.7.0" Condition="$(PublishAot) != 'true'" />
     <PackageReference Include="RazorSlices" Version="0.7.0" Condition="$(PublishAot) != 'true'" />

+ 3 - 3
frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj

@@ -28,9 +28,9 @@
     
     
   <ItemGroup>
   <ItemGroup>
 	  
 	  
-    <PackageReference Include="GenHTTP.Core" Version="8.2.0" />
-    <PackageReference Include="GenHTTP.Modules.Razor" Version="8.2.0" />
-    <PackageReference Include="GenHTTP.Modules.Webservices" Version="8.2.0" />
+    <PackageReference Include="GenHTTP.Core" Version="8.3.1" />
+    <PackageReference Include="GenHTTP.Modules.Razor" Version="8.3.0" />
+    <PackageReference Include="GenHTTP.Modules.Webservices" Version="8.3.0" />
 	  
 	  
     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
     <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
     <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />

+ 1 - 1
frameworks/CSharp/sisk/sisk/sisk.csproj

@@ -9,7 +9,7 @@
 	</PropertyGroup>
 	</PropertyGroup>
 
 
 	<ItemGroup>
 	<ItemGroup>
-	  <PackageReference Include="Sisk.HttpServer" Version="0.16.0-rc-5" />
+	  <PackageReference Include="Sisk.HttpServer" Version="0.16.2" />
 	</ItemGroup>
 	</ItemGroup>
 
 
 </Project>
 </Project>

+ 1 - 1
frameworks/FSharp/falco/src/App/App.fsproj

@@ -21,7 +21,7 @@
     <PackageReference Update="FSharp.Core" Version="7.0.0" />
     <PackageReference Update="FSharp.Core" Version="7.0.0" />
     <PackageReference Include="Donald" Version="3.0.*" />
     <PackageReference Include="Donald" Version="3.0.*" />
     <PackageReference Include="Falco" Version="2.0.*" />
     <PackageReference Include="Falco" Version="2.0.*" />
-    <PackageReference Include="Npgsql" Version="7.0.0" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
   </ItemGroup>
   </ItemGroup>
 
 
 </Project>
 </Project>

+ 1 - 1
frameworks/FSharp/frank/src/App/App.fsproj

@@ -16,7 +16,7 @@
     <PackageReference Include="FSharp.Data.JsonSchema" Version="2.0.1" />
     <PackageReference Include="FSharp.Data.JsonSchema" Version="2.0.1" />
     <PackageReference Include="Giraffe" Version="6.0.0" />
     <PackageReference Include="Giraffe" Version="6.0.0" />
     <PackageReference Include="Giraffe.ViewEngine" Version="2.0.0-alpha-1" />
     <PackageReference Include="Giraffe.ViewEngine" Version="2.0.0-alpha-1" />
-    <PackageReference Include="Npgsql" Version="7.0.0" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Update="FSharp.Core" Version="7.0.0" />
     <PackageReference Update="FSharp.Core" Version="7.0.0" />
   </ItemGroup>
   </ItemGroup>
 
 

+ 19 - 19
frameworks/FSharp/giraffe/src/App/App.fsproj

@@ -1,19 +1,19 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-  <PropertyGroup>
-    <TargetFramework>net8.0</TargetFramework>
-    <EnableDefaultContentItems>false</EnableDefaultContentItems>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <PackageReference Update="FSharp.Core" Version="8.0.200" />
-    <PackageReference Include="Dapper" Version="2.1.44" />
-    <PackageReference Include="Giraffe" Version="6.4.0" />
-    <PackageReference Include="Npgsql" Version="8.0.2" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Compile Include="Program.fs" />
-  </ItemGroup>
-
-</Project>
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <EnableDefaultContentItems>false</EnableDefaultContentItems>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Update="FSharp.Core" Version="8.0.200" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Giraffe" Version="6.4.0" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Include="Program.fs" />
+  </ItemGroup>
+
+</Project>

+ 360 - 0
frameworks/FSharp/oxpecker/.gitignore

@@ -0,0 +1,360 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Ww][Ii][Nn]32/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+[Ll]ogs/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUnit
+*.VisualState.xml
+TestResult.xml
+nunit-*.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# ASP.NET Scaffolding
+ScaffoldingReadMe.txt
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Coverlet is a free, cross platform Code Coverage Tool
+coverage*[.json, .xml, .info]
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# NuGet Symbol Packages
+*.snupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- [Bb]ackup.rdl
+*- [Bb]ackup ([0-9]).rdl
+*- [Bb]ackup ([0-9][0-9]).rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+# Ionide (cross platform F# VS Code tools) working folder
+.ionide/
+
+# Fody - auto-generated XML schema
+FodyWeavers.xsd

+ 26 - 0
frameworks/FSharp/oxpecker/README.md

@@ -0,0 +1,26 @@
+# Oxpecker Tests on Linux
+This includes tests for plaintext, json, and fortunes HTML serialization.
+
+## Infrastructure Software Versions
+
+**Language**
+
+* F# 8.0
+
+**Platforms**
+
+* .NET Core (Windows and Linux)
+
+**Web Servers**
+
+* [Kestrel](https://github.com/dotnet/aspnetcore/tree/main/src/Servers/Kestrel)
+
+**Web Stack**
+
+* [Oxpecker](https://github.com/Lanayx/Oxpecker)
+* [Dapper](https://github.com/DapperLib/Dapper)
+* ASP.NET Core
+
+## Paths & Source for Tests
+
+All source code is inside `Program.fs`.

+ 27 - 0
frameworks/FSharp/oxpecker/benchmark_config.json

@@ -0,0 +1,27 @@
+{
+  "framework": "oxpecker",
+  "tests": [
+    {
+      "default": {
+        "plaintext_url": "/plaintext",
+        "json_url": "/json",
+        "fortune_url": "/fortunes",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "Postgres",
+        "framework": "Oxpecker",
+        "language": "F#",
+        "orm": "Micro",
+        "platform": ".NET",
+        "flavor": "CoreCLR",
+        "webserver": "Kestrel",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "Oxpecker, Dapper",
+        "notes": "",
+        "versus": "aspcore"
+      }
+    }
+  ]
+}

+ 16 - 0
frameworks/FSharp/oxpecker/config.toml

@@ -0,0 +1,16 @@
+[framework]
+name = "oxpecker"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "fullstack"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "micro"
+platform = ".NET"
+webserver = "Kestrel"
+versus = "aspcore"

+ 14 - 0
frameworks/FSharp/oxpecker/oxpecker.dockerfile

@@ -0,0 +1,14 @@
+FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
+WORKDIR /app
+COPY src/App .
+RUN dotnet publish -c Release -o out
+
+FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
+ENV URLS http://+:8080
+
+WORKDIR /app
+COPY --from=build /app/out ./
+
+EXPOSE 8080
+
+ENTRYPOINT ["dotnet", "App.dll"]

+ 22 - 0
frameworks/FSharp/oxpecker/src/App/App.fsproj

@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <OutputType>Exe</OutputType>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Include="Program.fs" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Update="FSharp.Core" Version="8.0.200" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Oxpecker" Version="0.10.1" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Include="runtimeconfig.template.json" />
+  </ItemGroup>
+</Project>

+ 112 - 0
frameworks/FSharp/oxpecker/src/App/Program.fs

@@ -0,0 +1,112 @@
+namespace App
+
+[<AutoOpen>]
+module Common =
+    open System
+
+    [<CLIMutable>]
+    type Fortune =
+        {
+            id      : int
+            message : string
+        }
+
+    [<Literal>]
+    let ConnectionString = "Server=tfb-database;Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;SSL Mode=Disable;Maximum Pool Size=1024;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4;Multiplexing=true;Write Coalescing Buffer Threshold Bytes=1000"
+
+    let fortuneComparer a b =
+        String.CompareOrdinal(a.message, b.message)
+
+[<RequireQualifiedAccess>]
+module HtmlViews =
+    open Oxpecker.ViewEngine
+
+    let private fortunesHead =
+        head() {
+            title() { raw "Fortunes" }
+        }
+
+    let private layout (content: HtmlElement) =
+        html() {
+            fortunesHead
+            body() { content }
+        }
+
+    let private fortunesTableHeader =
+        tr() {
+            th() { raw "id" }
+            th() { raw "message" }
+        }
+
+    let fortunes (fortunes: Fortune[]) =
+        table() {
+            fortunesTableHeader
+            for f in fortunes do
+                tr() {
+                    td() { raw <| string f.id }
+                    td() { f.message }
+                }
+        } |> layout
+
+[<RequireQualifiedAccess>]
+module HttpHandlers =
+    open Oxpecker
+    open Dapper
+    open Npgsql
+
+    let private extra =
+        {
+            id      = 0
+            message = "Additional fortune added at request time."
+        }
+
+    let private fortunes : EndpointHandler =
+        fun ctx ->
+            task {
+                use conn = new NpgsqlConnection(ConnectionString)
+                let! data = conn.QueryAsync<Fortune>("SELECT id, message FROM fortune")
+                let augmentedData = [|
+                    yield! data
+                    extra
+                |]
+                augmentedData |> Array.sortInPlaceWith fortuneComparer
+                let view = HtmlViews.fortunes augmentedData
+                return! ctx.WriteHtmlView view
+            }
+
+    let endpoints : Endpoint[] =
+        [|
+            route "/plaintext" <| text "Hello, World!"
+            route "/json"<| jsonChunked {| message = "Hello, World!" |}
+            route "/fortunes" fortunes
+        |]
+
+
+module Main =
+    open Microsoft.AspNetCore.Builder
+    open Microsoft.AspNetCore.Hosting
+    open Microsoft.Extensions.DependencyInjection
+    open Oxpecker
+    open Microsoft.Extensions.Hosting
+    open Microsoft.Extensions.Logging
+
+    [<EntryPoint>]
+    let main args =
+
+        let builder = WebApplication.CreateBuilder(args)
+
+        builder.Services
+            .AddRouting()
+            .AddOxpecker() |> ignore
+
+        builder.Logging.ClearProviders() |> ignore
+        builder.WebHost.ConfigureKestrel(fun options -> options.AllowSynchronousIO <- true) |> ignore
+
+        let app = builder.Build()
+
+        app.UseRouting()
+           .UseOxpecker HttpHandlers.endpoints |> ignore
+
+        app.Run()
+
+        0

+ 7 - 0
frameworks/FSharp/oxpecker/src/App/runtimeconfig.template.json

@@ -0,0 +1,7 @@
+{
+    "configProperties": {
+      "System.GC.Server": true,
+      "System.GC.NoAffinitize": true,
+      "System.GC.HeapCount": 2
+    }
+  }

+ 1 - 1
frameworks/FSharp/zebra/src/App/App.fsproj

@@ -10,7 +10,7 @@
 
 
   <ItemGroup>
   <ItemGroup>
     <PackageReference Include="Dapper" Version="2.1.44" />
     <PackageReference Include="Dapper" Version="2.1.44" />
-    <PackageReference Include="Npgsql" Version="8.0.2" />
+    <PackageReference Include="Npgsql" Version="8.0.3" />
     <PackageReference Include="Utf8Json" Version="1.3.7" />
     <PackageReference Include="Utf8Json" Version="1.3.7" />
     <PackageReference Update="FSharp.Core" Version="8.0.200" />
     <PackageReference Update="FSharp.Core" Version="8.0.200" />
   </ItemGroup>
   </ItemGroup>

+ 3 - 2
frameworks/Java/inverno/inverno-postgres.dockerfile

@@ -7,6 +7,7 @@ RUN mvn package -q -Pio.inverno.io_uring
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
-# CMD [ "target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark" ]
 CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \
 CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \
-    target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\"
+    target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark \
+    --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" \
+    --com.techempower.inverno.benchmark.appConfiguration.boot.reactor_event_loop_group_size=$((`grep --count ^processor /proc/cpuinfo`))

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

@@ -6,7 +6,7 @@
 	<parent>
 	<parent>
 		<groupId>io.inverno.dist</groupId>
 		<groupId>io.inverno.dist</groupId>
 		<artifactId>inverno-parent</artifactId>
 		<artifactId>inverno-parent</artifactId>
-		<version>1.9.0</version>
+		<version>1.10.0</version>
 	</parent>
 	</parent>
 	<groupId>com.techempower</groupId>
 	<groupId>com.techempower</groupId>
 	<artifactId>inverno-benchmark</artifactId>
 	<artifactId>inverno-benchmark</artifactId>
@@ -47,7 +47,7 @@
 			<groupId>io.inverno.mod</groupId>
 			<groupId>io.inverno.mod</groupId>
 			<artifactId>inverno-sql-vertx</artifactId>
 			<artifactId>inverno-sql-vertx</artifactId>
 		</dependency>
 		</dependency>
-		
+
 		<dependency>
 		<dependency>
 			<groupId>org.unbescape</groupId>
 			<groupId>org.unbescape</groupId>
 			<artifactId>unbescape</artifactId>
 			<artifactId>unbescape</artifactId>
@@ -110,7 +110,7 @@
 									<launchers>
 									<launchers>
 										<launcher>
 										<launcher>
 											<name>inverno-benchmark</name>
 											<name>inverno-benchmark</name>
-											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkBounds=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64</vmOptions>
+											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64</vmOptions>
 										</launcher>
 										</launcher>
 									</launchers>
 									</launchers>
 									<archiveFormats>
 									<archiveFormats>
@@ -157,7 +157,7 @@
 									<launchers>
 									<launchers>
 										<launcher>
 										<launcher>
 											<name>inverno-benchmark</name>
 											<name>inverno-benchmark</name>
-											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkBounds=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64</vmOptions>
+											<vmOptions>-Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dlog4j2.level=OFF -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkAccessible=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64</vmOptions>
 										</launcher>
 										</launcher>
 									</launchers>
 									</launchers>
 									<archiveFormats>
 									<archiveFormats>

+ 15 - 15
frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java

@@ -1,20 +1,11 @@
 package com.techempower.inverno.benchmark.internal;
 package com.techempower.inverno.benchmark.internal;
 
 
-import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Collections;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ThreadLocalRandom;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Supplier;
-
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.techempower.inverno.benchmark.model.Fortune;
 import com.techempower.inverno.benchmark.model.Fortune;
 import com.techempower.inverno.benchmark.model.Message;
 import com.techempower.inverno.benchmark.model.Message;
 import com.techempower.inverno.benchmark.model.World;
 import com.techempower.inverno.benchmark.model.World;
 import com.techempower.inverno.benchmark.templates.FortunesTemplate;
 import com.techempower.inverno.benchmark.templates.FortunesTemplate;
-
 import io.inverno.core.annotation.Bean;
 import io.inverno.core.annotation.Bean;
 import io.inverno.core.annotation.Bean.Visibility;
 import io.inverno.core.annotation.Bean.Visibility;
 import io.inverno.core.annotation.Destroy;
 import io.inverno.core.annotation.Destroy;
@@ -39,6 +30,13 @@ import io.netty.channel.EventLoopGroup;
 import io.netty.handler.codec.http.HttpHeaderNames;
 import io.netty.handler.codec.http.HttpHeaderNames;
 import io.netty.handler.codec.http.HttpHeaderValues;
 import io.netty.handler.codec.http.HttpHeaderValues;
 import io.netty.util.AsciiString;
 import io.netty.util.AsciiString;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Collections;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 import reactor.core.publisher.Mono;
 
 
@@ -81,6 +79,8 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 		this.dateEventLoopGroup.scheduleAtFixedRate(() -> {
 		this.dateEventLoopGroup.scheduleAtFixedRate(() -> {
 			this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
 			this.date = new AsciiString(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now()));
 		}, 0, 1000, TimeUnit.MILLISECONDS);
 		}, 0, 1000, TimeUnit.MILLISECONDS);
+		
+		
 	}
 	}
 	
 	
 	@Destroy
 	@Destroy
@@ -133,7 +133,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 
 
 	private static final ByteBuf STATIC_PLAINTEXT_BYTEBUF;
 	private static final ByteBuf STATIC_PLAINTEXT_BYTEBUF;
 	static {
 	static {
-		ByteBuf tmpBuf = Unpooled.directBuffer(STATIC_PLAINTEXT_LEN);
+		ByteBuf tmpBuf = Unpooled.buffer(STATIC_PLAINTEXT_LEN);
 		tmpBuf.writeBytes(STATIC_PLAINTEXT);
 		tmpBuf.writeBytes(STATIC_PLAINTEXT);
 		STATIC_PLAINTEXT_BYTEBUF = Unpooled.unreleasableBuffer(tmpBuf);
 		STATIC_PLAINTEXT_BYTEBUF = Unpooled.unreleasableBuffer(tmpBuf);
 	}
 	}
@@ -172,7 +172,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 				)
 				)
 				.body()
 				.body()
 					.raw()
 					.raw()
-						.value(Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!")))));
+						.value(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new Message("Hello, World!"))));
 		} 
 		} 
 		catch (JsonProcessingException | IllegalStateException e) {
 		catch (JsonProcessingException | IllegalStateException e) {
 			throw new InternalServerErrorException("Error serializing message as JSON", e);
 			throw new InternalServerErrorException("Error serializing message as JSON", e);
@@ -196,7 +196,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 						DB_SELECT_WORLD, 
 						DB_SELECT_WORLD, 
 						row -> {
 						row -> {
 							try {
 							try {
-								return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1)))));
+								return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(new World(row.getInteger(0), row.getInteger(1))));
 							} 
 							} 
 							catch (JsonProcessingException e) {
 							catch (JsonProcessingException e) {
 								throw new InternalServerErrorException(e);
 								throw new InternalServerErrorException(e);
@@ -241,7 +241,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 					.collectList()
 					.collectList()
 					.map(worlds -> {
 					.map(worlds -> {
 						try {
 						try {
-							return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)));
+							return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds));
 						} 
 						} 
 						catch (JsonProcessingException e) {
 						catch (JsonProcessingException e) {
 							throw new InternalServerErrorException(e);
 							throw new InternalServerErrorException(e);
@@ -278,7 +278,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 					)
 					)
 					.map(worlds -> {
 					.map(worlds -> {
 						try {
 						try {
-							return Unpooled.unreleasableBuffer(Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds)));
+							return Unpooled.wrappedBuffer(this.mapper.writeValueAsBytes(worlds));
 						} 
 						} 
 						catch (JsonProcessingException e) {
 						catch (JsonProcessingException e) {
 							throw new InternalServerErrorException(e);
 							throw new InternalServerErrorException(e);
@@ -290,7 +290,7 @@ public class Controller implements ServerController<ExchangeContext, Exchange<Ex
 	
 	
 	private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8");
 	private static final CharSequence MEDIA_TEXT_HTML_UTF8 = AsciiString.cached("text/html; charset=utf-8");
 	
 	
-	private static final FortunesTemplate.Renderer<CompletableFuture<ByteBuf>> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.unreleasableBuffer(Unpooled.buffer()));
+	private static final FortunesTemplate.Renderer<CompletableFuture<ByteBuf>> FORTUNES_RENDERER = FortunesTemplate.bytebuf(() -> Unpooled.buffer());
 	
 	
 	public void handle_fortunes(Exchange<ExchangeContext> exchange) throws HttpException {
 	public void handle_fortunes(Exchange<ExchangeContext> exchange) throws HttpException {
 		exchange.response()
 		exchange.response()

+ 3 - 1
frameworks/Java/inverno/src/main/resources/configuration.cprops

@@ -6,7 +6,9 @@ com.techempower.inverno.benchmark.appConfiguration {
 	http_server { 
 	http_server { 
 		tls_enabled = false
 		tls_enabled = false
 		server_port = 8080
 		server_port = 8080
-		h2c_enabled = false
+		h2_enabled = false
+		http1x_validate_headers = false
+		ws_enabled = false
 	}
 	}
 	db_database = "hello_world"
 	db_database = "hello_world"
 	db_host = "tfb-database"
 	db_host = "tfb-database"

+ 2 - 2
frameworks/Java/micronaut/buildSrc/build.gradle

@@ -8,6 +8,6 @@ repositories {
 }
 }
 
 
 dependencies {
 dependencies {
-    implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.0.1"
-    implementation "gradle.plugin.com.github.johnrengelman:shadow:7.1.2"
+    implementation "io.micronaut.gradle:micronaut-gradle-plugin:4.3.7"
+    implementation "com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1"
 }
 }

+ 1 - 1
frameworks/Java/micronaut/gradle.properties

@@ -1 +1 @@
-micronautVersion = 4.2.2
+micronautVersion=4.4.2

BIN
frameworks/Java/micronaut/gradle/wrapper/gradle-wrapper.jar


+ 1 - 1
frameworks/Java/micronaut/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.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
 networkTimeout=10000
 networkTimeout=10000
 validateDistributionUrl=true
 validateDistributionUrl=true
 zipStoreBase=GRADLE_USER_HOME
 zipStoreBase=GRADLE_USER_HOME

+ 10 - 10
frameworks/Java/micronaut/gradlew.bat

@@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
 %JAVA_EXE% -version >NUL 2>&1
 %JAVA_EXE% -version >NUL 2>&1
 if %ERRORLEVEL% equ 0 goto execute
 if %ERRORLEVEL% equ 0 goto execute
 
 
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
 
 
 goto fail
 goto fail
 
 
@@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
 
 
 if exist "%JAVA_EXE%" goto execute
 if exist "%JAVA_EXE%" goto execute
 
 
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
 
 
 goto fail
 goto fail
 
 

+ 4 - 5
frameworks/Java/micronaut/micronaut-data-jdbc-graalvm.dockerfile

@@ -1,11 +1,10 @@
-FROM ghcr.io/graalvm/graalvm-community:latest as build
+FROM ghcr.io/graalvm/native-image-community:21-ol9 as build
+RUN microdnf install findutils # Gradle 8.7 requires xargs
 COPY . /home/gradle/src
 COPY . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
-RUN ./gradlew  --no-daemon
-RUN ./gradlew micronaut-data-jdbc:nativeBuild -x test --no-daemon
+RUN ./gradlew micronaut-data-jdbc:nativeCompile -x test --no-daemon
 
 
-FROM frolvlad/alpine-glibc:glibc-2.34
-RUN apk --no-cache update && apk add libstdc++
+FROM cgr.dev/chainguard/wolfi-base:latest
 WORKDIR /micronaut
 WORKDIR /micronaut
 COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/native/nativeCompile/micronaut-data-jdbc micronaut
 COPY --from=build /home/gradle/src/micronaut-data-jdbc/build/native/nativeCompile/micronaut-data-jdbc micronaut
 
 

+ 1 - 1
frameworks/Java/micronaut/micronaut-data-jdbc.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:8.1.0-jdk17 as build
+FROM gradle:8.7.0-jdk17 as build
 COPY --chown=gradle:gradle . /home/gradle/src
 COPY --chown=gradle:gradle . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
 RUN gradle micronaut-data-jdbc:build -x test --no-daemon
 RUN gradle micronaut-data-jdbc:build -x test --no-daemon

+ 4 - 5
frameworks/Java/micronaut/micronaut-data-mongodb-graalvm.dockerfile

@@ -1,11 +1,10 @@
-FROM ghcr.io/graalvm/graalvm-community:latest as build
+FROM ghcr.io/graalvm/native-image-community:21-ol9 as build
+RUN microdnf install findutils # Gradle 8.7 requires xargs
 COPY . /home/gradle/src
 COPY . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
-RUN ./gradlew  --no-daemon
-RUN ./gradlew micronaut-data-mongodb:nativeBuild -x test --no-daemon
+RUN ./gradlew micronaut-data-mongodb:nativeCompile -x test --no-daemon
 
 
-FROM frolvlad/alpine-glibc:glibc-2.34
-RUN apk --no-cache update && apk add libstdc++
+FROM cgr.dev/chainguard/wolfi-base:latest
 WORKDIR /micronaut
 WORKDIR /micronaut
 COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/native/nativeCompile/micronaut-data-mongodb micronaut
 COPY --from=build /home/gradle/src/micronaut-data-mongodb/build/native/nativeCompile/micronaut-data-mongodb micronaut
 
 

+ 1 - 1
frameworks/Java/micronaut/micronaut-data-mongodb.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:8.1.0-jdk17 as build
+FROM gradle:8.7.0-jdk17 as build
 COPY --chown=gradle:gradle . /home/gradle/src
 COPY --chown=gradle:gradle . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
 RUN gradle micronaut-data-mongodb:build -x test --no-daemon
 RUN gradle micronaut-data-mongodb:build -x test --no-daemon

+ 1 - 1
frameworks/Java/micronaut/micronaut-data-mongodb/build.gradle

@@ -4,6 +4,6 @@ plugins {
 
 
 dependencies {
 dependencies {
     annotationProcessor("io.micronaut.data:micronaut-data-document-processor")
     annotationProcessor("io.micronaut.data:micronaut-data-document-processor")
-    implementation("io.micronaut.data:micronaut-data-mongodb:3.8.1")
+    implementation("io.micronaut.data:micronaut-data-mongodb")
     runtimeOnly("io.micronaut.mongodb:micronaut-mongo-sync")
     runtimeOnly("io.micronaut.mongodb:micronaut-mongo-sync")
 }
 }

+ 4 - 5
frameworks/Java/micronaut/micronaut-data-r2dbc-graalvm.dockerfile

@@ -1,11 +1,10 @@
-FROM ghcr.io/graalvm/graalvm-community:latest as build
+FROM ghcr.io/graalvm/native-image-community:21-ol9 as build
+RUN microdnf install findutils # Gradle 8.7 requires xargs
 COPY . /home/gradle/src
 COPY . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
-RUN ./gradlew  --no-daemon
-RUN ./gradlew micronaut-data-r2dbc:nativeBuild -x test --no-daemon
+RUN ./gradlew micronaut-data-r2dbc:nativeCompile -x test --no-daemon
 
 
-FROM frolvlad/alpine-glibc:glibc-2.34
-RUN apk --no-cache update && apk add libstdc++
+FROM cgr.dev/chainguard/wolfi-base:latest
 WORKDIR /micronaut
 WORKDIR /micronaut
 COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/native/nativeCompile/micronaut-data-r2dbc micronaut
 COPY --from=build /home/gradle/src/micronaut-data-r2dbc/build/native/nativeCompile/micronaut-data-r2dbc micronaut
 
 

+ 1 - 1
frameworks/Java/micronaut/micronaut-data-r2dbc.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:8.1.0-jdk17 as build
+FROM gradle:8.7.0-jdk17 as build
 COPY --chown=gradle:gradle . /home/gradle/src
 COPY --chown=gradle:gradle . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
 RUN gradle micronaut-data-r2dbc:build -x test --no-daemon
 RUN gradle micronaut-data-r2dbc:build -x test --no-daemon

+ 4 - 4
frameworks/Java/micronaut/micronaut-graalvm.dockerfile

@@ -1,10 +1,10 @@
-FROM ghcr.io/graalvm/graalvm-community:latest as build
+FROM ghcr.io/graalvm/native-image-community:21-ol9 as build
+RUN microdnf install findutils # Gradle 8.7 requires xargs
 COPY . /home/gradle/src
 COPY . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
-RUN ./gradlew  --no-daemon
-RUN ./gradlew micronaut-vertx-pg-client:nativeBuild -x test --no-daemon
+RUN ./gradlew micronaut-vertx-pg-client:nativeCompile -x test --no-daemon
 
 
-FROM frolvlad/alpine-glibc:glibc-2.34
+FROM cgr.dev/chainguard/wolfi-base:latest
 RUN apk --no-cache update && apk add libstdc++
 RUN apk --no-cache update && apk add libstdc++
 WORKDIR /micronaut
 WORKDIR /micronaut
 COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/native/nativeCompile/micronaut-vertx-pg-client micronaut
 COPY --from=build /home/gradle/src/micronaut-vertx-pg-client/build/native/nativeCompile/micronaut-vertx-pg-client micronaut

+ 4 - 5
frameworks/Java/micronaut/micronaut-jdbc-graalvm.dockerfile

@@ -1,11 +1,10 @@
-FROM ghcr.io/graalvm/graalvm-community:latest as build
+FROM ghcr.io/graalvm/native-image-community:21-ol9 as build
+RUN microdnf install findutils # Gradle 8.7 requires xargs
 COPY . /home/gradle/src
 COPY . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
-RUN ./gradlew  --no-daemon
-RUN ./gradlew micronaut-jdbc:nativeBuild -x test --no-daemon
+RUN ./gradlew micronaut-jdbc:nativeCompile -x test --no-daemon
 
 
-FROM frolvlad/alpine-glibc:glibc-2.34
-RUN apk --no-cache update && apk add libstdc++
+FROM cgr.dev/chainguard/wolfi-base:latest
 WORKDIR /micronaut
 WORKDIR /micronaut
 COPY --from=build /home/gradle/src/micronaut-jdbc/build/native/nativeCompile/micronaut-jdbc micronaut
 COPY --from=build /home/gradle/src/micronaut-jdbc/build/native/nativeCompile/micronaut-jdbc micronaut
 
 

+ 1 - 1
frameworks/Java/micronaut/micronaut-jdbc.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:8.1.0-jdk17 as build
+FROM gradle:8.7.0-jdk17 as build
 COPY --chown=gradle:gradle . /home/gradle/src
 COPY --chown=gradle:gradle . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
 RUN gradle micronaut-jdbc:build -x test --no-daemon
 RUN gradle micronaut-jdbc:build -x test --no-daemon

+ 4 - 5
frameworks/Java/micronaut/micronaut-r2dbc-graalvm.dockerfile

@@ -1,11 +1,10 @@
-FROM ghcr.io/graalvm/graalvm-community:latest as build
+FROM ghcr.io/graalvm/native-image-community:21-ol9 as build
+RUN microdnf install findutils # Gradle 8.7 requires xargs
 COPY . /home/gradle/src
 COPY . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
-RUN ./gradlew  --no-daemon
-RUN ./gradlew micronaut-r2dbc:nativeBuild -x test --no-daemon
+RUN ./gradlew micronaut-r2dbc:nativeCompile -x test --no-daemon
 
 
-FROM frolvlad/alpine-glibc:glibc-2.34
-RUN apk --no-cache update && apk add libstdc++
+FROM cgr.dev/chainguard/wolfi-base:latest
 WORKDIR /micronaut
 WORKDIR /micronaut
 COPY --from=build /home/gradle/src/micronaut-r2dbc/build/native/nativeCompile/micronaut-r2dbc micronaut
 COPY --from=build /home/gradle/src/micronaut-r2dbc/build/native/nativeCompile/micronaut-r2dbc micronaut
 
 

+ 1 - 1
frameworks/Java/micronaut/micronaut-r2dbc.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:8.1.0-jdk17 as build
+FROM gradle:8.7.0-jdk17 as build
 COPY --chown=gradle:gradle . /home/gradle/src
 COPY --chown=gradle:gradle . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
 RUN gradle micronaut-r2dbc:build -x test --no-daemon
 RUN gradle micronaut-r2dbc:build -x test --no-daemon

+ 1 - 1
frameworks/Java/micronaut/micronaut.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:8.1.0-jdk17 as build
+FROM gradle:8.7.0-jdk17 as build
 COPY --chown=gradle:gradle . /home/gradle/src
 COPY --chown=gradle:gradle . /home/gradle/src
 WORKDIR /home/gradle/src
 WORKDIR /home/gradle/src
 RUN gradle micronaut-vertx-pg-client:build -x test --no-daemon
 RUN gradle micronaut-vertx-pg-client:build -x test --no-daemon

+ 2 - 13
frameworks/Java/quarkus/pom.xml

@@ -14,14 +14,11 @@
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
         <quarkus.platform.artifact-id>quarkus-bom</quarkus.platform.artifact-id>
         <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
         <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
-        <quarkus.platform.version>3.2.0.Final</quarkus.platform.version>
+        <quarkus.platform.version>3.9.4</quarkus.platform.version>
         <skipITs>true</skipITs>
         <skipITs>true</skipITs>
         <surefire-plugin.version>3.0.0</surefire-plugin.version>
         <surefire-plugin.version>3.0.0</surefire-plugin.version>
-        <netty.io_uring.version>0.0.21.Final</netty.io_uring.version>
-        <vertx.version>4.4.4</vertx.version>
+        <netty.io_uring.version>0.0.25.Final</netty.io_uring.version>
         <rocker.version>1.3.0</rocker.version>
         <rocker.version>1.3.0</rocker.version>
-        <hibernate-orm.version>6.2.6.Final</hibernate-orm.version>
-        <hibernate-reactive.version>2.0.2.Final</hibernate-reactive.version>
     </properties>
     </properties>
 
 
     <modules>
     <modules>
@@ -42,17 +39,10 @@
             <dependency>
             <dependency>
                 <groupId>org.hibernate.orm</groupId>
                 <groupId>org.hibernate.orm</groupId>
                 <artifactId>hibernate-core</artifactId>
                 <artifactId>hibernate-core</artifactId>
-                <version>${hibernate-orm.version}</version>
             </dependency>
             </dependency>
             <dependency>
             <dependency>
                 <groupId>org.hibernate.reactive</groupId>
                 <groupId>org.hibernate.reactive</groupId>
                 <artifactId>hibernate-reactive-core</artifactId>
                 <artifactId>hibernate-reactive-core</artifactId>
-                <version>${hibernate-reactive.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>io.vertx</groupId>
-                <artifactId>vertx-core</artifactId>
-                <version>${vertx.version}</version>
             </dependency>
             </dependency>
             <dependency>
             <dependency>
                 <groupId>${quarkus.platform.group-id}</groupId>
                 <groupId>${quarkus.platform.group-id}</groupId>
@@ -151,7 +141,6 @@
                 <dependency>
                 <dependency>
                     <groupId>io.vertx</groupId>
                     <groupId>io.vertx</groupId>
                     <artifactId>vertx-io_uring-incubator</artifactId>
                     <artifactId>vertx-io_uring-incubator</artifactId>
-                    <version>${vertx.version}</version>
                 </dependency>
                 </dependency>
                 <dependency>
                 <dependency>
                     <groupId>io.netty.incubator</groupId>
                     <groupId>io.netty.incubator</groupId>

+ 2 - 2
frameworks/Java/quarkus/resteasy-reactive-hibernate-reactive/pom.xml

@@ -30,11 +30,11 @@
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive</artifactId>
+            <artifactId>quarkus-rest</artifactId>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
+            <artifactId>quarkus-rest-jackson</artifactId>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.vertx</groupId>
             <groupId>io.vertx</groupId>

+ 2 - 2
frameworks/Java/quarkus/resteasy-reactive-hibernate/pom.xml

@@ -26,11 +26,11 @@
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive</artifactId>
+            <artifactId>quarkus-rest</artifactId>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-resteasy-reactive-jackson</artifactId>
+            <artifactId>quarkus-rest-jackson</artifactId>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <groupId>io.quarkus</groupId>

+ 0 - 1
frameworks/Java/quarkus/vertx/pom.xml

@@ -23,7 +23,6 @@
         <dependency>
         <dependency>
             <groupId>io.vertx</groupId>
             <groupId>io.vertx</groupId>
             <artifactId>vertx-pg-client</artifactId>
             <artifactId>vertx-pg-client</artifactId>
-            <version>${vertx.version}</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <groupId>io.quarkus</groupId>

+ 1 - 1
frameworks/JavaScript/express/express-mongodb.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-slim
+FROM node:20.12.2-slim
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 1
frameworks/JavaScript/express/express-mysql.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-slim
+FROM node:20.12.2-slim
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 1
frameworks/JavaScript/express/express-postgres.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-slim
+FROM node:20.12.2-slim
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 1
frameworks/JavaScript/express/express.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-slim
+FROM node:20.12.2-slim
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 5
frameworks/JavaScript/express/mongodb-app.js

@@ -6,11 +6,7 @@ const cluster = require('cluster');
 const numCPUs = require('os').cpus().length;
 const numCPUs = require('os').cpus().length;
 const express = require('express');
 const express = require('express');
 const mongoose = require('mongoose');
 const mongoose = require('mongoose');
-const connection = mongoose.createConnection('mongodb://tfb-database/hello_world',{
-  useNewUrlParser: true,
-  useUnifiedTopology: true,
-  useFindAndModify: false,
-});
+const connection = mongoose.createConnection('mongodb://tfb-database/hello_world');
 
 
 // Middleware
 // Middleware
 const bodyParser = require('body-parser');
 const bodyParser = require('body-parser');

+ 1 - 1
frameworks/JavaScript/express/package.json

@@ -7,7 +7,7 @@
     "dateformat": "3.0.3",
     "dateformat": "3.0.3",
     "escape-html": "1.0.3",
     "escape-html": "1.0.3",
     "express": "4.18.2",
     "express": "4.18.2",
-    "mongoose": "5.13.20",
+    "mongoose": "8.3.2",
     "mysql2": "3.9.7",
     "mysql2": "3.9.7",
     "pg": "8.5.0",
     "pg": "8.5.0",
     "pg-promise": "10.7.3",
     "pg-promise": "10.7.3",

+ 1 - 7
frameworks/JavaScript/fastify/db/mongo.js

@@ -7,13 +7,7 @@ let client;
 
 
 async function getCollection(name) {
 async function getCollection(name) {
   if (!client) {
   if (!client) {
-    client = await new MongoClient(
-      mongoUrl,
-      {
-        useNewUrlParser: true,
-        useUnifiedTopology: true
-      }
-    ).connect();
+    client = await new MongoClient(mongoUrl).connect();
   }
   }
 
 
   const db = client.db(dbName);
   const db = client.db(dbName);

+ 1 - 1
frameworks/JavaScript/fastify/fastify-mysql.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-alpine
+FROM node:20.12.2-alpine
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 1
frameworks/JavaScript/fastify/fastify-postgres.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-alpine
+FROM node:20.12.2-alpine
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 1
frameworks/JavaScript/fastify/fastify.dockerfile

@@ -1,4 +1,4 @@
-FROM node:18.12.1-alpine
+FROM node:20.12.2-alpine
 
 
 COPY ./ ./
 COPY ./ ./
 
 

+ 1 - 1
frameworks/JavaScript/fastify/package.json

@@ -9,7 +9,7 @@
     "fastify": "4.13.0",
     "fastify": "4.13.0",
     "handlebars": "4.7.6",
     "handlebars": "4.7.6",
     "knex": "2.4.2",
     "knex": "2.4.2",
-    "mongodb": "3.5.9",
+    "mongodb": "6.5.0",
     "mysql2": "3.9.7",
     "mysql2": "3.9.7",
     "pg": "8.5.1"
     "pg": "8.5.1"
   }
   }

+ 1 - 1
frameworks/JavaScript/sailsjs/package.json

@@ -7,7 +7,7 @@
   "dependencies": {
   "dependencies": {
     "async": "1.5.2",
     "async": "1.5.2",
     "bluebird": "3.4.1",
     "bluebird": "3.4.1",
-    "ejs": "2.5.7",
+    "ejs": "3.1.10",
     "handlebars": "4.7.6",
     "handlebars": "4.7.6",
     "mysql": "2.16.0",
     "mysql": "2.16.0",
     "mysql2": "3.9.7",
     "mysql2": "3.9.7",

+ 4 - 1
frameworks/JavaScript/uwebsockets.js/README.md

@@ -10,12 +10,14 @@ The tests were run with:
 
 
 - [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/)
 - [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/)
 - [postgres](https://github.com/porsager/postgres/)
 - [postgres](https://github.com/porsager/postgres/)
+- [mariadb](https://github.com/mariadb-corporation/mariadb-connector-nodejs/)
 
 
 ## Database
 ## Database
 
 
 There are individual handlers for each DB approach. The logic for each of them are found here:
 There are individual handlers for each DB approach. The logic for each of them are found here:
 
 
-- [PostgreSQL](database/postgres.js)
+- [PostgreSQL](src/database/postgres.js)
+- [MySQL](src/database/mysql.js)
 
 
 There are **no database endpoints** or drivers attached by default.
 There are **no database endpoints** or drivers attached by default.
 
 
@@ -23,6 +25,7 @@ To initialize the application with one of these, run any _one_ of the following
 
 
 ```sh
 ```sh
 $ DATABASE=postgres npm start
 $ DATABASE=postgres npm start
+$ DATABASE=mysql npm start
 ```
 ```
 
 
 ## Test Endpoints
 ## Test Endpoints

+ 21 - 0
frameworks/JavaScript/uwebsockets.js/benchmark_config.json

@@ -41,6 +41,27 @@
         "update_url": "/updates?queries=",
         "update_url": "/updates?queries=",
         "versus": "nodejs",
         "versus": "nodejs",
         "webserver": "None"
         "webserver": "None"
+      },
+      "mysql": {
+        "approach": "Realistic",
+        "classification": "Platform",
+        "database": "MySQL",
+        "database_os": "Linux",
+        "db_url": "/db",
+        "display_name": "uWebSockets.js",
+        "flavor": "NodeJS",
+        "fortune_url": "/fortunes",
+        "framework": "uWebSockets.js",
+        "language": "JavaScript",
+        "notes": "",
+        "orm": "Raw",
+        "os": "Linux",
+        "platform": "None",
+        "port": 8080,
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
+        "versus": "nodejs",
+        "webserver": "None"
       }
       }
     }
     }
   ]
   ]

+ 74 - 5
frameworks/JavaScript/uwebsockets.js/package-lock.json

@@ -9,25 +9,94 @@
       "version": "0.0.1",
       "version": "0.0.1",
       "license": "MIT",
       "license": "MIT",
       "dependencies": {
       "dependencies": {
-        "postgres": "^3.4.0",
+        "mariadb": "^3.3.0",
+        "postgres": "^3.4.4",
         "slow-json-stringify": "^2.0.1",
         "slow-json-stringify": "^2.0.1",
-        "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0"
+        "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0"
+      }
+    },
+    "node_modules/@types/geojson": {
+      "version": "7946.0.14",
+      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
+      "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
+    },
+    "node_modules/@types/node": {
+      "version": "20.12.7",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
+      "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/denque": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "10.2.2",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
+      "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
+      "engines": {
+        "node": "14 || >=16.14"
+      }
+    },
+    "node_modules/mariadb": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.0.tgz",
+      "integrity": "sha512-sAL4bJgbfCAtXcE8bXI+NAMzVaPNkIU8hRZUXYfgNFoWB9U57G3XQiMeCx/A6IrS6y7kGwBLylrwgsZQ8kUYlw==",
+      "dependencies": {
+        "@types/geojson": "^7946.0.14",
+        "@types/node": "^20.11.17",
+        "denque": "^2.1.0",
+        "iconv-lite": "^0.6.3",
+        "lru-cache": "^10.2.0"
+      },
+      "engines": {
+        "node": ">= 14"
       }
       }
     },
     },
     "node_modules/postgres": {
     "node_modules/postgres": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.0.tgz",
-      "integrity": "sha512-d7UtSoCg4hUtzxM9aRi3J8BrM6t0h4bQmgAHG96cDCNpP9CnnWQRdRl7WWNvKs0oOaQU2InGoOi1jETmdZK02g==",
+      "version": "3.4.4",
+      "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz",
+      "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==",
+      "engines": {
+        "node": ">=12"
+      },
       "funding": {
       "funding": {
         "type": "individual",
         "type": "individual",
         "url": "https://github.com/sponsors/porsager"
         "url": "https://github.com/sponsors/porsager"
       }
       }
     },
     },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
     "node_modules/slow-json-stringify": {
     "node_modules/slow-json-stringify": {
       "version": "2.0.1",
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz",
       "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz",
       "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ=="
       "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ=="
     },
     },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+    },
     "node_modules/uWebSockets.js": {
     "node_modules/uWebSockets.js": {
       "version": "20.31.0",
       "version": "20.31.0",
       "resolved": "git+ssh://[email protected]/uNetworking/uWebSockets.js.git#809b99d2d7d12e2cbf89b7135041e9b41ff84084"
       "resolved": "git+ssh://[email protected]/uNetworking/uWebSockets.js.git#809b99d2d7d12e2cbf89b7135041e9b41ff84084"

+ 4 - 3
frameworks/JavaScript/uwebsockets.js/package.json

@@ -1,8 +1,9 @@
 {
 {
   "dependencies": {
   "dependencies": {
-    "postgres": "^3.4.0",
-    "uWebSockets.js": "uNetworking/uWebSockets.js#v20.32.0",
-    "slow-json-stringify": "^2.0.1"
+    "mariadb": "^3.3.0",
+    "postgres": "^3.4.4",
+    "slow-json-stringify": "^2.0.1",
+    "uWebSockets.js": "uNetworking/uWebSockets.js#v20.43.0"
   },
   },
   "license": "MIT",
   "license": "MIT",
   "main": "src/server.js",
   "main": "src/server.js",

+ 16 - 0
frameworks/JavaScript/uwebsockets.js/src/database/mysql.js

@@ -0,0 +1,16 @@
+import { createPool } from "mariadb";
+import os from "node:os";
+
+const pool = createPool({
+  host: "tfb-database",
+  user: "benchmarkdbuser",
+  password: "benchmarkdbpass",
+  database: "hello_world",
+  connectionLimit: os.availableParallelism()
+});
+
+export const fortunes = async () => await pool.execute("SELECT id, message FROM fortune");
+
+export const find = async (id) => await pool.execute("SELECT id, randomnumber FROM world WHERE id = ?", [id]).then((arr) => arr[0]);
+
+export const bulkUpdate = async (worlds) => await Promise.all(worlds.map(world => pool.execute("UPDATE world SET randomnumber = ? WHERE id = ?", [world.randomNumber, world.id])));

+ 12 - 0
frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile

@@ -0,0 +1,12 @@
+FROM node:20-slim
+
+COPY ./ ./
+
+RUN npm install
+
+ENV NODE_ENV production
+ENV DATABASE mysql
+
+EXPOSE 8080
+
+CMD ["npm", "start"]

+ 1 - 1
frameworks/PHP/amp/amp.dockerfile

@@ -14,7 +14,7 @@ RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar
 #RUN apt-get install -y libuv1-dev > /dev/null
 #RUN apt-get install -y libuv1-dev > /dev/null
 RUN apt-get install -y libevent-dev > /dev/null
 RUN apt-get install -y libevent-dev > /dev/null
 #RUN pecl install uv-0.2.4 > /dev/null && echo "extension=uv.so" > /etc/php/8.3/cli/conf.d/uv.ini
 #RUN pecl install uv-0.2.4 > /dev/null && echo "extension=uv.so" > /etc/php/8.3/cli/conf.d/uv.ini
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 ADD ./ /amp
 ADD ./ /amp
 WORKDIR /amp
 WORKDIR /amp

+ 1 - 1
frameworks/PHP/comet/comet-mysql.dockerfile

@@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-xml php8.3-mysql php8.3-mbstring > /d
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY php.ini /etc/php/8.3/cli/php.ini
 COPY php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/comet/comet.dockerfile

@@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /d
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY php.ini /etc/php/8.3/cli/php.ini
 COPY php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile

@@ -11,7 +11,7 @@ RUN apt-get install -yqq git php8.3-cli php8.3-mysql php8.3-xml > /dev/null
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/kumbiaphp/server.php

@@ -5,7 +5,7 @@ require_once __DIR__.'/bench/app/workerbootstrap.php';
 use Adapterman\Adapterman;
 use Adapterman\Adapterman;
 use Workerman\Worker;
 use Workerman\Worker;
 
 
-Adapterman::init();
+Adapterman::init(); 
 
 
 $http_worker            = new Worker('http://0.0.0.0:8080');
 $http_worker            = new Worker('http://0.0.0.0:8080');
 $http_worker->count     = (int) shell_exec('nproc') * 4;
 $http_worker->count     = (int) shell_exec('nproc') * 4;

+ 23 - 0
frameworks/PHP/laravel/benchmark_config.json

@@ -115,6 +115,29 @@
 			"display_name": "laravel-workerman",
 			"display_name": "laravel-workerman",
 			"notes": "",
 			"notes": "",
 			"versus": "php"
 			"versus": "php"
+		},
+		"octane-frankenphp": {
+			"json_url": "/json",
+			"db_url": "/db",
+			"query_url": "/queries/",
+			"fortune_url": "/fortunes",
+			"update_url": "/updates/",
+			"plaintext_url": "/plaintext",
+			"port": 8080,
+			"approach": "Realistic",
+			"classification": "Fullstack",
+			"database": "MySQL",
+			"framework": "laravel",
+			"language": "PHP",
+			"flavor": "None",
+			"orm": "Full",
+			"platform": "Frankenphp",
+			"webserver": "caddy",
+			"os": "Linux",
+			"database_os": "Linux",
+			"display_name": "laravel-octane [frankenphp]",
+			"notes": "",
+			"versus": "php"
 		}
 		}
 	}]
 	}]
 }
 }

+ 1 - 1
frameworks/PHP/laravel/config/app.php

@@ -142,7 +142,7 @@ return [
 		// Illuminate\Redis\RedisServiceProvider::class,
 		// Illuminate\Redis\RedisServiceProvider::class,
 		// Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
 		// Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
 		// Illuminate\Session\SessionServiceProvider::class,
 		// Illuminate\Session\SessionServiceProvider::class,
-		// Illuminate\Translation\TranslationServiceProvider::class,
+		Illuminate\Translation\TranslationServiceProvider::class,
 		// Illuminate\Validation\ValidationServiceProvider::class,
 		// Illuminate\Validation\ValidationServiceProvider::class,
 		Illuminate\View\ViewServiceProvider::class,
 		Illuminate\View\ViewServiceProvider::class,
 
 

+ 29 - 0
frameworks/PHP/laravel/laravel-octane-frankenphp.dockerfile

@@ -0,0 +1,29 @@
+FROM dunglas/frankenphp
+ 
+RUN install-php-extensions \
+    pcntl \
+    pdo_mysql \
+	intl \
+	zip \
+	opcache > /dev/null
+ 
+COPY . /app
+
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
+
+RUN mkdir -p /app/bootstrap/cache /app/storage/logs /app/storage/framework/sessions /app/storage/framework/views /app/storage/framework/cache
+RUN chmod -R 777 /app
+
+COPY deploy/conf/php.ini  /usr/local/etc/php
+
+RUN composer require laravel/octane guzzlehttp/guzzle
+
+RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet
+
+RUN php artisan optimize
+
+RUN frankenphp -v
+
+EXPOSE 8080
+
+ENTRYPOINT ["php", "artisan", "octane:frankenphp", "--port=8080"]

+ 1 - 1
frameworks/PHP/laravel/laravel-workerman.dockerfile

@@ -12,7 +12,7 @@ RUN apt-get install -yqq git unzip \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 ADD ./ /laravel
 ADD ./ /laravel
 WORKDIR /laravel
 WORKDIR /laravel

+ 1 - 1
frameworks/PHP/leaf/leaf-workerman.dockerfile

@@ -12,7 +12,7 @@ RUN apt-get update -yqq > /dev/null && apt-get install -yqq git \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/lumen/lumen-workerman.dockerfile

@@ -12,7 +12,7 @@ RUN apt-get install -yqq nginx git unzip \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 ADD ./ /lumen
 ADD ./ /lumen
 WORKDIR /lumen
 WORKDIR /lumen

+ 1 - 1
frameworks/PHP/mark/mark.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
  
  
 COPY php.ini /etc/php/8.3/cli/php.ini
 COPY php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile

@@ -8,7 +8,7 @@ RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essent
 
 
 RUN apt-get install -y php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php8.3-dev libevent-dev > /dev/null
 RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar
 RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY php-jit.ini /etc/php/8.3/cli/php.ini
 COPY php-jit.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile

@@ -8,7 +8,7 @@ RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essent
 
 
 RUN apt-get install -y php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php8.3-dev libevent-dev > /dev/null
 RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar
 RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY php-jit.ini /etc/php/8.3/cli/php.ini
 COPY php-jit.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/php/php-workerman.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get install -yqq git unzip \
     php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql  > /dev/null
     php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql  > /dev/null
 
 
 RUN apt-get install -y php-pear php8.3-dev php8.3-xml libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev php8.3-xml libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/workerman/cli-php.ini /etc/php/8.3/cli/php.ini
 COPY deploy/workerman/cli-php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/slim/slim-workerman-pgsql.dockerfile

@@ -13,7 +13,7 @@ RUN apt-get install -yqq git \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/slim/slim-workerman.dockerfile

@@ -12,7 +12,7 @@ RUN apt-get update -yqq > /dev/null && apt-get install -yqq git \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/symfony/symfony-workerman.dockerfile

@@ -12,7 +12,7 @@ RUN apt-get install -yqq git unzip \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 

+ 1 - 1
frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/webman/webman.dockerfile

@@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get update -yqq && apt-get install -y php-pear php8.3-dev libevent-dev git  > /dev/null
 RUN apt-get update -yqq && apt-get install -y php-pear php8.3-dev libevent-dev git  > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY php.ini /etc/php/8.3/cli/php.ini
 COPY php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 1
frameworks/PHP/yii2/yii2-workerman.dockerfile

@@ -10,7 +10,7 @@ RUN apt-get update -yqq > /dev/null && \
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
 
 
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
 RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null
-RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
+RUN pecl install event-3.1.3 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini
 
 
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini
 
 

+ 1 - 0
frameworks/Pascal/mormot/benchmark_config.json

@@ -31,6 +31,7 @@
         "dockerfile": "mormot.dockerfile",
         "dockerfile": "mormot.dockerfile",
         "db_url": "/rawdb",
         "db_url": "/rawdb",
         "query_url": "/rawqueries?queries=",
         "query_url": "/rawqueries?queries=",
+        "cached_query_url": "/rawcached?count=",
         "fortune_url": "/rawfortunes",
         "fortune_url": "/rawfortunes",
         "update_url": "/rawupdates?queries=",
         "update_url": "/rawupdates?queries=",
         "port": 8080,
         "port": 8080,

+ 1 - 1
frameworks/Pascal/mormot/setup_and_build.sh

@@ -35,7 +35,7 @@ echo "Download statics from $URL ..."
 wget -qO- "$URL" | tar -xz -C ./libs/mORMot/static
 wget -qO- "$URL" | tar -xz -C ./libs/mORMot/static
 
 
 # uncomment for fixed commit URL
 # uncomment for fixed commit URL
-URL=https://github.com/synopse/mORMot2/tarball/7dc50900266f07454fe60b60e4a2755ce445ddeb
+URL=https://github.com/synopse/mORMot2/tarball/527b3fb11cb4dad5f2c03ace293b550f85504420
 #URL="https://api.github.com/repos/synopse/mORMot2/tarball/$USED_TAG"
 #URL="https://api.github.com/repos/synopse/mORMot2/tarball/$USED_TAG"
 echo "Download and unpacking mORMot sources from $URL ..."
 echo "Download and unpacking mORMot sources from $URL ..."
 wget -qO- "$URL" | tar -xz -C ./libs/mORMot  --strip-components=1
 wget -qO- "$URL" | tar -xz -C ./libs/mORMot  --strip-components=1

+ 78 - 51
frameworks/Pascal/mormot/src/raw.pas

@@ -54,7 +54,7 @@ type
   end;
   end;
   TWorlds = array of TWorldRec;
   TWorlds = array of TWorldRec;
   TFortune = packed record
   TFortune = packed record
-    id: integer;
+    id: PtrUInt;
     message: PUtf8Char;
     message: PUtf8Char;
   end;
   end;
   TFortunes = array of TFortune;
   TFortunes = array of TFortune;
@@ -86,6 +86,7 @@ type
     fStore: TRestServerDB;
     fStore: TRestServerDB;
     fTemplate: TSynMustache;
     fTemplate: TSynMustache;
     fCachedWorldsTable: POrmCacheTable;
     fCachedWorldsTable: POrmCacheTable;
+    fRawCache: TOrmWorlds;
     fDbPool: TSqlDBPostgresConnectionProperties;
     fDbPool: TSqlDBPostgresConnectionProperties;
     procedure OnAsyncDb(Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
     procedure OnAsyncDb(Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
     procedure OnAsyncFortunes(Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
     procedure OnAsyncFortunes(Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
@@ -107,6 +108,7 @@ type
     function updates(ctxt: THttpServerRequest): cardinal;
     function updates(ctxt: THttpServerRequest): cardinal;
     function rawdb(ctxt: THttpServerRequest): cardinal;
     function rawdb(ctxt: THttpServerRequest): cardinal;
     function rawqueries(ctxt: THttpServerRequest): cardinal;
     function rawqueries(ctxt: THttpServerRequest): cardinal;
+    function rawcached(ctxt: THttpServerRequest): cardinal;
     function rawfortunes(ctxt: THttpServerRequest): cardinal;
     function rawfortunes(ctxt: THttpServerRequest): cardinal;
     function rawupdates(ctxt: THttpServerRequest): cardinal;
     function rawupdates(ctxt: THttpServerRequest): cardinal;
     // asynchronous PostgreSQL pipelined DB access
     // asynchronous PostgreSQL pipelined DB access
@@ -144,13 +146,13 @@ const
                      '</html>';
                      '</html>';
 
 
 
 
-function ComputeRandomWorld: integer; inline;
+function ComputeRandomWorld(gen: PLecuyer): integer; inline;
 begin
 begin
-  result := Random32(WORLD_COUNT) + 1;
+  result := gen^.Next(WORLD_COUNT) + 1;
 end;
 end;
 
 
 function GetQueriesParamValue(ctxt: THttpServerRequest;
 function GetQueriesParamValue(ctxt: THttpServerRequest;
-  const search: RawUtf8 = 'QUERIES='): cardinal;
+  const search: RawUtf8 = 'QUERIES='): cardinal; inline;
 begin
 begin
   if not ctxt.UrlParam(search, result) or
   if not ctxt.UrlParam(search, result) or
      (result = 0) then
      (result = 0) then
@@ -190,6 +192,7 @@ begin
   if fStore.Server.Cache.SetCache(TOrmCachedWorld) then
   if fStore.Server.Cache.SetCache(TOrmCachedWorld) then
     fStore.Server.Cache.FillFromQuery(TOrmCachedWorld, '', []);
     fStore.Server.Cache.FillFromQuery(TOrmCachedWorld, '', []);
   fCachedWorldsTable := fStore.Orm.Cache.Table(TOrmCachedWorld);
   fCachedWorldsTable := fStore.Orm.Cache.Table(TOrmCachedWorld);
+  fStore.Orm.RetrieveListObjArray(fRawCache, TOrmCachedWorld, 'order by id', []);
   // initialize the mustache template for /fortunes
   // initialize the mustache template for /fortunes
   fTemplate := TSynMustache.Parse(FORTUNES_TPL);
   fTemplate := TSynMustache.Parse(FORTUNES_TPL);
   // setup the HTTP server
   // setup the HTTP server
@@ -222,22 +225,26 @@ begin
   fHttpServer.Free;
   fHttpServer.Free;
   fStore.Free;
   fStore.Free;
   fModel.Free;
   fModel.Free;
-  fDBPool.free;
+  fDBPool.Free;
+  ObjArrayClear(fRawCache);
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
 // query DB world table for /rawqueries and /rawupdates endpoints
 // query DB world table for /rawqueries and /rawupdates endpoints
 
 
-function TRawAsyncServer.GetRawRandomWorlds(cnt: PtrInt; out res: TWorlds): boolean;
+function TRawAsyncServer.GetRawRandomWorlds(cnt: PtrInt;
+  out res: TWorlds): boolean;
 var
 var
   conn: TSqlDBConnection;
   conn: TSqlDBConnection;
   stmt: ISqlDBStatement;
   stmt: ISqlDBStatement;
   pConn: TSqlDBPostgresConnection absolute conn;
   pConn: TSqlDBPostgresConnection absolute conn;
   pStmt: TSqlDBPostgresStatement;
   pStmt: TSqlDBPostgresStatement;
+  gen: PLecuyer;
   i: PtrInt;
   i: PtrInt;
 begin
 begin
   result := false;
   result := false;
   SetLength(res{%H-}, cnt);
   SetLength(res{%H-}, cnt);
+  gen := Lecuyer;
   conn := fDbPool.ThreadSafeConnection;
   conn := fDbPool.ThreadSafeConnection;
   // specific code to use PostgresSQL pipelining mode
   // specific code to use PostgresSQL pipelining mode
   // see test_nosync in
   // see test_nosync in
@@ -247,7 +254,7 @@ begin
   pStmt := TSqlDBPostgresStatement(stmt.Instance);
   pStmt := TSqlDBPostgresStatement(stmt.Instance);
   for i := 0 to cnt - 1 do
   for i := 0 to cnt - 1 do
   begin
   begin
-    pStmt.Bind(1, ComputeRandomWorld);
+    pStmt.Bind(1, ComputeRandomWorld(gen));
     pStmt.SendPipelinePrepared;
     pStmt.SendPipelinePrepared;
     pConn.PipelineSync;
     pConn.PipelineSync;
   end;
   end;
@@ -323,7 +330,7 @@ function TRawAsyncServer.db(ctxt: THttpServerRequest): cardinal;
 var
 var
   w: TOrmWorld;
   w: TOrmWorld;
 begin
 begin
-  w := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld);
+  w := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld(Lecuyer));
   try
   try
     ctxt.SetOutJson(w);
     ctxt.SetOutJson(w);
     result := HTTP_SUCCESS;
     result := HTTP_SUCCESS;
@@ -336,10 +343,12 @@ function TRawAsyncServer.queries(ctxt: THttpServerRequest): cardinal;
 var
 var
   i: PtrInt;
   i: PtrInt;
   res: TOrmWorlds;
   res: TOrmWorlds;
+  gen: PLecuyer;
 begin
 begin
   SetLength(res, GetQueriesParamValue(ctxt, 'QUERIES='));
   SetLength(res, GetQueriesParamValue(ctxt, 'QUERIES='));
+  gen := Lecuyer;
   for i := 0 to length(res) - 1 do
   for i := 0 to length(res) - 1 do
-    res[i] := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld);
+    res[i] := TOrmWorld.Create(fStore.Orm, ComputeRandomWorld(gen));
   ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds));
   ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds));
   ObjArrayClear(res);
   ObjArrayClear(res);
   result := HTTP_SUCCESS;
   result := HTTP_SUCCESS;
@@ -349,10 +358,12 @@ function TRawAsyncServer.cached_queries(ctxt: THttpServerRequest): cardinal;
 var
 var
   i: PtrInt;
   i: PtrInt;
   res: TOrmWorlds;
   res: TOrmWorlds;
+  gen: PLecuyer;
 begin
 begin
   SetLength(res, GetQueriesParamValue(ctxt, 'COUNT='));
   SetLength(res, GetQueriesParamValue(ctxt, 'COUNT='));
+  gen := Lecuyer;
   for i := 0 to length(res) - 1 do
   for i := 0 to length(res) - 1 do
-    res[i] := fCachedWorldsTable.Get(ComputeRandomWorld);
+    res[i] := fCachedWorldsTable.Get(ComputeRandomWorld(gen));
   ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds));
   ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds));
   result := HTTP_SUCCESS;
   result := HTTP_SUCCESS;
 end;
 end;
@@ -390,19 +401,21 @@ var
   res: TOrmWorlds;
   res: TOrmWorlds;
   w: TOrmWorld;
   w: TOrmWorld;
   b: TRestBatch;
   b: TRestBatch;
+  gen: PLecuyer;
 begin
 begin
   result := HTTP_SERVERERROR;
   result := HTTP_SERVERERROR;
   SetLength(res, GetQueriesParamValue(ctxt));
   SetLength(res, GetQueriesParamValue(ctxt));
   b := TRestBatch.Create(fStore.ORM, TOrmWorld, {transrows=}0,
   b := TRestBatch.Create(fStore.ORM, TOrmWorld, {transrows=}0,
     [boExtendedJson, boNoModelEncoding, boPutNoCacheFlush]);
     [boExtendedJson, boNoModelEncoding, boPutNoCacheFlush]);
   try
   try
+    gen := Lecuyer;
     for i := 0 to length(res) - 1 do
     for i := 0 to length(res) - 1 do
     begin
     begin
       w := TOrmWorld.Create;
       w := TOrmWorld.Create;
       res[i] := w;
       res[i] := w;
-      if not fStore.Orm.Retrieve(ComputeRandomWorld, w) then
+      if not fStore.Orm.Retrieve(ComputeRandomWorld(gen), w) then
         exit;
         exit;
-      w.RandomNumber := ComputeRandomWorld;
+      w.RandomNumber := ComputeRandomWorld(gen);
       b.Update(w);
       b.Update(w);
     end;
     end;
     result := b.Send;
     result := b.Send;
@@ -422,7 +435,7 @@ begin
   result := HTTP_SERVERERROR;
   result := HTTP_SERVERERROR;
   conn := fDbPool.ThreadSafeConnection;
   conn := fDbPool.ThreadSafeConnection;
   stmt := conn.NewStatementPrepared(WORLD_READ_SQL, true, true);
   stmt := conn.NewStatementPrepared(WORLD_READ_SQL, true, true);
-  stmt.Bind(1, ComputeRandomWorld);
+  stmt.Bind(1, ComputeRandomWorld(Lecuyer));
   stmt.ExecutePrepared;
   stmt.ExecutePrepared;
   if stmt.Step then
   if stmt.Step then
   begin
   begin
@@ -444,6 +457,20 @@ begin
   result := HTTP_SUCCESS;
   result := HTTP_SUCCESS;
 end;
 end;
 
 
+function TRawAsyncServer.rawcached(ctxt: THttpServerRequest): cardinal;
+var
+  i: PtrInt;
+  res: TOrmWorlds;
+  gen: PLecuyer;
+begin
+  SetLength(res, GetQueriesParamValue(ctxt, 'COUNT='));
+  gen := Lecuyer;
+  for i := 0 to length(res) - 1 do
+    res[i] := fRawCache[ComputeRandomWorld(gen) - 1];
+  ctxt.SetOutJson(@res, TypeInfo(TOrmWorlds));
+  result := HTTP_SUCCESS;
+end;
+
 function TRawAsyncServer.rawfortunes(ctxt: THttpServerRequest): cardinal;
 function TRawAsyncServer.rawfortunes(ctxt: THttpServerRequest): cardinal;
 var
 var
   conn: TSqlDBConnection;
   conn: TSqlDBConnection;
@@ -476,10 +503,7 @@ begin
     try
     try
       W.AddShort('UPDATE world SET randomNumber = v.randomNumber FROM (VALUES');
       W.AddShort('UPDATE world SET randomNumber = v.randomNumber FROM (VALUES');
       for i := 1 to cnt do
       for i := 1 to cnt do
-      begin
-        W.AddShort('(?::integer, ?::integer)');
-        W.Add(',');
-      end;
+        W.AddShort('(?::integer, ?::integer),');
       W.CancelLastComma;
       W.CancelLastComma;
       W.AddShort(' order by 1) AS v (id, randomNumber) WHERE world.id = v.id');
       W.AddShort(' order by 1) AS v (id, randomNumber) WHERE world.id = v.id');
       W.SetText(LastComputeUpdateSql);
       W.SetText(LastComputeUpdateSql);
@@ -496,6 +520,7 @@ var
   cnt, i: PtrInt;
   cnt, i: PtrInt;
   res: TWorlds;
   res: TWorlds;
   ids, nums: TInt64DynArray;
   ids, nums: TInt64DynArray;
+  gen: PLecuyer;
   conn: TSqlDBConnection;
   conn: TSqlDBConnection;
   stmt: ISqlDBStatement;
   stmt: ISqlDBStatement;
 begin
 begin
@@ -505,8 +530,9 @@ begin
   if not getRawRandomWorlds(cnt, res) then
   if not getRawRandomWorlds(cnt, res) then
     exit;
     exit;
   // generate new randoms
   // generate new randoms
+  gen := Lecuyer;
   for i := 0 to cnt - 1 do
   for i := 0 to cnt - 1 do
-    res[i].randomNumber := ComputeRandomWorld;
+    res[i].randomNumber := ComputeRandomWorld(gen);
   if cnt > 20 then
   if cnt > 20 then
   begin
   begin
     // fill parameters arrays for update with nested select (PostgreSQL only)
     // fill parameters arrays for update with nested select (PostgreSQL only)
@@ -546,7 +572,7 @@ function TRawAsyncServer.asyncdb(ctxt: THttpServerRequest): cardinal;
 begin
 begin
   with fDbPool.Async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT) do
   with fDbPool.Async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT) do
   try
   try
-    Bind(1, ComputeRandomWorld);
+    Bind(1, ComputeRandomWorld(Lecuyer));
     ExecuteAsync(ctxt, OnAsyncDb);
     ExecuteAsync(ctxt, OnAsyncDb);
   finally
   finally
     UnLock;
     UnLock;
@@ -591,8 +617,9 @@ type
     res: TWorlds;
     res: TWorlds;
     count, current: integer;
     count, current: integer;
     update: TSqlDBPostgresAsyncStatement; // prepared before any callback
     update: TSqlDBPostgresAsyncStatement; // prepared before any callback
-    function Queries(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal;
-    function Updates(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal;
+    async: TSqlDBPostgresAsync;
+    function Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal;
+    function Updates(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal;
     procedure DoUpdates;
     procedure DoUpdates;
     procedure OnQueries(Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
     procedure OnQueries(Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
     procedure OnRes({%H-}Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
     procedure OnRes({%H-}Statement: TSqlDBPostgresAsyncStatement; Context: TObject);
@@ -600,48 +627,51 @@ type
 
 
 function TRawAsyncServer.asyncqueries(ctxt: THttpServerRequest): cardinal;
 function TRawAsyncServer.asyncqueries(ctxt: THttpServerRequest): cardinal;
 begin
 begin
-  result := TAsyncWorld.Create.Queries(fDBPool.Async, ctxt);
+  result := TAsyncWorld.Create.Queries(self, ctxt);
 end;
 end;
 
 
 function TRawAsyncServer.asyncupdates(ctxt: THttpServerRequest): cardinal;
 function TRawAsyncServer.asyncupdates(ctxt: THttpServerRequest): cardinal;
 begin
 begin
-  result := TAsyncWorld.Create.Updates(fDBPool.Async, ctxt);
+  result := TAsyncWorld.Create.Updates(self, ctxt);
 end;
 end;
 
 
 
 
 { TAsyncWorld }
 { TAsyncWorld }
 
 
-function TAsyncWorld.Queries(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal;
+function TAsyncWorld.Queries(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal;
 var
 var
   n: integer;
   n: integer;
-  opt: TSqlDBPostgresAsyncStatementOptions; // for modified libpq
+  opt: TSqlDBPostgresAsyncStatementOptions; // forced options for modified libpq
+  gen: PLecuyer;
+  select: TSqlDBPostgresAsyncStatement;
 begin
 begin
   request := ctxt;
   request := ctxt;
+  if async = nil then
+    async := server.fDbPool.Async;
   if count = 0 then
   if count = 0 then
     count := getQueriesParamValue(ctxt);
     count := getQueriesParamValue(ctxt);
   SetLength(res, count); // count is > 0
   SetLength(res, count); // count is > 0
-  with async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT) do
-  try
-    opt := AsyncOptions - [asoForceConnectionFlush];
-    n := count;
-    repeat
-      dec(n);
-      Bind(1, ComputeRandomWorld);
-      if n = 0 then // last item should include asoForceConnectionFlush (if set)
-        opt := AsyncOptions;
-      ExecuteAsync(ctxt, OnQueries, @opt);
-    until n = 0;
-  finally
-    UnLock;
-  end;
+  select := async.PrepareLocked(WORLD_READ_SQL, {res=}true, ASYNC_OPT);
+  opt := ASYNC_OPT - [asoForceConnectionFlush];
+  n := count;
+  gen := Lecuyer;
+  repeat
+    dec(n);
+    select.Bind(1, ComputeRandomWorld(gen));
+    if n = 0 then // last item should include asoForceConnectionFlush (if set)
+      opt := ASYNC_OPT;
+    select.ExecuteAsync(ctxt, OnQueries, @opt);
+  until n = 0;
+  select.UnLock;
   result := ctxt.SetAsyncResponse;
   result := ctxt.SetAsyncResponse;
 end;
 end;
 
 
-function TAsyncWorld.Updates(async: TSqlDBPostgresAsync; ctxt: THttpServerRequest): cardinal;
+function TAsyncWorld.Updates(server: TRawAsyncServer; ctxt: THttpServerRequest): cardinal;
 begin
 begin
+  async := server.fDbPool.Async;
   count := getQueriesParamValue(ctxt);
   count := getQueriesParamValue(ctxt);
   update := async.Prepare(WORLD_UPDATE_SQLN, false, ASYNC_OPT);
   update := async.Prepare(WORLD_UPDATE_SQLN, false, ASYNC_OPT);
-  result := Queries(async, ctxt);
+  result := Queries(server, ctxt);
 end;
 end;
 
 
 procedure TAsyncWorld.OnQueries(Statement: TSqlDBPostgresAsyncStatement;
 procedure TAsyncWorld.OnQueries(Statement: TSqlDBPostgresAsyncStatement;
@@ -666,9 +696,11 @@ procedure TAsyncWorld.DoUpdates;
 var
 var
   i: PtrInt;
   i: PtrInt;
   params: TIntegerDynArray;
   params: TIntegerDynArray;
+  gen: PLecuyer;
 begin
 begin
+  gen := Lecuyer;
   for i := 0 to count - 1 do
   for i := 0 to count - 1 do
-    res[i].randomNumber := ComputeRandomWorld;
+    res[i].randomNumber := ComputeRandomWorld(gen);
   SetLength(params, count);
   SetLength(params, count);
   for i := 0 to count - 1 do
   for i := 0 to count - 1 do
     params[i] := res[i].id;
     params[i] := res[i].id;
@@ -708,8 +740,8 @@ begin
   // register some RTTI for records JSON serialization
   // register some RTTI for records JSON serialization
   Rtti.RegisterFromText([
   Rtti.RegisterFromText([
     TypeInfo(TMessageRec), 'message:PUtf8Char',
     TypeInfo(TMessageRec), 'message:PUtf8Char',
-    TypeInfo(TWorldRec),   'id,randomNumber:integer',
-    TypeInfo(TFortune),    'id:integer message:PUtf8Char']);
+    TypeInfo(TWorldRec),   'id,randomNumber:cardinal',
+    TypeInfo(TFortune),    'id:PtrUInt message:PUtf8Char']);
 
 
   // compute default execution context from HW information
   // compute default execution context from HW information
   cpuCount := CurrentCpuSet(cpuMask); // may run from a "taskset" command
   cpuCount := CurrentCpuSet(cpuMask); // may run from a "taskset" command
@@ -731,7 +763,7 @@ begin
     begin
     begin
       // asynchronus test with single listener socket and no CPU pinning
       // asynchronus test with single listener socket and no CPU pinning
       servers := 1;
       servers := 1;
-      threads := cpuCount * 2;
+      threads := cpuCount * 4;
       pinServers2Cores := false;
       pinServers2Cores := false;
     end;
     end;
   end
   end
@@ -753,12 +785,7 @@ begin
       pinServers2Cores := false; // no option would keep the default boolean
       pinServers2Cores := false; // no option would keep the default boolean
     Get(['s', 'servers'], servers, '#count of servers (listener sockets)', servers);
     Get(['s', 'servers'], servers, '#count of servers (listener sockets)', servers);
     Get(['t', 'threads'], threads, 'per-server thread pool #size', threads);
     Get(['t', 'threads'], threads, 'per-server thread pool #size', threads);
-    if Option(['?', 'help'], 'display this message') then
-    begin
-      ConsoleWrite(FullDescription);
-      exit;
-    end;
-    if ConsoleWriteUnknown then
+    if ConsoleHelpFailed('TFB Server using mORMot 2') then
       exit;
       exit;
   end;
   end;
 
 

+ 1 - 1
frameworks/Python/aiohttp/requirements.txt

@@ -2,7 +2,7 @@ aiohttp==3.9.4
 asyncpg==0.25.0
 asyncpg==0.25.0
 cchardet==2.1.7
 cchardet==2.1.7
 gunicorn==20.1
 gunicorn==20.1
-jinja2==3.1.3
+jinja2==3.1.4
 psycopg2==2.9.2
 psycopg2==2.9.2
 SQLAlchemy==1.4.29
 SQLAlchemy==1.4.29
 ujson==5.4.0
 ujson==5.4.0

+ 1 - 1
frameworks/Python/aioworkers/requirements-pg.txt

@@ -2,4 +2,4 @@
 uvloop==0.17.0
 uvloop==0.17.0
 asyncpg==0.27.0
 asyncpg==0.27.0
 aioworkers-pg==0.2.0
 aioworkers-pg==0.2.0
-Jinja2==3.1.3
+Jinja2==3.1.4

+ 1 - 1
frameworks/Python/api_hour/requirements.txt

@@ -6,7 +6,7 @@ asyncio-redis==0.13.4
 chardet==2.3.0
 chardet==2.3.0
 gunicorn==22.0.0
 gunicorn==22.0.0
 hiredis==0.2.0
 hiredis==0.2.0
-Jinja2==3.1.3
+Jinja2==3.1.4
 MarkupSafe==0.23
 MarkupSafe==0.23
 piprot==0.9.1
 piprot==0.9.1
 psycopg2==2.7.5
 psycopg2==2.7.5

+ 1 - 1
frameworks/Python/apidaora/requirements.txt

@@ -1,6 +1,6 @@
 asyncpg==0.21.0
 asyncpg==0.21.0
 gunicorn==20.0.4
 gunicorn==20.0.4
-jinja2==3.1.3
+jinja2==3.1.4
 uvloop==0.14.0
 uvloop==0.14.0
 uvicorn==0.11.7
 uvicorn==0.11.7
 apidaora==0.26.0
 apidaora==0.26.0

+ 1 - 1
frameworks/Python/bareasgi/requirements.txt

@@ -8,7 +8,7 @@ hpack==4.0.0
 hypercorn==0.14.3
 hypercorn==0.14.3
 hyperframe==6.0.1
 hyperframe==6.0.1
 jetblack-asgi-typing==0.4.0
 jetblack-asgi-typing==0.4.0
-Jinja2==3.1.3
+Jinja2==3.1.4
 MarkupSafe==2.1.1
 MarkupSafe==2.1.1
 orjson==3.8.0
 orjson==3.8.0
 priority==2.0.0
 priority==2.0.0

+ 1 - 1
frameworks/Python/blacksheep/requirements.txt

@@ -1,4 +1,4 @@
 asyncpg==0.27.0
 asyncpg==0.27.0
-Jinja2==3.1.3
+Jinja2==3.1.4
 blacksheep==1.2.13
 blacksheep==1.2.13
 ujson==5.7.0
 ujson==5.7.0

+ 1 - 1
frameworks/Python/falcon/requirements.txt

@@ -1,2 +1,2 @@
 falcon==3.1.1
 falcon==3.1.1
-jinja2==3.1.3
+jinja2==3.1.4

+ 1 - 1
frameworks/Python/fastapi/requirements.txt

@@ -1,4 +1,4 @@
 asyncpg==0.27.0
 asyncpg==0.27.0
 fastapi==0.109.1
 fastapi==0.109.1
-Jinja2==3.1.3
+Jinja2==3.1.4
 ujson==5.7.0
 ujson==5.7.0

Some files were not shown because too many files changed in this diff