Quellcode durchsuchen

[Scala/otavia] upgrade otavia to 0.4.2 (#9224)

* [Scala/otavia] upgrade otavia to 0.4.2

* [Scala/otavia] change randomnumber to randomNumber

* [Scala/otavia] upgrade otavia to 0.4.3
Yan Kun vor 11 Monaten
Ursprung
Commit
12ba6b9c5a

+ 0 - 0
frameworks/Scala/otavia/README.MD → frameworks/Scala/otavia/README.md


+ 8 - 11
frameworks/Scala/otavia/benchmark/src/app/controller/DBController.scala

@@ -9,7 +9,7 @@ import cc.otavia.core.stack.helper.{FutureState, FuturesState, StartState}
 import cc.otavia.core.stack.{AskStack, StackState, StackYield}
 import cc.otavia.http.server.{HttpRequest, HttpResponse}
 import cc.otavia.sql.Connection
-import cc.otavia.sql.Statement.{ModifyRows, PrepareQuery}
+import cc.otavia.sql.statement.{ModifyRows, PrepareQuery}
 
 import java.util.SplittableRandom
 
@@ -22,20 +22,17 @@ class DBController extends StateActor[REQ] {
     override protected def afterMount(): Unit = connection = autowire[Connection]()
 
     override protected def resumeAsk(stack: AskStack[REQ & Ask[? <: Reply]]): StackYield =
-        stack match
-            case stack: AskStack[SingleQueryRequest] if stack.ask.isInstanceOf[SingleQueryRequest] =>
-                handleSingleQuery(stack)
-            case stack: AskStack[MultipleQueryRequest] if stack.ask.isInstanceOf[MultipleQueryRequest] =>
-                handleMultipleQuery(stack)
-            case stack: AskStack[UpdateRequest] if stack.ask.isInstanceOf[UpdateRequest] =>
-                handleUpdateQuery(stack)
+        stack.ask match
+            case _: SingleQueryRequest   => handleSingleQuery(stack.asInstanceOf[AskStack[SingleQueryRequest]])
+            case _: MultipleQueryRequest => handleMultipleQuery(stack.asInstanceOf[AskStack[MultipleQueryRequest]])
+            case _: UpdateRequest        => handleUpdateQuery(stack.asInstanceOf[AskStack[UpdateRequest]])
 
     // Test 2: Single database query
     private def handleSingleQuery(stack: AskStack[SingleQueryRequest]): StackYield = {
         stack.state match
             case _: StartState =>
                 val state = FutureState[World]()
-                connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, Tuple1(randomWorld())), state.future)
+                connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, randomWorld()), state.future)
                 stack.suspend(state)
             case state: FutureState[World] =>
                 stack.`return`(state.future.getNow)
@@ -61,7 +58,7 @@ class DBController extends StateActor[REQ] {
                 stack.attach(worlds)
                 val newState  = FutureState[ModifyRows]()
                 val newWorlds = worlds.sortBy(_.id).map(_.copy(randomNumber = randomWorld()))
-                connection.ask(PrepareQuery.update(UPDATE_WORLD, newWorlds), newState.future)
+                connection.ask(PrepareQuery.updateBatch(UPDATE_WORLD, newWorlds), newState.future)
                 stack.suspend(newState)
             case state: FutureState[ModifyRows] =>
                 if (state.future.isFailed) state.future.causeUnsafe.printStackTrace()
@@ -72,7 +69,7 @@ class DBController extends StateActor[REQ] {
     private def selectWorlds(queries: Int): StackState = {
         val state = FuturesState[World](queries)
         for (future <- state.futures)
-            connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, Tuple1(randomWorld())), future)
+            connection.ask(PrepareQuery.fetchOne[World](SELECT_WORLD, randomWorld()), future)
         state
     }
 

+ 14 - 4
frameworks/Scala/otavia/benchmark/src/app/controller/FortuneController.scala

@@ -7,12 +7,20 @@ import cc.otavia.core.address.Address
 import cc.otavia.core.stack.helper.{FutureState, StartState}
 import cc.otavia.core.stack.{AskStack, StackState, StackYield}
 import cc.otavia.http.server.{HttpRequest, HttpResponse}
-import cc.otavia.sql.Statement.PrepareQuery
+import cc.otavia.sql.statement.PrepareQuery
 import cc.otavia.sql.{Connection, RowSet}
 
+import java.util
+import java.util.Comparator
+
 class FortuneController extends StateActor[FortuneRequest] {
 
     private var connection: Address[MessageOf[Connection]] = _
+    private val tmpArray: Array[Fortune]                   = new Array[Fortune](13)
+
+    private val comparator = new Comparator[Fortune] {
+        override def compare(o1: Fortune, o2: Fortune): Int = o1.message.compareTo(o2.message)
+    }
 
     override protected def afterMount(): Unit = connection = autowire[Connection]()
 
@@ -24,8 +32,10 @@ class FortuneController extends StateActor[FortuneRequest] {
                 connection.ask(PrepareQuery.fetchAll[Fortune](SELECT_FORTUNE), state.future)
                 stack.suspend(state)
             case state: FutureState[RowSet[Fortune]] =>
-                val fortunes = (state.future.getNow.rows :+ Fortune(0, "Additional fortune added at request time."))
-                    .sortBy(_.message)
+                System.arraycopy(state.future.getNow.rows, 0, tmpArray, 0, 12)
+                tmpArray(12) = Fortune(0, "Additional fortune added at request time.")
+                util.Arrays.sort(tmpArray, comparator)
+                val fortunes = tmpArray.clone()
                 val response = HttpResponse.builder.setContent(fortunes).build()
                 stack.`return`(response)
     }
@@ -34,7 +44,7 @@ class FortuneController extends StateActor[FortuneRequest] {
 
 object FortuneController {
 
-    class FortuneRequest extends HttpRequest[Nothing, HttpResponse[Seq[Fortune]]]
+    class FortuneRequest extends HttpRequest[Nothing, HttpResponse[Array[Fortune]]]
 
     private val SELECT_FORTUNE = "SELECT id, message from FORTUNE"
 

+ 2 - 2
frameworks/Scala/otavia/benchmark/src/app/model/Fortune.scala

@@ -1,7 +1,7 @@
 package app.model
 
 import cc.otavia.json.JsonSerde
-import cc.otavia.sql.{Row, RowDecoder}
+import cc.otavia.sql.{Row, RowCodec}
 
 /** The model for the "fortune" database table. */
-case class Fortune(id: Int, message: String) extends Row derives RowDecoder, JsonSerde
+case class Fortune(id: Int, message: String) extends Row derives RowCodec, JsonSerde

+ 2 - 2
frameworks/Scala/otavia/benchmark/src/app/model/World.scala

@@ -2,7 +2,7 @@ package app.model
 
 import cc.otavia.json.JsonSerde
 import cc.otavia.serde.annotation.rename
-import cc.otavia.sql.{Row, RowDecoder}
+import cc.otavia.sql.{Row, RowCodec}
 
 /** The model for the "world" database table. */
-case class World(id: Int, @rename("randomnumber") randomNumber: Int) extends Row derives RowDecoder, JsonSerde
+case class World(id: Int, randomNumber: Int) extends Row derives RowCodec, JsonSerde

+ 3 - 3
frameworks/Scala/otavia/benchmark/src/app/util/FortunesRender.scala

@@ -7,7 +7,7 @@ import cc.otavia.serde.Serde
 import java.nio.charset.StandardCharsets
 import scala.annotation.switch
 
-class FortunesRender extends Serde[Seq[Fortune]] {
+class FortunesRender extends Serde[Array[Fortune]] {
 
     private val text1 =
         "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>"
@@ -27,7 +27,7 @@ class FortunesRender extends Serde[Seq[Fortune]] {
     private val squot = "&#39;".getBytes()
     private val amp   = "&amp;".getBytes()
 
-    override def serialize(fortunes: Seq[Fortune], out: Buffer): Unit = {
+    override def serialize(fortunes: Array[Fortune], out: Buffer): Unit = {
         out.writeBytes(text1)
         for (fortune <- fortunes) {
             out.writeBytes(text2)
@@ -39,7 +39,7 @@ class FortunesRender extends Serde[Seq[Fortune]] {
         out.writeBytes(text5)
     }
 
-    override def deserialize(in: Buffer): Seq[Fortune] = throw new UnsupportedOperationException()
+    override def deserialize(in: Buffer): Array[Fortune] = throw new UnsupportedOperationException()
 
     private def writeEscapeMessage(buffer: Buffer, message: String): Unit = {
         var i = 0

+ 47 - 1
frameworks/Scala/otavia/benchmark_config.json

@@ -25,7 +25,53 @@
         "notes": "",
         "versus": "Otavia"
       },
-      "reserve": {
+      "equalization": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "query_url": "/queries?queries=",
+        "fortune_url": "/fortunes",
+        "update_url": "/updates?queries=",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "Postgres",
+        "framework": "otavia",
+        "language": "Scala",
+        "flavor": "None",
+        "orm": "Micro",
+        "platform": "Otavia",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "otavia",
+        "notes": "",
+        "versus": "Otavia"
+      },
+      "equalization-offgc": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "query_url": "/queries?queries=",
+        "fortune_url": "/fortunes",
+        "update_url": "/updates?queries=",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "Postgres",
+        "framework": "otavia",
+        "language": "Scala",
+        "flavor": "None",
+        "orm": "Micro",
+        "platform": "Otavia",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "otavia",
+        "notes": "",
+        "versus": "Otavia"
+      },
+      "offgc": {
         "json_url": "/json",
         "plaintext_url": "/plaintext",
         "db_url": "/db",

+ 1 - 1
frameworks/Scala/otavia/build.sc

@@ -1,7 +1,7 @@
 import mill._
 import mill.scalalib._
 
-def otaviaVersion = "0.4.0"
+def otaviaVersion = "0.4.3"
 
 object benchmark extends ScalaModule {
 

+ 35 - 1
frameworks/Scala/otavia/config.toml

@@ -18,7 +18,7 @@ platform = "Otavia"
 webserver = "None"
 versus = "Otavia"
 
-[reserve]
+[equalization]
 urls.plaintext = "/plaintext"
 urls.json = "/json"
 urls.db = "/db"
@@ -34,3 +34,37 @@ orm = "Micro"
 platform = "Otavia"
 webserver = "None"
 versus = "Otavia"
+
+[equalization-offgc]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Micro"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Micro"
+platform = "Otavia"
+webserver = "None"
+versus = "Otavia"
+
+[offgc]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Micro"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Micro"
+platform = "Otavia"
+webserver = "None"
+versus = "Otavia"

+ 16 - 0
frameworks/Scala/otavia/otavia-equalization-offgc.dockerfile

@@ -0,0 +1,16 @@
+FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0
+WORKDIR /otavia
+COPY benchmark benchmark
+COPY build.sc build.sc
+ENV COURSIER_REPOSITORIES=ivy2Local|central
+RUN mill benchmark.assembly
+
+EXPOSE 8080
+
+CMD java -server \
+    -Dcc.otavia.actor.worker.size=56 -Dcc.otavia.nio.worker.size=56 \
+    -Dcc.otavia.system.gc.aggressive=false \
+    -jar \
+    out/benchmark/assembly.dest/out.jar \
+    jdbc:postgresql://tfb-database:5432/hello_world \
+    benchmarkdbuser benchmarkdbpass 56

+ 2 - 2
frameworks/Scala/otavia/otavia-reserve.dockerfile → frameworks/Scala/otavia/otavia-equalization.dockerfile

@@ -8,8 +8,8 @@ RUN mill benchmark.assembly
 EXPOSE 8080
 
 CMD java -server \
-    -Dcc.otavia.actor.worker.size=18 -Dcc.otavia.nio.worker.size=36 \
+    -Dcc.otavia.actor.worker.size=56 -Dcc.otavia.nio.worker.size=56 \
     -jar \
     out/benchmark/assembly.dest/out.jar \
     jdbc:postgresql://tfb-database:5432/hello_world \
-    benchmarkdbuser benchmarkdbpass 54
+    benchmarkdbuser benchmarkdbpass 56

+ 16 - 0
frameworks/Scala/otavia/otavia-offgc.dockerfile

@@ -0,0 +1,16 @@
+FROM nightscape/scala-mill:eclipse-temurin-17.0.8.1_1-jdk-focal_0.11.6_3.3.0
+WORKDIR /otavia
+COPY benchmark benchmark
+COPY build.sc build.sc
+ENV COURSIER_REPOSITORIES=ivy2Local|central
+RUN mill benchmark.assembly
+
+EXPOSE 8080
+
+CMD java -server \
+    -Dcc.otavia.actor.worker.size=28 -Dcc.otavia.nio.worker.size=56 \
+    -Dcc.otavia.system.gc.aggressive=false \
+    -jar \
+    out/benchmark/assembly.dest/out.jar \
+    jdbc:postgresql://tfb-database:5432/hello_world \
+    benchmarkdbuser benchmarkdbpass 56

+ 2 - 2
frameworks/Scala/otavia/otavia.dockerfile

@@ -8,8 +8,8 @@ RUN mill benchmark.assembly
 EXPOSE 8080
 
 CMD java -server \
-    -Dcc.otavia.actor.worker.size=24 -Dcc.otavia.nio.worker.size=48 \
+    -Dcc.otavia.actor.worker.size=28 -Dcc.otavia.nio.worker.size=56 \
     -jar \
     out/benchmark/assembly.dest/out.jar \
     jdbc:postgresql://tfb-database:5432/hello_world \
-    benchmarkdbuser benchmarkdbpass 72
+    benchmarkdbuser benchmarkdbpass 56