From 628f72200e55affcc1d0cb82f93afce26ce25bd0 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Thu, 19 Feb 2026 17:24:32 +0700 Subject: [PATCH 1/3] fix connection exhaustion and closing of connections on errors --- .../org/jetbrains/ktor/benchmarks/Hello.kt | 17 ++++++++++------- .../src/main/resources/application.conf | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 54a77082a07..6cca9e35849 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -107,8 +107,8 @@ fun Application.main() { .then(Mono.from(connection.commitTransaction())) }, Connection::close, - { connection, _ -> connection.rollbackTransaction() }, - { connection -> connection.rollbackTransaction() } + { connection, _ -> Mono.from(connection.rollbackTransaction()).then(Mono.from(connection.close())) }, + { connection -> Mono.from(connection.rollbackTransaction()).then(Mono.from(connection.close())) } ).awaitFirstOrNull() call.respondJson(updatedWorlds) @@ -126,11 +126,14 @@ private suspend fun ConnectionFactory.fetchWorlds( ): List { if (count <= 0) return emptyList() val concurrency = min(count, 32) - return Mono.usingWhen(create(), { connection -> - Flux.range(0, count) - .flatMap({ selectWorldPublisher(connection) }, concurrency) - .collectList() - }, Connection::close).awaitSingle() + return Flux.range(0, count) + .flatMap({ + Mono.usingWhen(create(), { connection -> + selectWorldPublisher(connection) + }, Connection::close) + }, concurrency) + .collectList() + .awaitSingle() } private fun selectWorld(connection: Connection): Mono = diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf index fe2031a7699..cd083fdf34e 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/resources/application.conf @@ -18,8 +18,8 @@ db { host = "tfb-database" port = 5432 database = "hello_world" - initPoolSize = 512 - maxPoolSize = 512 + initPoolSize = 32 + maxPoolSize = 256 username = "benchmarkdbuser" password = "benchmarkdbpass" //url = "r2dbc:postgresql://"${db.host}":"${db.port}"/"${db.database}"?loggerLevel=OFF&disableColumnSanitiser=true&assumeMinServerVersion=16&sslmode=disable&maxSize="${db.poolSize} From bdf908d4fabb0f80fa02a92492b641fb1fdc6387 Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Thu, 19 Feb 2026 18:01:49 +0700 Subject: [PATCH 2/3] added as maintainer --- frameworks/Kotlin/ktor/benchmark_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/ktor/benchmark_config.json b/frameworks/Kotlin/ktor/benchmark_config.json index ee8ae572258..a0ba3688aac 100644 --- a/frameworks/Kotlin/ktor/benchmark_config.json +++ b/frameworks/Kotlin/ktor/benchmark_config.json @@ -1,6 +1,6 @@ { "framework": "ktor", - "maintainers": ["ShreckYe"], + "maintainers": ["ShreckYe", "inemtsev"], "tests": [ { "default": { From 67d8fcace0fbdd37c79abb9de27cd4f2b5f028fe Mon Sep 17 00:00:00 2001 From: Ilya Nemtsev Date: Thu, 19 Feb 2026 19:23:24 +0700 Subject: [PATCH 3/3] clean up --- .../src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt index 6cca9e35849..fee924bbac4 100644 --- a/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt +++ b/frameworks/Kotlin/ktor/ktor-r2dbc/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt @@ -189,7 +189,6 @@ private fun configurePostgresR2DBC(config: ApplicationConfig): ConnectionFactory .maxSize(config.property("db.maxPoolSize").getString().toInt()) .maxIdleTime(Duration.ofSeconds(30)) .maxAcquireTime(Duration.ofSeconds(5)) - .validationQuery("SELECT 1") .build() return ConnectionPool(cp)