From 7cc2c40114bbd055d51b84b8bbe419218b6a2f45 Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Mon, 7 Apr 2025 13:54:22 +0200 Subject: [PATCH] Upgrade to Vert.x 5.0.0.CR6 --- frameworks/Java/vertx/README.md | 2 +- frameworks/Java/vertx/pom.xml | 25 ++-- .../Java/vertx/src/main/java/vertx/App.java | 137 +++++++++++------- .../java/vertx/rocker/BufferRockerOutput.java | 7 +- .../Java/vertx/vertx-postgres.dockerfile | 6 +- frameworks/Java/vertx/vertx.dockerfile | 2 +- 6 files changed, 106 insertions(+), 73 deletions(-) diff --git a/frameworks/Java/vertx/README.md b/frameworks/Java/vertx/README.md index 47a3f1d2673..1e8ef72450e 100644 --- a/frameworks/Java/vertx/README.md +++ b/frameworks/Java/vertx/README.md @@ -33,7 +33,7 @@ This is the Vert.x portion of a [benchmarking test suite](../) comparing a varie ## Versions * [Java 17](https://jdk.java.net) -* [vertx 4.3.8](http://vertx.io/) +* [vertx 5.0.0.CR6](http://vertx.io/) ## Test URLs diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 4230d89326b..a827456676c 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -10,22 +10,26 @@ 17 vertx.App - 4.5.9 + 5.0.0.CR6 + 4.2.0.Final 2.16.1 - 4.1.111.Final - 0.0.25.Final io.vertx vertx-core - ${stack.version} + ${vertx.version} + + + io.vertx + vertx-core-logging + ${vertx.version} io.vertx vertx-pg-client - ${stack.version} + ${vertx.version} com.dslplatform @@ -151,14 +155,9 @@ - io.vertx - vertx-io_uring-incubator - ${stack.version} - - - io.netty.incubator - netty-incubator-transport-native-io_uring - ${netty.io_uring.version} + io.netty + netty-transport-native-io_uring + ${netty.version} linux-x86_64 diff --git a/frameworks/Java/vertx/src/main/java/vertx/App.java b/frameworks/Java/vertx/src/main/java/vertx/App.java index 5afa269ae9e..ca9d0929cca 100755 --- a/frameworks/Java/vertx/src/main/java/vertx/App.java +++ b/frameworks/Java/vertx/src/main/java/vertx/App.java @@ -3,7 +3,10 @@ import com.fizzed.rocker.ContentType; import com.fizzed.rocker.RockerOutputFactory; import io.netty.util.concurrent.MultithreadEventExecutorGroup; -import io.vertx.core.impl.VertxInternal; +import io.vertx.core.impl.SysProps; +import io.vertx.core.internal.VertxInternal; +import io.vertx.core.internal.logging.Logger; +import io.vertx.core.internal.logging.LoggerFactory; import io.vertx.pgclient.*; import io.vertx.core.*; import io.vertx.core.buffer.Buffer; @@ -13,8 +16,6 @@ import io.vertx.core.http.HttpServerRequest; import io.vertx.core.http.HttpServerResponse; import io.vertx.core.json.JsonObject; -import io.vertx.core.logging.Logger; -import io.vertx.core.logging.LoggerFactory; import io.vertx.sqlclient.*; import io.vertx.sqlclient.impl.SqlClientInternal; import vertx.model.*; @@ -73,21 +74,20 @@ static int getQueries(HttpServerRequest request) { private static final String PATH_FORTUNES = "/fortunes"; private static final String PATH_CACHING = "/cached-queries"; - private static final Handler> NULL_HANDLER = null; - private static final CharSequence RESPONSE_TYPE_PLAIN = HttpHeaders.createOptimized("text/plain"); private static final CharSequence RESPONSE_TYPE_HTML = HttpHeaders.createOptimized("text/html; charset=UTF-8"); - static final CharSequence RESPONSE_TYPE_JSON = HttpHeaders.createOptimized("application/json"); + private static final CharSequence RESPONSE_TYPE_JSON = HttpHeaders.createOptimized("application/json"); private static final String HELLO_WORLD = "Hello, world!"; private static final Buffer HELLO_WORLD_BUFFER = Buffer.buffer(HELLO_WORLD, "UTF-8"); - private static final CharSequence HEADER_SERVER = HttpHeaders.createOptimized("server"); - private static final CharSequence HEADER_DATE = HttpHeaders.createOptimized("date"); - private static final CharSequence HEADER_CONTENT_TYPE = HttpHeaders.createOptimized("content-type"); - private static final CharSequence HEADER_CONTENT_LENGTH = HttpHeaders.createOptimized("content-length"); + private static final CharSequence HEADER_SERVER = HttpHeaders.SERVER; + private static final CharSequence HEADER_DATE = HttpHeaders.DATE; + private static final CharSequence HEADER_CONTENT_TYPE = HttpHeaders.CONTENT_TYPE; + private static final CharSequence HEADER_CONTENT_LENGTH = HttpHeaders.CONTENT_LENGTH; private static final CharSequence HELLO_WORLD_LENGTH = HttpHeaders.createOptimized("" + HELLO_WORLD.length()); + private static final CharSequence JSON_LENGTH = HttpHeaders.createOptimized("" + new Message("Hello, World!").toJson().length()); private static final CharSequence SERVER = HttpHeaders.createOptimized("vert.x"); private static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; @@ -114,7 +114,8 @@ static Integer boxedRandomWorldNumber() { private HttpServer server; private SqlClientInternal client; private CharSequence dateString; - private CharSequence[] plaintextHeaders; + private MultiMap plaintextHeaders; + private MultiMap jsonHeaders; private final RockerOutputFactory factory = BufferRockerOutput.factory(ContentType.RAW); @@ -125,19 +126,43 @@ static Integer boxedRandomWorldNumber() { private PreparedQuery>[] AGGREGATED_UPDATE_WORLD_QUERY = new PreparedQuery[500]; private WorldCache WORLD_CACHE; + private MultiMap plaintextHeaders() { + return HttpHeaders + .headers() + .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_PLAIN) + .add(HEADER_SERVER, SERVER) + .add(HEADER_DATE, dateString) + .add(HEADER_CONTENT_LENGTH, HELLO_WORLD_LENGTH) + .copy(false); + } + + private MultiMap jsonHeaders() { + return HttpHeaders + .headers() + .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) + .add(HEADER_SERVER, SERVER) + .add(HEADER_DATE, dateString) + .add(HEADER_CONTENT_LENGTH, JSON_LENGTH) + .copy(false); + } + @Override public void start(Promise startPromise) throws Exception { int port = 8080; - server = vertx.createHttpServer(new HttpServerOptions()) + server = vertx + .createHttpServer(new HttpServerOptions() + .setHttp2ClearTextEnabled(false) + .setStrictThreadMode(true)) .requestHandler(App.this); dateString = createDateHeader(); - plaintextHeaders = new CharSequence[] { - HEADER_CONTENT_TYPE, RESPONSE_TYPE_PLAIN, - HEADER_SERVER, SERVER, - HEADER_DATE, dateString, - HEADER_CONTENT_LENGTH, HELLO_WORLD_LENGTH }; + plaintextHeaders = plaintextHeaders(); + jsonHeaders = jsonHeaders(); JsonObject config = config(); - vertx.setPeriodic(1000, id -> plaintextHeaders[5] = dateString = createDateHeader()); + vertx.setPeriodic(1000, id -> { + dateString = createDateHeader(); + plaintextHeaders = plaintextHeaders(); + jsonHeaders = jsonHeaders(); + }); PgConnectOptions options = new PgConnectOptions(); options.setDatabase(config.getString("database", "hello_world")); options.setHost(config.getString("host", "tfb-database")); @@ -261,26 +286,19 @@ private void sendError(HttpServerRequest req, Throwable cause) { private void handlePlainText(HttpServerRequest request) { HttpServerResponse response = request.response(); - MultiMap headers = response.headers(); - for (int i = 0;i < plaintextHeaders.length; i+= 2) { - headers.add(plaintextHeaders[i], plaintextHeaders[i + 1]); - } - response.end(HELLO_WORLD_BUFFER, NULL_HANDLER); + response.headers().setAll(plaintextHeaders); + response.end(HELLO_WORLD_BUFFER); } private void handleJson(HttpServerRequest request) { HttpServerResponse response = request.response(); - MultiMap headers = response.headers(); - headers - .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) - .add(HEADER_SERVER, SERVER) - .add(HEADER_DATE, dateString); - response.end(new Message("Hello, World!").toJson(), NULL_HANDLER); + response.headers().setAll(jsonHeaders); + response.end(new Message("Hello, World!").toJson()); } private void handleDb(HttpServerRequest req) { HttpServerResponse resp = req.response(); - SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber()), res -> { + SELECT_WORLD_QUERY.execute(Tuple.of(boxedRandomWorldNumber())).onComplete(res -> { if (res.succeeded()) { RowIterator resultSet = res.result().iterator(); if (!resultSet.hasNext()) { @@ -293,7 +311,7 @@ private void handleDb(HttpServerRequest req) { headers.add(HttpHeaders.SERVER, SERVER); headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); - resp.end(word.toJson(), NULL_HANDLER); + resp.end(word.toJson()); } else { sendError(req, res.cause()); } @@ -322,7 +340,9 @@ public Queries(HttpServerRequest req) { private void handle() { client.group(c -> { for (int i = 0; i < queries; i++) { - c.preparedQuery(SELECT_WORLD).execute(Tuple.of(boxedRandomWorldNumber()), this); + c.preparedQuery(SELECT_WORLD) + .execute(Tuple.of(boxedRandomWorldNumber())) + .onComplete(this); } }); } @@ -346,7 +366,7 @@ public void handle(AsyncResult> ar) { headers.add(HttpHeaders.SERVER, SERVER); headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); - resp.end(World.toJson(worlds), NULL_HANDLER); + resp.end(World.toJson(worlds)); } } } @@ -370,7 +390,7 @@ public void handle() { for (int i = 0; i < worldsToUpdate.length; i++) { final Integer id = boxedRandomWorldNumber(); final int index = i; - preparedQuery.execute(Tuple.of(id), res -> { + preparedQuery.execute(Tuple.of(id)).onComplete(res -> { if (!failed) { if (res.failed()) { failed = true; @@ -395,7 +415,9 @@ private void randomWorldsQueryCompleted() { params.add(world.getId()); params.add(world.getRandomNumber()); } - AGGREGATED_UPDATE_WORLD_QUERY[worldsToUpdate.length - 1].execute(Tuple.wrap(params), updateResult -> { + AGGREGATED_UPDATE_WORLD_QUERY[worldsToUpdate.length - 1] + .execute(Tuple.wrap(params)) + .onComplete(updateResult -> { if (updateResult.failed()) { sendError(request, updateResult.cause()); return; @@ -411,12 +433,14 @@ private void sendResponse() { headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_JSON); Buffer buff = WorldJsonSerializer.toJsonBuffer(worldsToUpdate); - res.end(buff, null); + res.end(buff); } } private void handleFortunes(HttpServerRequest req) { - SELECT_FORTUNE_QUERY.execute(ar -> { + SELECT_FORTUNE_QUERY + .execute() + .onComplete(ar -> { HttpServerResponse response = req.response(); if (ar.succeeded()) { SqlResult> result = ar.result(); @@ -432,7 +456,7 @@ private void handleFortunes(HttpServerRequest req) { headers.add(HttpHeaders.DATE, dateString); headers.add(HttpHeaders.CONTENT_TYPE, RESPONSE_TYPE_HTML); FortunesTemplate template = FortunesTemplate.template(fortunes); - response.end(template.render(factory).buffer(), NULL_HANDLER); + response.end(template.render(factory).buffer()); } else { sendError(req, ar.cause()); } @@ -457,7 +481,7 @@ private void handleCaching(HttpServerRequest req) { .add(HEADER_CONTENT_TYPE, RESPONSE_TYPE_JSON) .add(HEADER_SERVER, SERVER) .add(HEADER_DATE, dateString); - response.end(CachedWorld.toJson(worlds), NULL_HANDLER); + response.end(CachedWorld.toJson(worlds)); } public static void main(String[] args) throws Exception { @@ -471,24 +495,30 @@ public static void main(String[] args) throws Exception { } } JsonObject config = new JsonObject(new String(Files.readAllBytes(new File(args[0]).toPath()))); - Vertx vertx = Vertx.vertx(new VertxOptions().setEventLoopPoolSize(eventLoopPoolSize).setPreferNativeTransport(true)); + Vertx vertx = Vertx.vertx(new VertxOptions() + .setEventLoopPoolSize(eventLoopPoolSize) + .setPreferNativeTransport(true) + .setDisableTCCL(true) + ); vertx.exceptionHandler(err -> { err.printStackTrace(); }); - printConfig(vertx); - vertx.deployVerticle(App.class.getName(), - new DeploymentOptions().setInstances(eventLoopPoolSize).setConfig(config), event -> { - if (event.succeeded()) { - logger.info("Server listening on port " + 8080); - } else { - logger.error("Unable to start your application", event.cause()); - } - }); + printConfig((VertxInternal) vertx); + vertx.deployVerticle( + App.class.getName(), + new DeploymentOptions().setInstances(eventLoopPoolSize).setConfig(config)) + .onComplete(event -> { + if (event.succeeded()) { + logger.info("Server listening on port " + 8080); + } else { + logger.error("Unable to start your application", event.cause()); + } + }); } - private static void printConfig(Vertx vertx) { + private static void printConfig(VertxInternal vertx) { boolean nativeTransport = vertx.isNativeTransportEnabled(); - String transport = ((VertxInternal) vertx).transport().getClass().getSimpleName(); + String transport = vertx.transport().getClass().getSimpleName(); String version = "unknown"; try { InputStream in = Vertx.class.getClassLoader().getResourceAsStream("META-INF/vertx/vertx-version.txt"); @@ -513,5 +543,10 @@ private static void printConfig(Vertx vertx) { logger.info("Event Loop Size: " + ((MultithreadEventExecutorGroup)vertx.nettyEventLoopGroup()).executorCount()); logger.info("Native transport : " + nativeTransport); logger.info("Transport : " + transport); + logger.info("Netty buffer bound check : " + System.getProperty("io.netty.buffer.checkBounds")); + logger.info("Netty buffer accessibility check : " + System.getProperty("io.netty.buffer.checkAccessible")); + for (SysProps sysProp : SysProps.values()) { + logger.info(sysProp.name + " : " + sysProp.get()); + } } } diff --git a/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java b/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java index 326d45e3e96..36d1144f5d6 100644 --- a/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java +++ b/frameworks/Java/vertx/src/main/java/vertx/rocker/BufferRockerOutput.java @@ -5,7 +5,8 @@ import com.fizzed.rocker.RockerOutputFactory; import io.netty.buffer.ByteBuf; import io.vertx.core.buffer.Buffer; -import io.vertx.core.buffer.impl.PartialPooledByteBufAllocator; +import io.vertx.core.impl.buffer.VertxByteBufAllocator; +import io.vertx.core.internal.buffer.BufferInternal; import java.io.IOException; import java.nio.charset.Charset; @@ -21,8 +22,8 @@ public static RockerOutputFactory factory(ContentType conten }; } - private final ByteBuf buff = PartialPooledByteBufAllocator.INSTANCE.directBuffer(); - private final Buffer buffer = Buffer.buffer(buff); + private final ByteBuf buff = VertxByteBufAllocator.DEFAULT.directBuffer(); + private final Buffer buffer = BufferInternal.buffer(buff); private final ContentType contentType; BufferRockerOutput(ContentType contentType) { diff --git a/frameworks/Java/vertx/vertx-postgres.dockerfile b/frameworks/Java/vertx/vertx-postgres.dockerfile index dec7fa545a3..95e731f2d9a 100644 --- a/frameworks/Java/vertx/vertx-postgres.dockerfile +++ b/frameworks/Java/vertx/vertx-postgres.dockerfile @@ -16,13 +16,11 @@ CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ -XX:+UseParallelGC \ -Djava.lang.Integer.IntegerCache.high=10000 \ -Dvertx.disableMetrics=true \ - -Dvertx.disableH2c=true \ -Dvertx.disableWebsockets=true \ - -Dvertx.flashPolicyHandler=false \ - -Dvertx.threadChecks=false \ -Dvertx.disableContextTimings=true \ - -Dvertx.disableTCCL=true \ -Dvertx.disableHttpHeadersValidation=true \ + -Dvertx.cacheImmutableHttpResponseHeaders=true \ + -Dvertx.internCommonHttpRequestHeadersToLowerCase=true \ -Dvertx.eventLoopPoolSize=$((`grep --count ^processor /proc/cpuinfo`)) \ -Dio.netty.buffer.checkBounds=false \ -Dio.netty.buffer.checkAccessible=false \ diff --git a/frameworks/Java/vertx/vertx.dockerfile b/frameworks/Java/vertx/vertx.dockerfile index 2fe2a27a2c2..27c34140e64 100644 --- a/frameworks/Java/vertx/vertx.dockerfile +++ b/frameworks/Java/vertx/vertx.dockerfile @@ -6,4 +6,4 @@ RUN mvn package -q EXPOSE 8080 -CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.flashPolicyHandler=false", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"] +CMD ["java", "-Xms2G", "-Xmx2G", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Djava.lang.Integer.IntegerCache.high=10000", "-Dvertx.disableMetrics=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableContextTimings=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.cacheImmutableHttpResponseHeaders=true", "-Dvertx.internCommonHttpRequestHeadersToLowerCase=true", "-Dio.netty.buffer.checkBounds=false", "-Dio.netty.buffer.checkAccessible=false", "-jar", "target/vertx.benchmark-0.0.1-SNAPSHOT-fat.jar", "src/main/conf/config.json"]