-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Wasm wasi #4064
Wasm wasi #4064
Conversation
compilations["main"]?.dependencies { | ||
api("org.jetbrains.kotlinx:atomicfu-wasm-wasi:${version("atomicfu")}") | ||
} | ||
compilations.configureEach { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately we can't do this in configure-compilation-conventions.gradle.kts
because there is no way to distingish WasmWasi
target from WasmJs
or JS
targets there.
* Thrown when multiply exception were thrown in event loop. | ||
* @see runEventLoop | ||
*/ | ||
public class EventLoopException(public val causes: List<Throwable>) : Throwable("Multiple exceptions were thrown in the event loop.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Making this public need consideration.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A typical approach that we take is to take the first throwable, add the other throwables to it as suppressed ones, and then throw the first one. No need for a separate type, the way I understand the problem. Here's an example:
kotlinx.coroutines/kotlinx-coroutines-test/common/src/TestBuilders.kt
Lines 567 to 579 in 0ca7358
internal fun throwAll(head: Throwable?, other: List<Throwable>) { | |
if (head != null) { | |
other.forEach { head.addSuppressed(it) } | |
throw head | |
} else { | |
with(other) { | |
firstOrNull()?.apply { | |
drop(1).forEach { addSuppressed(it) } | |
throw this | |
} | |
} | |
} | |
} |
buildSrc/src/main/kotlin/kotlin-multiplatform-conventions.gradle.kts
Outdated
Show resolved
Hide resolved
import kotlinx.coroutines.internal.* | ||
import kotlin.coroutines.* | ||
|
||
internal object WasiDispatcher: CoroutineDispatcher(), Delay { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not a private
object in CoroutineContext.kt
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, because WasiDispatcher
is not a CoroutineContext
. But if you would like I will move it.
package kotlinx.coroutines.internal | ||
|
||
internal actual fun propagateExceptionFinalResort(exception: Throwable) { | ||
println(exception.toString()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems too mild to me. For example, on Native, we terminate the whole process. On JS, I suppose we use logging only because there's no way to tell JS to stop everything, and even there, we are at least using the error stream, not the standard output. Is there a way to crash the program in WASI or at least make the error seem more scary?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Well, I put the code which prints an error into error stream and then exit with not 0 error code. I could even send a signal if you would like to have most scariest termination. Please notice - this way all finalisers will not work.
@InternalCoroutinesApi | ||
public fun runTestCoroutine(context: CoroutineContext, block: suspend CoroutineScope.() -> Unit) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will @PublishedApi internal
with suppresses on the call site also work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I prefer not to suppress anything. But if all reviewers ask for this then will do.
@InternalCoroutinesApi | ||
public fun runTestCoroutine(context: CoroutineContext, block: suspend CoroutineScope.() -> Unit) { | ||
val newContext = GlobalScope.newCoroutineContext(context) | ||
val coroutine = object: AbstractCoroutine<Unit>(newContext, true, true) {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Style: boolean parameters should typically be named.
* Thrown when multiply exception were thrown in event loop. | ||
* @see runEventLoop | ||
*/ | ||
public class EventLoopException(public val causes: List<Throwable>) : Throwable("Multiple exceptions were thrown in the event loop.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A typical approach that we take is to take the first throwable, add the other throwables to it as suppressed ones, and then throw the first one. No need for a separate type, the way I understand the problem. Here's an example:
kotlinx.coroutines/kotlinx-coroutines-test/common/src/TestBuilders.kt
Lines 567 to 579 in 0ca7358
internal fun throwAll(head: Throwable?, other: List<Throwable>) { | |
if (head != null) { | |
other.forEach { head.addSuppressed(it) } | |
throw head | |
} else { | |
with(other) { | |
firstOrNull()?.apply { | |
drop(1).forEach { addSuppressed(it) } | |
throw this | |
} | |
} | |
} | |
} |
|
||
private const val CLOCKID_MONOTONIC = 1 | ||
|
||
internal class Event internal constructor(internal var callback: (() -> Unit)?, internal val absoluteTimeout: Long) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't this class be private
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It used for cancelling in the WasiDispatcher
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Event
can implement the DisposableHandle
interface for this purpose.
return ptrToSubscription | ||
} | ||
|
||
@OptIn(UnsafeWasmMemoryApi::class) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably better to opt in for the whole file.
} else { | ||
nextCycleEvents.add(currentEvent) | ||
nextCycleNearestEventAbsoluteTime = min(eventAbsoluteTime, nextCycleNearestEventAbsoluteTime) | ||
nextCycleContainTimedEvent = eventAbsoluteTime > 0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A bug: only the last added event will decide whether there are timed events. Adding a timed one first, and then untimed, will lead to the system thinking there are no timed events.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ohh, it is true, thanks!!!
val ptrTo8Bytes = allocator.allocate(8) | ||
val ptrToSubscription = initializeSubscriptionPtr(allocator) | ||
|
||
while (nextCycleEvents.isNotEmpty()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I understand correctly, here's how the event loop implementation works:
- New tasks are added to the queue, remembering the earliest time the tasks should start;
- When the event loop machinery gets its turn, it takes the list of the scheduled events. Then, it waits for the time that it takes for the earliest one to start. Finally, it iterates the list to run all tasks that are due, pushing back the tasks that are not due.
If so, this strategy can lead to incorrect ordering of tasks. Imagine the following scenario.
- There are two tasks:
A
is scheduled to run in one second,B
is scheduled to run in two seconds. - One second later,
A
runs for three more seconds and schedules another task,C
, to be executed. B
adds itself to the queue.C
executes.- Only then does
B
execute.
The more robust approach is to use a heap. We have an implementation already in the library. https://github.com/Kotlin/kotlinx.coroutines/blob/0ca735851f0a225b6a7582232a1c9847a27fd059/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt uses the heap to implement the event loop for kotlinx-coroutines-test
. This implementation isn't long, but can be radically simplified further when there is no multithreading; you don't need to send the "dispatch events", you don't need to use synchronized
, etc. You also don't need the separation between foreground and background work.
The main entry point you're interested in is
kotlinx.coroutines/kotlinx-coroutines-test/common/src/TestCoroutineScheduler.kt
Lines 116 to 121 in 0ca7358
internal fun advanceUntilIdleOr(condition: () -> Boolean) { | |
while (true) { | |
if (!tryRunNextTaskUnless(condition)) | |
return | |
} | |
} |
With
condition
set to { false }
. Another change is that here currentTime = event.time |
sleep
instead of setting the current time unconditionally.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I understand correctly, here's how the event loop implementation works:
Is this a requirement for the implementation? Because there is no tests checking this. And I am not sure that the other implementations, like in JS
, are following this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, this is a requirement. Tests don't check this because, in multithreaded environments, we actually violate this intentionally sometimes. On JS, we don't use our own event loop, we rely on the one provided by the environment.
Now that I look at the implementation more closely, I don't understand the reason to implement new event loop logic at all. We can probably inherit from EventLoopImplBase
. For that, we need to implement EventLoopImplPlatform
for Wasm/WASI properly. If we go down that path, then, to implement runEventLoop
, we can duplicate the logic from
kotlinx.coroutines/kotlinx-coroutines-core/native/src/Builders.kt
Lines 122 to 144 in f9a4545
fun joinBlocking(): T { | |
try { | |
eventLoop?.incrementUseCount() | |
while (true) { | |
var parkNanos: Long | |
// Workaround for bug in BE optimizer that cannot eliminate boxing here | |
if (eventLoop != null) { | |
parkNanos = eventLoop.processNextEvent() | |
} else { | |
parkNanos = Long.MAX_VALUE | |
} | |
// note: processNextEvent may lose unpark flag, so check if completed before parking | |
if (isCompleted) break | |
joinWorker.park(parkNanos / 1000L, true) | |
} | |
} finally { // paranoia | |
eventLoop?.decrementUseCount() | |
} | |
// now return result | |
val state = state.unboxState() | |
(state as? CompletedExceptionally)?.let { throw it.cause } | |
return state as T | |
} |
Please change the base of the PR to |
I have rebased onto the master and merged all the AMEND commits by @dkhalanskyjb request. |
Please do |
val coroutine = object: AbstractCoroutine<Unit>(newContext, initParentJob = true, active = true) {} | ||
coroutine.start(CoroutineStart.DEFAULT, coroutine, block) | ||
runEventLoop() | ||
if (coroutine.isCancelled) throw coroutine.getCancellationException().let { it.cause ?: it } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Throwing cause
here breaks the following test (you can put it in RunTestTest.kt
) that passes on the other platforms:
/**
* Tests that, when the test scope is cancelled, [runTest] throws that the cancellation exception.
*/
@Test
fun testCancellingTestScope() = testResultMap({
try {
it()
fail("unreached")
} catch (e: CancellationException) {
// expected
}
}) {
runTest {
cancel(CancellationException("Oh no", TestException()))
}
}
When I do it like this, both the new test and the existing ones pass for me:
coroutine.getCompletionExceptionOrNull()?.let { throw it }
val newContext = GlobalScope.newCoroutineContext(context) | ||
val coroutine = object: AbstractCoroutine<Unit>(newContext, initParentJob = true, active = true) {} | ||
coroutine.start(CoroutineStart.DEFAULT, coroutine, block) | ||
runEventLoop() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's take a look at this test (which shouldn't be added to the codebase, except maybe as @Ignored
):
@Test
fun testHappilyHanging() = runTest(timeout = 1.seconds) {
// launch { // uncomment for the edge case where the job completes but its children don't
withContext(NonCancellable) {
println("Start hanging forever")
Channel<Unit>().receive()
}
// }
}
On the JVM, this test hangs, as expected: there is nothing to obtain from an empty channel, and we ignore the timeout-induced cancellation requests. On Wasm/JS, it fails with "Unknown" after a couple of seconds (ok, weird, but at least the test doesn't pass). On JS, it fails due to the Mocha 2-second timeout.
On WASI, it just exits and reports success. When the event loop has nothing more to do, it just considers the coroutine as finished.
What we can do in this case is platform-specific; for this case, I propose us to do something like
check(coroutine.isCompleted) { "Coroutine $coroutine did not complete, but the system reached quiescence") }
directly below this line.
@@ -9,5 +9,6 @@ public fun runTestCoroutine(context: CoroutineContext, block: suspend CoroutineS | |||
val coroutine = object: AbstractCoroutine<Unit>(newContext, initParentJob = true, active = true) {} | |||
coroutine.start(CoroutineStart.DEFAULT, coroutine, block) | |||
runEventLoop() | |||
if (coroutine.isCancelled) throw coroutine.getCancellationException().let { it.cause ?: it } | |||
coroutine.getCompletionExceptionOrNull()?.let { throw it } | |||
check(coroutine.isCompleted) { "Coroutine $coroutine did not complete, but the system reached quiescence" } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Eh, no, it's better to do it in the opposite order. getCompletionExceptionOrNull
itself throws exceptions when the coroutine is still active, but really obscure ones.
This PR contains the following updates: | Package | Type | Package file | Manager | Update | Change | |---|---|---|---|---|---| | [org.threeten:threetenbp](https://www.threeten.org/threetenbp) ([source](https://github.com/ThreeTen/threetenbp)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.6.9` -> `1.7.0` | | [app.cash.tempest:tempest-bom](https://github.com/cashapp/tempest) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2024.08.07.002316-64f40ef` -> `2024.09.04.165019-8430cf3` | | [org.postgresql:postgresql](https://jdbc.postgresql.org) ([source](https://github.com/pgjdbc/pgjdbc)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `42.3.9` -> `42.7.4` | | [com.squareup.okio:okio](https://github.com/square/okio) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `3.9.0` -> `3.9.1` | | [org.mockito:mockito-core](https://github.com/mockito/mockito) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `5.13.0` -> `5.14.1` | | [ch.qos.logback:logback-core](http://logback.qos.ch) ([source](https://github.com/qos-ch/logback), [changelog](https://logback.qos.ch/news.html)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.4.14` -> `1.5.6` | | [ch.qos.logback:logback-classic](http://logback.qos.ch) ([source](https://github.com/qos-ch/logback), [changelog](https://logback.qos.ch/news.html)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.4.14` -> `1.5.6` | | [org.jetbrains.kotlinx:kotlinx-coroutines-core](https://github.com/Kotlin/kotlinx.coroutines) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.8.1` -> `1.9.0` | | [org.jooq:jooq](http://www.jooq.org) ([source](https://github.com/jOOQ/jOOQ)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `3.18.2` -> `3.18.20` | | [redis.clients:jedis](https://github.com/redis/jedis) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `5.1.5` -> `5.2.0` | | [com.google.guava:guava-bom](https://github.com/google/guava) ([source](http://svn.sonatype.org/spice/trunk/oss/oss-parent-9)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `33.3.0-jre` -> `33.3.1-jre` | | [io.grpc:grpc-stub](https://github.com/grpc/grpc-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.60.0` -> `1.68.0` | | [io.grpc:grpc-protobuf](https://github.com/grpc/grpc-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.60.0` -> `1.68.0` | | [io.grpc:grpc-netty](https://github.com/grpc/grpc-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.60.0` -> `1.68.0` | | [io.grpc:protoc-gen-grpc-java](https://github.com/grpc/grpc-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.60.0` -> `1.68.0` | | [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.60.0` -> `1.68.0` | | [io.grpc:grpc-api](https://github.com/grpc/grpc-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.60.0` -> `1.68.0` | | [com.google.api.grpc:proto-google-common-protos](https://github.com/googleapis/sdk-platform-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.43.0` -> `2.45.1` | | [com.google.apis:google-api-services-storage](http://nexus.sonatype.org/oss-repository-hosting.html) ([source](http://svn.sonatype.org/spice/tags/oss-parent-7)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `v1-rev20240916-2.0.0` -> `v1-rev20240924-2.0.0` | | [com.google.cloud:google-cloud-spanner](https://github.com/googleapis/java-spanner) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `6.75.0` -> `6.76.0` | | [com.google.api:gax](https://github.com/googleapis/sdk-platform-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.52.0` -> `2.54.1` | | [com.google.errorprone:error_prone_annotations](https://errorprone.info) ([source](https://github.com/google/error-prone)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.31.0` -> `2.32.0` | | [com.netflix.concurrency-limits:concurrency-limits-core](https://github.com/Netflix/concurrency-limits) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `0.5.1` -> `0.5.2` | | [org.apache.commons:commons-lang3](https://commons.apache.org/proper/commons-lang/) ([source](https://gitbox.apache.org/repos/asf?p=commons-lang.git)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `3.16.0` -> `3.17.0` | | [commons-io:commons-io](https://commons.apache.org/proper/commons-io/) ([source](https://gitbox.apache.org/repos/asf?p=commons-io.git)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.16.1` -> `2.17.0` | | [app.cash.sqldelight:runtime](https://github.com/cashapp/sqldelight) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.0.0` -> `2.0.2` | | [app.cash.sqldelight:mysql-dialect](https://github.com/cashapp/sqldelight) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.0.0` -> `2.0.2` | | [app.cash.sqldelight:jdbc-driver](https://github.com/cashapp/sqldelight) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.0.0` -> `2.0.2` | | [app.cash.sqldelight:gradle-plugin](https://github.com/cashapp/sqldelight) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `2.0.0` -> `2.0.2` | | [com.google.protobuf:protoc](https://developers.google.com/protocol-buffers/) ([source](https://github.com/protocolbuffers/protobuf)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `3.25.4` -> `3.25.5` | | [com.google.protobuf:protobuf-java](https://developers.google.com/protocol-buffers/) ([source](https://github.com/protocolbuffers/protobuf)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `3.25.4` -> `3.25.5` | | [com.squareup.okhttp3:mockwebserver](https://square.github.io/okhttp/) ([source](https://github.com/square/okhttp)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.0.0-alpha.13` -> `5.0.0-alpha.14` | | [com.squareup.okhttp3:okhttp](https://square.github.io/okhttp/) ([source](https://github.com/square/okhttp)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.0.0-alpha.13` -> `5.0.0-alpha.14` | | [io.netty:netty-handler](https://netty.io/) ([source](https://github.com/netty/netty)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `4.1.112.Final` -> `4.1.113.Final` | | [io.netty:netty-bom](https://netty.io/) ([source](https://github.com/netty/netty)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `4.1.112.Final` -> `4.1.113.Final` | | [io.micrometer:micrometer-registry-prometheus](https://github.com/micrometer-metrics/micrometer) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.12.9` -> `1.12.10` | | [io.micrometer:micrometer-core](https://github.com/micrometer-metrics/micrometer) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.12.9` -> `1.12.10` | | [com.vanniktech.maven.publish.base](https://github.com/vanniktech/gradle-maven-publish-plugin) | plugin | misk/gradle/libs.versions.toml | gradle | minor | `0.27.0` -> `0.28.0` | | [com.vanniktech:gradle-maven-publish-plugin](https://github.com/vanniktech/gradle-maven-publish-plugin) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `0.27.0` -> `0.28.0` | | [org.junit.jupiter:junit-jupiter-params](https://junit.org/junit5/) ([source](https://github.com/junit-team/junit5)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.11.0` -> `5.11.1` | | [org.junit.jupiter:junit-jupiter-engine](https://junit.org/junit5/) ([source](https://github.com/junit-team/junit5)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.11.0` -> `5.11.1` | | [org.junit.jupiter:junit-jupiter-api](https://junit.org/junit5/) ([source](https://github.com/junit-team/junit5)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `5.11.0` -> `5.11.1` | | [com.fasterxml.jackson.module:jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.fasterxml.jackson.datatype:jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.fasterxml.jackson.dataformat:jackson-dataformat-yaml](https://github.com/FasterXML/jackson-dataformats-text) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) ([source](https://github.com/FasterXML/jackson-databind)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.fasterxml.jackson.core:jackson-core](https://github.com/FasterXML/jackson-core) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.fasterxml.jackson:jackson-bom](https://github.com/FasterXML/jackson-bom) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.fasterxml.jackson.core:jackson-annotations](https://github.com/FasterXML/jackson) ([source](https://github.com/FasterXML/jackson-annotations)) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.17.2` -> `2.18.0` | | [com.google.auth:google-auth-library-oauth2-http](https://github.com/googleapis/google-auth-library-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.24.1` -> `1.27.0` | | [com.google.auth:google-auth-library-credentials](https://github.com/googleapis/google-auth-library-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.24.1` -> `1.27.0` | | [io.gitlab.arturbosch.detekt:detekt-test-utils](https://detekt.dev) ([source](https://github.com/detekt/detekt)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.23.6` -> `1.23.7` | | [io.gitlab.arturbosch.detekt:detekt-test](https://detekt.dev) ([source](https://github.com/detekt/detekt)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.23.6` -> `1.23.7` | | [io.gitlab.arturbosch.detekt:detekt-psi-utils](https://detekt.dev) ([source](https://github.com/detekt/detekt)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.23.6` -> `1.23.7` | | [io.gitlab.arturbosch.detekt:detekt-parser](https://detekt.dev) ([source](https://github.com/detekt/detekt)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.23.6` -> `1.23.7` | | [io.gitlab.arturbosch.detekt:detekt-gradle-plugin](https://detekt.dev) ([source](https://github.com/detekt/detekt)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.23.6` -> `1.23.7` | | [io.gitlab.arturbosch.detekt:detekt-api](https://detekt.dev) ([source](https://github.com/detekt/detekt)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.23.6` -> `1.23.7` | | [com.datadoghq:dd-trace-api](https://github.com/datadog/dd-trace-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.38.1` -> `1.39.1` | | [com.datadoghq:dd-trace-ot](https://github.com/datadog/dd-trace-java) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `1.38.1` -> `1.39.1` | | [software.amazon.awssdk:sdk-core](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.27.14` -> `2.28.11` | | [software.amazon.awssdk:dynamodb-enhanced](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.27.14` -> `2.28.11` | | [software.amazon.awssdk:dynamodb](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.27.14` -> `2.28.11` | | [software.amazon.awssdk:aws-core](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.27.14` -> `2.28.11` | | [software.amazon.awssdk:bom](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.27.14` -> `2.28.11` | | [software.amazon.awssdk:auth](https://aws.amazon.com/sdkforjava) | dependencies | misk/gradle/libs.versions.toml | gradle | minor | `2.27.14` -> `2.28.11` | | [com.amazonaws:aws-java-sdk-sqs](https://aws.amazon.com/sdkforjava) ([source](https://github.com/aws/aws-sdk-java)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.12.770` -> `1.12.772` | | [com.amazonaws:aws-java-sdk-s3](https://aws.amazon.com/sdkforjava) ([source](https://github.com/aws/aws-sdk-java)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.12.770` -> `1.12.772` | | [com.amazonaws:aws-java-sdk-dynamodb](https://aws.amazon.com/sdkforjava) ([source](https://github.com/aws/aws-sdk-java)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.12.770` -> `1.12.772` | | [com.amazonaws:aws-java-sdk-core](https://aws.amazon.com/sdkforjava) ([source](https://github.com/aws/aws-sdk-java)) | dependencies | misk/gradle/libs.versions.toml | gradle | patch | `1.12.770` -> `1.12.772` | --- > ⚠️ **Warning** > > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes <details> <summary>ThreeTen/threetenbp (org.threeten:threetenbp)</summary> ### [`v1.7.0`](https://github.com/ThreeTen/threetenbp/releases/tag/v1.7.0) See the [change notes](https://www.threeten.org/threetenbp/changes-report.html) for more information. </details> <details> <summary>pgjdbc/pgjdbc (org.postgresql:postgresql)</summary> ### [`v42.7.4`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4274-2024-08-22-080000--0400) ##### Added - chore: SCRAM dependency to 3.1 and support channel binding [PR #​3188](https://github.com/pgjdbc/pgjdbc/pull/3188) - chore: Add PostgreSQL 15, 16, and 17beta1 to CI tests [PR #​3299](https://github.com/pgjdbc/pgjdbc/pull/3299) - test: Update to 17beta3 [PR #​3308](https://github.com/pgjdbc/pgjdbc/pull/3308) - chore: Implement direct SSL ALPN connections [PR #​3252](https://github.com/pgjdbc/pgjdbc/pull/3252) - translation: Add Korean translation file [PR #​3276](https://github.com/pgjdbc/pgjdbc/pull/3276) ##### Fixed - fix: PgInterval ignores case for represented interval string [PR #​3344](https://github.com/pgjdbc/pgjdbc/pull/3344) - perf: Avoid extra copies when receiving int4 and int2 in PGStream [PR #​3295](https://github.com/pgjdbc/pgjdbc/pull/3295) - fix: Add support for Infinity::numeric values in ResultSet.getObject [PR #​3304](https://github.com/pgjdbc/pgjdbc/pull/3304) - fix: Ensure order of results for getDouble [PR #​3301](https://github.com/pgjdbc/pgjdbc/pull/3301) - perf: Replace BufferedOutputStream with unsynchronized PgBufferedOutputStream, allow configuring different Java and SO_SNDBUF buffer sizes [PR #​3248](https://github.com/pgjdbc/pgjdbc/pull/3248) - fix: Fix SSL tests [PR #​3260](https://github.com/pgjdbc/pgjdbc/pull/3260) - fix: Support bytea in preferQueryMode=simple [PR #​3243](https://github.com/pgjdbc/pgjdbc/pull/3243) - fix: Fix [#​3234](https://github.com/pgjdbc/pgjdbc/issues/3234) - Return -1 as update count for stored procedure calls [PR #​3235](https://github.com/pgjdbc/pgjdbc/pull/3235) - fix: Fix [#​3224](https://github.com/pgjdbc/pgjdbc/issues/3224) - conversion for TIME '24:00' to LocalTime breaks in binary-mode [PR #​3225](https://github.com/pgjdbc/pgjdbc/pull/3225) - perf: Speed up getDate by parsing bytes instead of String [PR #​3141](https://github.com/pgjdbc/pgjdbc/pull/3141) - fix: support PreparedStatement.setBlob(1, Blob) and PreparedStatement.setClob(1, Clob) for lobs that return -1 for length [PR #​3136](https://github.com/pgjdbc/pgjdbc/pull/3136) - fix: Validates resultset Params in PGStatement constructor. uses assertThro… [PR #​3171](https://github.com/pgjdbc/pgjdbc/pull/3171) - fix: Validates resultset parameters [PR #​3167](https://github.com/pgjdbc/pgjdbc/pull/3167) - docs: Replace greater to with greater than [PR #​3315](https://github.com/pgjdbc/pgjdbc/pull/3315) - docs: Clarify binaryTransfer and prepareThreshold [PR #​3338](https://github.com/pgjdbc/pgjdbc/pull/3338) - docs: use.md, typo [PR #​3314](https://github.com/pgjdbc/pgjdbc/pull/3314) - test: Use docker v2 which changes docker-compose to docker compose [#​3339](https://github.com/pgjdbc/pgjdbc/pull/3339) - refactor: Merge PgPreparedStatement#setBinaryStream int and long methods [PR #​3165](https://github.com/pgjdbc/pgjdbc/pull/3165) - test: Test both binaryMode=true,false when creating connections in DatabaseMetaDataTest [PR #​3231](https://github.com/pgjdbc/pgjdbc/pull/3231) - docs: Fixed typos in all source code and documentations [PR #​3242](https://github.com/pgjdbc/pgjdbc/pull/3242) - chore: Remove self-hosted runner [PR #​3227](https://github.com/pgjdbc/pgjdbc/pull/3227) - docs: Add cancelSignalTimeout in README [PR #​3190](https://github.com/pgjdbc/pgjdbc/pull/3190) - docs: Document READ_ONLY_MODE in README [PR #​3175](https://github.com/pgjdbc/pgjdbc/pull/3175) - test: Test for +/- infinity double values [PR #​3294](https://github.com/pgjdbc/pgjdbc/pull/3294) - test: Switch localhost and auth-test around for test-gss [PR #​3343](https://github.com/pgjdbc/pgjdbc/pull/3343) - fix: remove preDescribe from internalExecuteBatch [PR #​2883](https://github.com/pgjdbc/pgjdbc/pull/2883) ##### Deprecated - test: Deprecate all PostgreSQL versions older than 9.1 [PR #​3335](https://github.com/pgjdbc/pgjdbc/pull/3335) ### [`v42.7.3`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4273-2024-04-14-145100--0400) ##### Changed - chore: gradle config enforces 17+ [PR #​3147](https://github.com/pgjdbc/pgjdbc/pull/3147) ##### Fixed - fix: boolean types not handled in SimpleQuery mode [PR #​3146](https://github.com/pgjdbc/pgjdbc/pull/3146) - make sure we handle boolean types in simple query mode - support uuid as well - handle all well known types in text mode and change `else if` to `switch` - fix: released new versions of 42.2.29, 42.3.10, 42.4.5, 42.5.6, 42.6.2 to deal with `NoSuchMethodError on ByteBuffer#position` when running on Java 8 ### [`v42.7.2`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4272-2024-02-21-082300--0500) ##### Security - security: SQL Injection via line comment generation, it is possible in `SimpleQuery` mode to generate a line comment by having a placeholder for a numeric with a `-` such as `-?`. There must be second placeholder for a string immediately after. Setting the parameter to a -ve value creates a line comment. This has been fixed in this version fixes [CVE-2024-1597](https://www.cve.org/CVERecord?id=CVE-2024-1597). Reported by [Paul Gerste](https://github.com/paul-gerste-sonarsource). See the [security advisory](https://github.com/pgjdbc/pgjdbc/security/advisories/GHSA-24rp-q3w6-vc56) for more details. This has been fixed in versions 42.7.2, 42.6.1 42.5.5, 42.4.4, 42.3.9, 42.2.28.jre7. See the security advisory for work arounds. ##### Changed - fix: Use simple query for isValid. Using Extended query sends two messages checkConnectionQuery was never ever set or used, removed [PR #​3101](https://github.com/pgjdbc/pgjdbc/pull/3101) - perf: Avoid autoboxing bind indexes by [@​bokken](https://github.com/bokken) in [PR #​1244](https://github.com/pgjdbc/pgjdbc/pull/1244) - refactor: Document that encodePassword will zero out the password array, and remove driver's default encodePassword by [@​vlsi](https://github.com/vlsi) in [PR #​3084](https://github.com/pgjdbc/pgjdbc/pull/3084) ##### Added - feat: Add PasswordUtil for encrypting passwords client side [PR #​3082](https://github.com/pgjdbc/pgjdbc/pull/3082) ### [`v42.7.1`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4271-2023-12-06-083400--0500) ##### Changed - perf: improve performance of PreparedStatement.setBlob, BlobInputStream, and BlobOutputStream with dynamic buffer sizing [PR #​3044](https://github.com/pgjdbc/pgjdbc/pull/3044) ##### Fixed - fix: Apply connectTimeout before SSLSocket.startHandshake to avoid infinite wait in case the connection is broken [PR #​3040](https://github.com/pgjdbc/pgjdbc/pull/3040) - fix: support waffle-jna 2.x and 3.x by using reflective approach for ManagedSecBufferDesc [PR #​2720](https://github.com/pgjdbc/pgjdbc/pull/2720) Fixes [Issue #​2690](https://github.com/pgjdbc/pgjdbc/issues/2720). - fix: NoSuchMethodError on ByteBuffer#position When Running on Java 8 when accessing arrays, fixes [Issue #​3014](https://github.com/pgjdbc/pgjdbc/issues/3014) - Revert "[PR #​2925](https://github.com/pgjdbc/pgjdbc/pull/2925) Use canonical DateStyle name" [PR #​3035](https://github.com/pgjdbc/pgjdbc/pull/3035) Fixes [Issue #​3008](https://github.com/pgjdbc/pgjdbc/issues/3008) - Revert "[PR ##​2973](https://github.com/pgjdbc/pgjdbc/pull/2973) feat: support SET statements combining with other queries with semicolon in PreparedStatement" [PR #​3010](https://github.com/pgjdbc/pgjdbc/pull/3010) Fixes [Issue #​3007](https://github.com/pgjdbc/pgjdbc/issues/3007) - fix: avoid timezone conversions when sending LocalDateTime to the database [#​2852](https://github.com/pgjdbc/pgjdbc/pull/3010) Fixes [Issue #​1390](https://github.com/pgjdbc/pgjdbc/issues/1390) ,[Issue #​2850](https://github.com/pgjdbc/pgjdbc/issues/2850) Closes \[Issue [#​1391](https://github.com/pgjdbc/pgjdbc/issues/1391)(https://github.com/pgjdbc/pgjdbc/issues/1391) ### [`v42.7.0`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4270-2023-11-20-093300--0500) ##### Changed - fix: Deprecate for removal PGPoint.setLocation(java.awt.Point) to cut dependency to `java.desktop` module. [PR #​2967](https://github.com/pgjdbc/pgjdbc/pull/2967) - feat: return all catalogs for getCatalogs metadata query closes [ISSUE #​2949](https://github.com/pgjdbc/pgjdbc/issues/2949) [PR #​2953](https://github.com/pgjdbc/pgjdbc/pull/2953) - feat: support SET statements combining with other queries with semicolon in PreparedStatement [PR ##​2973](https://github.com/pgjdbc/pgjdbc/pull/2973) ##### Fixed - chore: add styleCheck Gradle task to report style violations [PR #​2980](https://github.com/pgjdbc/pgjdbc/pull/2980) - fix: Include currentXid in "Error rolling back prepared transaction" exception message [PR #​2978](https://github.com/pgjdbc/pgjdbc/pull/2978) - fix: add varbit as a basic type inside the TypeInfoCache [PR #​2960](https://github.com/pgjdbc/pgjdbc/pull/2960) - fix: Fix failing tests for version 16. [PR #​2962](https://github.com/pgjdbc/pgjdbc/pull/2962) - fix: allow setting arrays with ANSI type name [PR #​2952](https://github.com/pgjdbc/pgjdbc/pull/2952) - feat: Use KeepAlive to confirm LSNs [PR #​2941](https://github.com/pgjdbc/pgjdbc/pull/2941) - fix: put double ' around log parameter [PR #​2936](https://github.com/pgjdbc/pgjdbc/pull/2936) fixes [ISSUE #​2935](https://github.com/pgjdbc/pgjdbc/issues/2935) - fix: Fix Issue [#​2928](https://github.com/pgjdbc/pgjdbc/issues/2928) number of ports not equal to number of servers in datasource [PR #​2929](https://github.com/pgjdbc/pgjdbc/pull/2929) - fix: Use canonical DateStyle name ([#​2925](https://github.com/pgjdbc/pgjdbc/issues/2925)) fixes [pgbouncer issue](https://github.com/pgbouncer/pgbouncer/issues/776) - fix: Method getFastLong should be able to parse all longs [PR #​2881](https://github.com/pgjdbc/pgjdbc/pull/2881) - docs: Fix typos in info.html [PR #​2860](https://github.com/pgjdbc/pgjdbc/pull/2860) - fix: Return correct default from PgDatabaseMetaData.getDefaultTransactionIsolation [PR #​2992](https://github.com/pgjdbc/pgjdbc/pull/2992) fixes [Issue #​2991](https://github.com/pgjdbc/pgjdbc/issues/2991) - test: fix assertion in RefCursorFetchTestultFetchSize rows - test: use try-with-resources in LogicalReplicationStatusTest ### [`v42.6.0`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4260-2023-03-17-153434--0400) ##### Changed - fix: use PhantomReferences instead of `Obejct.finalize()` to track Connection leaks [PR #​2847](https://github.com/pgjdbc/pgjdbc/pull/2847) The change replaces all uses of Object.finalize with PhantomReferences. The leaked resources (Connections) are tracked in a helper thread that is active as long as there are connections in use. By default, the thread keeps running for 30 seconds after all the connections are released. The timeout is set with pgjdbc.config.cleanup.thread.ttl system property. - refactor:(loom) replace the usages of synchronized with ReentrantLock [PR #​2635](https://github.com/pgjdbc/pgjdbc/pull/2635) Fixes [Issue #​1951](https://github.com/pgjdbc/pgjdbc/issues/1951) ### [`v42.5.4`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4254-2023-02-15-102104--0500) ##### Fixed - fix: fix testGetSQLTypeQueryCache by searching for xid type. We used to search for box type but it is now cached. xid is not cached, this nuance is required for the test. - fix OidValueCorrectnessTest BOX_ARRAY OID, by adding BOX_ARRAY to the oidTypeName map \[PR [#​2810](https://github.com/pgjdbc/pgjdbc/issues/2810)]\((https://github.com/pgjdbc/pgjdbc/pull/2810). - fixes [Issue #​2804](https://github.com/pgjdbc/pgjdbc/issues/2804). - fix: Make sure that github CI runs tests on all [PRs #​2809](\(https://github.com/pgjdbc/pgjdbc/pull/2809\)). ### [`v42.5.3`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4253-2023-02-03-082450--0500) ##### Fixed - fix: Add box to TypeInfoCache, fixes [Issue #​2746](https://github.com/pgjdbc/pgjdbc/issues/2746) [PR #​2747](https://github.com/pgjdbc/pgjdbc/pull/2747) - fix: regression in PgResultSet LONG_MIN copy and paste error fixes [Issue #​2748](https://github.com/pgjdbc/pgjdbc/issues/2748) [PR#2749](https://github.com/pgjdbc/pgjdbc/pull/2749) ### [`v42.5.2`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4252-2023-01-31-143046--0500) ##### Changed - regression: This release has 2 known regressions which make it unusable see the notes above. We advise people to use 42.5.3 instead. - docs: specify that timeouts are in seconds and there is a maximum. Housekeeping on some tests fixes [#Issue 2671](https://github.com/pgjdbc/pgjdbc/issues/2671) [PR #​2686](https://github.com/pgjdbc/pgjdbc/pull/2686) - docs: clarify binaryTransfer and add it to README [PR# 2698](https://github.com/pgjdbc/pgjdbc/pull/2698) - docs: Document the need to encode reserved characters in the connection URL [PR #​2700](https://github.com/pgjdbc/pgjdbc/pull/2700) - feat: Define binary transfer for custom types dynamically/automatically fixes [Issue #​2554](https://github.com/pgjdbc/pgjdbc/issues/2554) [PR #​2556](https://github.com/pgjdbc/pgjdbc/pull/2556) ##### Added - fix: added gssResponseTimeout as part of [PR #​2687](https://github.com/pgjdbc/pgjdbc/pull/2687) to make sure we don't wait forever on a GSS RESPONSE ##### Fixed - fix: Ensure case of XML tags in Maven snippet is correct [PR #​2682](https://github.com/pgjdbc/pgjdbc/pull/2682) - fix: Make sure socket is closed if an exception is thrown in createSocket fixes [Issue #​2684](https://github.com/pgjdbc/pgjdbc/issues/2684) [PR #​2685](https://github.com/pgjdbc/pgjdbc/pull/2685) - fix: Apply patch from [Issue #​2683](https://github.com/pgjdbc/pgjdbc/issues/2683) to fix hanging ssl connections [PR #​2687](https://github.com/pgjdbc/pgjdbc/pull/2687) - fix - binary conversion of (very) long numeric values (longer than 4 \* 2^15 digits) [PR #​2697](https://github.com/pgjdbc/pgjdbc/pull/2697) fixes [Issue #​2695](https://github.com/pgjdbc/pgjdbc/issues/2695) - minor: enhance readability connection of startup params [PR #​2705](https://github.com/pgjdbc/pgjdbc/pull/2785) ### [`v42.5.1`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4251-2022-11-23-101459--0500) ##### Security - security: StreamWrapper spills to disk if setText, or setBytea sends very large Strings or arrays to the server. createTempFile creates a file which can be read by other users on unix like systems (Not macos). This has been fixed in this version fixes CVE-2022-41946 see the [security advisory](https://github.com/pgjdbc/pgjdbc/security/advisories/GHSA-562r-vg33-8x8h) for more details. Reported by [Jonathan Leitschuh](https://github.com/JLLeitschuh) This has been fixed in versions 42.5.1, 42.4.3 42.3.8, 42.2.27.jre7. Note there is no fix for 42.2.26.jre6. See the security advisory for work arounds. ##### Fixed - fix: make sure we select array_in from pg_catalog to avoid duplicate array_in functions fixes [#Issue 2548](https://github.com/pgjdbc/pgjdbc/issues/2548) [PR #​2552](https://github.com/pgjdbc/pgjdbc/issues/2552) - fix: binary decoding of bool values [PR #​2640](https://github.com/pgjdbc/pgjdbc/pull/2640) - perf: improve performance of PgResultSet getByte/getShort/getInt/getLong for float-typed columns [PR #​2634](https://github.com/pgjdbc/pgjdbc/pull/2634) - chore: fix various spelling errors [PR #​2592](https://github.com/pgjdbc/pgjdbc/pull/2592) - chore: Feature/urlparser improve URLParser [PR #​2641](https://github.com/pgjdbc/pgjdbc/pull/2592) ### [`v42.5.0`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4250-2022-08-23-112011--0400) ##### Changed - fix: revert change in [PR #​1986](https://github.com/pgjdbc/pgjdbc/pull/1986) where float was aliased to float4 from float8. float now aliases to float8 [PR #​2598](https://github.com/pgjdbc/pgjdbc/pull/2598) fixes [Issue #​2597](https://github.com/pgjdbc/pgjdbc/issues/2597) ### [`v42.4.2`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4242-2022-08-17-103340--0400) ##### Changed - fix: add alias to the generated getUDT() query for clarity (PR [#​2553](https://github.com/pgjdbc/pgjdbc/issues/2553))\[https://github.com/pgjdbc/pgjdbc/pull/2553] ##### Added - fix: make setObject accept UUID array [PR #​2587](https://github.com/pgjdbc/pgjdbc/pull/2587) ##### Fixed - fix: regression with GSS. Changes introduced to support building with Java 17 caused failures [Issue #​2588](https://github.com/pgjdbc/pgjdbc/issues/2588) - fix: set a timeout to get the return from requesting SSL upgrade. [PR #​2572](https://github.com/pgjdbc/pgjdbc/pull/2572) - feat: synchronize statement executions (e.g. avoid deadlock when Connection.isValid is executed from concurrent threads) ### [`v42.4.1`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4241-2022-08-01-162420--0400) ##### Security - fix: CVE-2022-31197 Fixes SQL generated in PgResultSet.refresh() to escape column identifiers so as to prevent SQL injection. - Previously, the column names for both key and data columns in the table were copied as-is into the generated SQL. This allowed a malicious table with column names that include statement terminator to be parsed and executed as multiple separate commands. - Also adds a new test class ResultSetRefreshTest to verify this change. - Reported by [Sho Kato](https://github.com/kato-sho) ##### Changed - chore: skip publishing pgjdbc-osgi-test to Central - chore: bump Gradle to 7.5 - test: update JUnit to 5.8.2 ##### Added - chore: added Gradle Wrapper Validation for verifying gradle-wrapper.jar - chore: added "permissions: contents: read" for GitHub Actions to avoid unintentional modifications by the CI - chore: support building pgjdbc with Java 17 - feat: synchronize statement executions (e.g. avoid deadlock when Connection.isValid is executed from concurrent threads) ### [`v42.4.0`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#4240-2022-06-09-081402--0400) ##### Changed - fix: added GROUP_STARTUP_PARAMETERS boolean property to determine whether or not to group startup parameters in a transaction (default=false like 42.2.x) fixes [Issue #​2425](https://github.com/pgjdbc/pgjdbc/issues/2497) pgbouncer cannot deal with transactions in statement pooling mode [PR #​2425](https://github.com/pgjdbc/pgjdbc/pull/2425) ##### Fixed - fix: queries with up to 65535 (inclusive) parameters are supported now (previous limit was 32767) [PR #​2525](https://github.com/pgjdbc/pgjdbc/pull/2525), [Issue #​1311](https://github.com/pgjdbc/pgjdbc/issues/1311) - fix: workaround JarIndex parsing issue by using groupId/artifactId-version directory namings. Regression since 42.2.13. [PR #​2531](https://github.com/pgjdbc/pgjdbc/pull/2531), [issue #​2527](https://github.com/pgjdbc/pgjdbc/issues/2527) - fix: use Locale.ROOT for toUpperCase() toLowerCase() calls - doc: add Vladimir Sitnikov's PGP key - fix: return correct base type for domain from getUDTs [PR #​2520](https://github.com/pgjdbc/pgjdbc/pull/2520) [Issue #​2522](https://github.com/pgjdbc/pgjdbc/issues/2522) - perf: utcTz static and renamed to UTC_TIMEZONE [PR #​2519](https://github.com/pgjdbc/pgjdbc/pull/2520) - doc: fix release version for [#​2377](https://github.com/pgjdbc/pgjdbc/issues/2377) (it should be 42.3.6, not 42.3.5) </details> <details> <summary>square/okio (com.squareup.okio:okio)</summary> ### [`v3.9.1`](https://github.com/square/okio/blob/HEAD/CHANGELOG.md#Version-391) *2024-09-12* - Fix: Support paths containing a single dot (".") in `Path.relativeTo`. - Fix: Do not read from the upstream source when a 0-byte read is requested. - Fix: Update kotlinx.datetime to 0.6.0 to correct a Gradle module metadata problem with 0.5.0. Note: this artifact is only used in 'okio-fakefilesystem' and 'okio-nodefilesystem' and not in the Okio core. </details> <details> <summary>mockito/mockito (org.mockito:mockito-core)</summary> ### [`v5.14.1`](https://github.com/mockito/mockito/releases/tag/v5.14.1) <sup><sup>*Changelog generated by [Shipkit Changelog Gradle Plugin](https://github.com/shipkit/shipkit-changelog)*</sup></sup> ##### 5.14.1 - 2024-09-30 - [2 commit(s)](https://github.com/mockito/mockito/compare/v5.14.0...v5.14.1) by Brice Dutheil, dependabot\[bot] - fix: gradle mockitoAgent configuration should not be transitive [(#​3454)](https://github.com/mockito/mockito/pull/3454) - Bump bytebuddy from 1.15.2 to 1.15.3 [(#​3452)](https://github.com/mockito/mockito/pull/3452) - Allow for installing a Java agent within the Mockito jar, without exposing Byte Buddy's attach mechanism. [(#​3437)](https://github.com/mockito/mockito/pull/3437) ### [`v5.14.0`](https://github.com/mockito/mockito/releases/tag/v5.14.0) <sup><sup>*Changelog generated by [Shipkit Changelog Gradle Plugin](https://github.com/shipkit/shipkit-changelog)*</sup></sup> ##### 5.14.0 - 2024-09-27 - [9 commit(s)](https://github.com/mockito/mockito/compare/v5.13.0...v5.14.0) by Ali-Hassan, Brice Dutheil, David Saff, Rafael Winterhalter, dependabot\[bot] - Bump org.junit.platform:junit-platform-launcher from 1.11.0 to 1.11.1 [(#​3451)](https://github.com/mockito/mockito/pull/3451) - Bump bytebuddy from 1.15.1 to 1.15.2 [(#​3450)](https://github.com/mockito/mockito/pull/3450) - Update Documentation of ArgumentCaptor.java [(#​3448)](https://github.com/mockito/mockito/pull/3448) - Split subprojects [(#​3447)](https://github.com/mockito/mockito/pull/3447) - Separate extensions from integration tests [(#​3443)](https://github.com/mockito/mockito/issues/3443) - Bump org.eclipse.platform:org.eclipse.osgi from 3.20.0 to 3.21.0 [(#​3440)](https://github.com/mockito/mockito/pull/3440) - Bump com.gradle.enterprise from 3.18 to 3.18.1 [(#​3439)](https://github.com/mockito/mockito/pull/3439) - Allow for installing a Java agent within the Mockito jar, without exposing Byte Buddy's attach mechanism. [(#​3437)](https://github.com/mockito/mockito/pull/3437) - Bump bytebuddy from 1.15.0 to 1.15.1 [(#​3434)](https://github.com/mockito/mockito/pull/3434) - Fixes [#​3419](https://github.com/mockito/mockito/issues/3419): Disable mocks with an error message [(#​3424)](https://github.com/mockito/mockito/pull/3424) - Accessing a mock after clearInlineMocks could provide much more useful error message. [(#​3419)](https://github.com/mockito/mockito/issues/3419) </details> <details> <summary>Kotlin/kotlinx.coroutines (org.jetbrains.kotlinx:kotlinx-coroutines-core)</summary> ### [`v1.9.0`](https://github.com/Kotlin/kotlinx.coroutines/blob/HEAD/CHANGES.md#Version-190) [Compare Source](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.1...1.9.0) ##### Features - Wasm/WASI target support ([#​4064](https://github.com/Kotlin/kotlinx.coroutines/issues/4064)). Thanks, [@​igoriakovlev](https://github.com/igoriakovlev)! - `limitedParallelism` now optionally accepts the name of the dispatcher view for easier debugging ([#​4023](https://github.com/Kotlin/kotlinx.coroutines/issues/4023)). - No longer initialize `Dispatchers.IO` on the JVM when other standard dispatchers are accessed ([#​4166](https://github.com/Kotlin/kotlinx.coroutines/issues/4166)). Thanks, [@​metalhead8816](https://github.com/metalhead8816)! - Introduced the `Flow<T>.chunked(size: Int): Flow<List<T>>` operator that groups emitted values into groups of the given size ([#​1290](https://github.com/Kotlin/kotlinx.coroutines/issues/1290)). - Closeable dispatchers are instances of `AutoCloseable` now ([#​4123](https://github.com/Kotlin/kotlinx.coroutines/issues/4123)). ##### Fixes - Calling `hasNext` on a `Channel`'s iterator is idempotent ([#​4065](https://github.com/Kotlin/kotlinx.coroutines/issues/4065)). Thanks, [@​gitpaxultek](https://github.com/gitpaxultek)! - `CoroutineScope()` created without an explicit dispatcher uses `Dispatchers.Default` on Native ([#​4074](https://github.com/Kotlin/kotlinx.coroutines/issues/4074)). Thanks, [@​whyoleg](https://github.com/whyoleg)! - Fixed a bug that prevented non-Android `Dispatchers.Main` from initializing when the Firebase dependency is used ([#​3914](https://github.com/Kotlin/kotlinx.coroutines/issues/3914)). - Ensured a more intuitive ordering of tasks in `runBlocking` ([#​4134](https://github.com/Kotlin/kotlinx.coroutines/issues/4134)). - Forbid casting a `Mutex` to `Semaphore` ([#​4176](https://github.com/Kotlin/kotlinx.coroutines/issues/4176)). - Worked around a stack overflow that may occur when calling `asDeferred` on a `Future` many times ([#​4156](https://github.com/Kotlin/kotlinx.coroutines/issues/4156)). ##### Deprecations and promotions - Advanced the deprecation levels for `BroadcastChannel`-based API ([#​4197](https://github.com/Kotlin/kotlinx.coroutines/issues/4197)). - Advanced the deprecation levels for the old `kotlinx-coroutines-test` API ([#​4198](https://github.com/Kotlin/kotlinx.coroutines/issues/4198)). - Deprecated `Job.cancelFutureOnCompletion` ([#​4173](https://github.com/Kotlin/kotlinx.coroutines/issues/4173)). - Promoted `CoroutineDispatcher.limitedParallelism` to stable ([#​3864](https://github.com/Kotlin/kotlinx.coroutines/issues/3864)). - Promoted `CoroutineStart.ATOMIC` from `ExperimentalCoroutinesApi` to `DelicateCoroutinesApi` ([#​4169](https://github.com/Kotlin/kotlinx.coroutines/issues/4169)). - Promoted `CancellableContinuation.resume` with an `onCancellation` lambda to stable, providing extra arguments to the lambda ([#​4088](https://github.com/Kotlin/kotlinx.coroutines/issues/4088)). - Marked the classes and interfaces that are not supposed to be inherited from with the new `InternalForInheritanceCoroutinesApi` opt-in ([#​3770](https://github.com/Kotlin/kotlinx.coroutines/issues/3770)). - Marked the classes and interfaces inheriting from which is not stable with the new `ExperimentalForInheritanceCoroutinesApi` opt-in ([#​3770](https://github.com/Kotlin/kotlinx.coroutines/issues/3770)). ##### Other - Kotlin was updated to 2.0 ([#​4137](https://github.com/Kotlin/kotlinx.coroutines/issues/4137)). - Reworked the documentation for `CoroutineStart` and `Channel`-based API ([#​4147](https://github.com/Kotlin/kotlinx.coroutines/issues/4147), [#​4148](https://github.com/Kotlin/kotlinx.coroutines/issues/4148), [#​4167](https://github.com/Kotlin/kotlinx.coroutines/issues/4167)). Thanks, [@​globsterg](https://github.com/globsterg)! - Simplified the internal implementation of `Job` ([#​4053](https://github.com/Kotlin/kotlinx.coroutines/issues/4053)). - Small tweaks, fixes, and documentation improvements. </details> <details> <summary>redis/jedis (redis.clients:jedis)</summary> ### [`v5.2.0`](https://github.com/redis/jedis/releases/tag/v5.2.0): 5.2.0 GA #### Enhanced Client-side caching We are happy to announce that improved [server-assisted, client-side caching](https://redis.io/docs/manual/client-side-caching/) is now generally available! Special thanks to all our beta testers for their valuable feedback, which helped us refine and improve the initial implementation. Client-side caching is supported exclusively with the RESP3 protocol with Redis >= 7.4 and is available in UnifiedJedis, JedisPooled, and JedisCluster and other classes. ##### How to try Client-Side Caching 1. [Install Jedis](https://redis.io/docs/connect/clients/java/jedis/#install) **5.2.0** 2. Use the following code example to get started: ```java public class CSCExampleTest { public static void main() { HostAndPort node = HostAndPort.from("localhost:6379"); JedisClientConfig clientConfig = DefaultJedisClientConfig.builder() .resp3() // RESP3 protocol is required for client-side caching //.user("myuser") // Redis server username (optional) //.password("mypass") // Redis user's password (optional) .build(); CacheConfig cacheConfig = getCacheConfig(); Cache cache = CacheFactory.getCache(cacheConfig); try (UnifiedJedis client = new UnifiedJedis(node, clientConfig, cache)) { client.set("foo", "bar"); client.get("foo"); client.get("foo"); // Cache hit System.out.println("Cache size: " + cache.getSize()); // 1 System.out.println(cache.getStats().toString()); //Let's change the value of "foo" to invalidate the value stored in the local cache client.mset("foo", "new_value", "ignore_me:1", "another_value"); Thread.sleep(1000); // wait for the cache invalidation to happen System.out.println(client.get("foo")); // Cache miss System.out.println(cache.getStats().toString()); client.get("ignore_me:1"); // Client will ignore this key System.out.println("Cache size: " + cache.getSize()); // still 1 // check the cache stats System.out.println(cache.getStats().toString()); } catch (InterruptedException e) { throw new RuntimeException(e); } } private static CacheConfig getCacheConfig() { // This is a simple cacheable implementation that ignores keys starting with "ignore_me" Cacheable cacheable = new DefaultCacheable() { final String IGNORE_PREFIX = "ignore_me"; @​Override public boolean isCacheable(ProtocolCommand command, List<Object> keys) { // assuming we'll only execute methods with string keys List<String> stringKeys = keys.stream() .filter(obj -> obj instanceof String) .map(obj -> (String) obj) .collect(Collectors.toList()); for (String key : stringKeys) { if (key.startsWith(IGNORE_PREFIX)) { return false; } } return isDefaultCacheableCommand(command); } }; // Create a cache with a maximum size of 10000 entries return CacheConfig.builder() .maxSize(10000) .cacheable(cacheable) .build(); } } ``` It is possible to limit or ignore commands or keys for client-side caching. The `getCacheConfig` method presented above provides an example of how to achieve that. #### 🔥 Breaking Changes - JedisConnectionException contains HostAndPort from DefaultJedisSocketFactory ([#​3896](https://github.com/redis/jedis/issues/3896)) - Address change in JSON.GET command without path ([#​3858](https://github.com/redis/jedis/issues/3858)) - Modify and fail-fast GeoSearchParam ([#​3827](https://github.com/redis/jedis/issues/3827)) - Support transaction from UnifiedJedis without calling multi first ([#​3804](https://github.com/redis/jedis/issues/3804)) - Reduce the log level of validateObject to WARN ([#​3750](https://github.com/redis/jedis/issues/3750)) #### 🧪 Experimental Features - Support automatic namespacing ([#​3781](https://github.com/redis/jedis/issues/3781)) - Added support for ADDSCORES argument in FT.AGGREGATE ([#​3908](https://github.com/redis/jedis/issues/3908)) - Support IGNORE and other optional arguments for timeseries commands ([#​3860](https://github.com/redis/jedis/issues/3860)) #### 🚀 New Features - Support Hash field expiration ([#​3826](https://github.com/redis/jedis/issues/3826)) - Add equals and hashCode to Timeseries Params classes ([#​3959](https://github.com/redis/jedis/issues/3959)) - Decoding FT.SEARCH reply can be disabled at field level ([#​3926](https://github.com/redis/jedis/issues/3926)) - Get enriched Connection information ([#​3745](https://github.com/redis/jedis/issues/3745)) - Support execute the read-only command on replica nodes ([#​3848](https://github.com/redis/jedis/issues/3848)) - JedisConnectionException contains HostAndPort from DefaultJedisSocketFactory ([#​3896](https://github.com/redis/jedis/issues/3896)) - Support \[S]PUBLISH in pipelines and transactions ([#​3859](https://github.com/redis/jedis/issues/3859)) - Support Hash field expiration ([#​3826](https://github.com/redis/jedis/issues/3826)) - Custom connection pool to MultiClusterPooledConnectionProvider ([#​3801](https://github.com/redis/jedis/issues/3801)) - PubSub handle array of messages for RESP2 ([#​3811](https://github.com/redis/jedis/issues/3811)) - Support transaction from UnifiedJedis without calling multi first ([#​3804](https://github.com/redis/jedis/issues/3804)) - Add last entry id for XREADs and support XREADs reply as map ([#​3791](https://github.com/redis/jedis/issues/3791)) - Add Experimental, Internal and VisibleForTesting annotations ([#​3790](https://github.com/redis/jedis/issues/3790)) - Implement equals and hashcode in Params classes ([#​3728](https://github.com/redis/jedis/issues/3728)) - Add support for redis command: CLIENT TRACKINGINFO ([#​3751](https://github.com/redis/jedis/issues/3751)) - Support the MAXAGE option for CLIENT KILL ([#​3754](https://github.com/redis/jedis/issues/3754)) - Polish [#​3741](https://github.com/redis/jedis/issues/3741) ([#​3746](https://github.com/redis/jedis/issues/3746)) - Add support for the NOVALUES option of HSCAN ([#​3741](https://github.com/redis/jedis/issues/3741)) - Support issuing Latency commands ([#​3729](https://github.com/redis/jedis/issues/3729)) #### 🐛 Bug Fixes - Accept null replies for BZPOPMAX and BZPOPMIN commands ([#​3930](https://github.com/redis/jedis/issues/3930)) - Fix empty LUA table reply ([#​3924](https://github.com/redis/jedis/issues/3924)) - Ensure closing connection in Pipeline ([#​3865](https://github.com/redis/jedis/issues/3865)) - Address change in JSON.GET command without path ([#​3858](https://github.com/redis/jedis/issues/3858)) - Consider null values in empty StreamPendingSummary ([#​3793](https://github.com/redis/jedis/issues/3793)) - Fix UnifiedJedis pexpireAt glitch ([#​3782](https://github.com/redis/jedis/issues/3782)) - Use expiryOption in PipelineBase.expireAt ([#​3777](https://github.com/redis/jedis/issues/3777)) - Stop connection fetching before sync/exec ([#​3756](https://github.com/redis/jedis/issues/3756)) - Check for thread interrupt in subscribe process of PubSub ([#​3726](https://github.com/redis/jedis/issues/3726)) - Avoid NPE in MultiNodePipelineBase.java ([#​3697](https://github.com/redis/jedis/issues/3697)) - Fix probable missing (RESP3) protocol processing ([#​3692](https://github.com/redis/jedis/issues/3692)) - Use circuit breaker fallback exception list ([#​3664](https://github.com/redis/jedis/issues/3664)) #### 🧰 Maintenance - Deprecate Triggers and Functions feature ([#​3968](https://github.com/redis/jedis/issues/3968)) - Bump org.apache.httpcomponents.client5:httpclient5-fluent from 5.3.1 to 5.4 ([#​3962](https://github.com/redis/jedis/issues/3962)) - Bump org.apache.maven.plugins:maven-surefire-plugin from 3.3.1 to 3.5.0 ([#​3950](https://github.com/redis/jedis/issues/3950)) - Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.8.0 to 3.10.0 ([#​3949](https://github.com/redis/jedis/issues/3949)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.5 to 3.2.6 ([#​3957](https://github.com/redis/jedis/issues/3957)) - Added JavaDoc for basic JedisCluster constructors ([#​3304](https://github.com/redis/jedis/issues/3304)) - Bump org.locationtech.jts:jts-core from 1.19.0 to 1.20.0 ([#​3948](https://github.com/redis/jedis/issues/3948)) - Add A-A failover scenario test ([#​3935](https://github.com/redis/jedis/issues/3935)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.4 to 3.2.5 ([#​3936](https://github.com/redis/jedis/issues/3936)) - Fix codecov upload ([#​3933](https://github.com/redis/jedis/issues/3933)) - Rename readonly config param to specify Redis Cluster ([#​3932](https://github.com/redis/jedis/issues/3932)) - Modify Connection.toIdentityString and test ([#​3931](https://github.com/redis/jedis/issues/3931)) - Revert "Creating CODEOWNERS for the examples ([#​3570](https://github.com/redis/jedis/issues/3570))" ([#​3897](https://github.com/redis/jedis/issues/3897)) - Bump org.apache.maven.plugins:maven-surefire-plugin from 3.2.5 to 3.3.1 ([#​3891](https://github.com/redis/jedis/issues/3891)) - Bump org.hamcrest:hamcrest from 2.2 to 3.0 ([#​3914](https://github.com/redis/jedis/issues/3914)) - Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.7.0 to 3.8.0 ([#​3909](https://github.com/redis/jedis/issues/3909)) - Bump net.javacrumbs.json-unit:json-unit from 2.38.0 to 2.40.1 ([#​3903](https://github.com/redis/jedis/issues/3903)) - Bump org.apache.maven.plugins:maven-release-plugin from 3.0.1 to 3.1.1 ([#​3890](https://github.com/redis/jedis/issues/3890)) - Fixed typo in Javadoc ([#​3917](https://github.com/redis/jedis/issues/3917)) - Bump org.apache.maven.plugins:maven-jar-plugin from 3.4.1 to 3.4.2 ([#​3910](https://github.com/redis/jedis/issues/3910)) - Bump com.kohlschutter.junixsocket:junixsocket-core from 2.9.1 to 2.10.0 ([#​3901](https://github.com/redis/jedis/issues/3901)) - Bump jackson.version from 2.17.1 to 2.17.2 ([#​3902](https://github.com/redis/jedis/issues/3902)) - Add Scenario tests ([#​3847](https://github.com/redis/jedis/issues/3847)) - Modify the judgment that reads a response as empty to isEmpty method ([#​3888](https://github.com/redis/jedis/issues/3888)) - Replace `synchronized` with `j.u.c.l.ReentrantLock` for Loom ([#​3480](https://github.com/redis/jedis/issues/3480)) - Extract messages of unsupported exception as constants ([#​3887](https://github.com/redis/jedis/issues/3887)) - Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.6.3 to 3.7.0 ([#​3851](https://github.com/redis/jedis/issues/3851)) - Bump org.sonatype.plugins:nexus-staging-maven-plugin from 1.6.13 to 1.7.0 ([#​3850](https://github.com/redis/jedis/issues/3850)) - Bump com.google.code.gson:gson from 2.10.1 to 2.11.0 ([#​3842](https://github.com/redis/jedis/issues/3842)) - Merge doc tests into main branch to keep in-sync with the code ([#​3861](https://github.com/redis/jedis/issues/3861)) - Deprecate unused Set<Tuple> builders ([#​3857](https://github.com/redis/jedis/issues/3857)) - Disable Redis Graph tests ([#​3856](https://github.com/redis/jedis/issues/3856)) - Introduce EndpointConfig and load endpoint settings from the endpoints.json file ([#​3836](https://github.com/redis/jedis/issues/3836)) - Address Gears test fail - Cleanup Function libraries ([#​3840](https://github.com/redis/jedis/issues/3840)) - Bump jackson.version from 2.17.0 to 2.17.1 ([#​3833](https://github.com/redis/jedis/issues/3833)) - Add methods in CommandArguments and RawableFactory ([#​3834](https://github.com/redis/jedis/issues/3834)) - Modify and fail-fast GeoSearchParam ([#​3827](https://github.com/redis/jedis/issues/3827)) - Bump org.apache.maven.plugins:maven-jar-plugin from 3.4.0 to 3.4.1 ([#​3822](https://github.com/redis/jedis/issues/3822)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.3 to 3.2.4 ([#​3823](https://github.com/redis/jedis/issues/3823)) - Bump org.apache.maven.plugins:maven-jar-plugin from 3.3.0 to 3.4.0 ([#​3819](https://github.com/redis/jedis/issues/3819)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.2 to 3.2.3 ([#​3818](https://github.com/redis/jedis/issues/3818)) - Add more tests for the CommandObjects class ([#​3809](https://github.com/redis/jedis/issues/3809)) - Resolve compile warnings ([#​3810](https://github.com/redis/jedis/issues/3810)) - Bump com.kohlschutter.junixsocket:junixsocket-core from 2.9.0 to 2.9.1 ([#​3806](https://github.com/redis/jedis/issues/3806)) - Bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12 ([#​3805](https://github.com/redis/jedis/issues/3805)) - Bump org.apache.maven.plugins:maven-source-plugin from 3.3.0 to 3.3.1 ([#​3807](https://github.com/redis/jedis/issues/3807)) - Deprecate unused JSON.ARRAPPEND in CommandObjects ([#​3798](https://github.com/redis/jedis/issues/3798)) - Extensive unit tests for the CommandObjects class ([#​3796](https://github.com/redis/jedis/issues/3796)) - Add extensive tests for UnifiedJedis ([#​3788](https://github.com/redis/jedis/issues/3788)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.1 to 3.2.2 ([#​3794](https://github.com/redis/jedis/issues/3794)) - Add Experimental, Internal and VisibleForTesting annotations ([#​3790](https://github.com/redis/jedis/issues/3790)) - Add TS.INFO \[DEGUB] and CF.MEXISTS in pipelined commands ([#​3787](https://github.com/redis/jedis/issues/3787)) - Bump org.apache.maven.plugins:maven-compiler-plugin from 3.12.1 to 3.13.0 ([#​3786](https://github.com/redis/jedis/issues/3786)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.0 to 3.2.1 ([#​3785](https://github.com/redis/jedis/issues/3785)) - Pipelined tests for lists and sets, and API typo fix ([#​3772](https://github.com/redis/jedis/issues/3772)) - Extensive unit tests for PipeliningBase ([#​3778](https://github.com/redis/jedis/issues/3778)) - Bump jackson.version from 2.16.2 to 2.17.0 ([#​3776](https://github.com/redis/jedis/issues/3776)) - Bump org.apache.maven.plugins:maven-gpg-plugin from 3.1.0 to 3.2.0 ([#​3775](https://github.com/redis/jedis/issues/3775)) - Fix typo in SetPipelineCommands method name ([#​3773](https://github.com/redis/jedis/issues/3773)) - Streamline test execution ([#​3760](https://github.com/redis/jedis/issues/3760)) - Add pipelined tests for sorted sets ([#​3771](https://github.com/redis/jedis/issues/3771)) - Geo pipelined tests ([#​3767](https://github.com/redis/jedis/issues/3767)) - Reenable clustering tests ([#​3764](https://github.com/redis/jedis/issues/3764)) - GETSET command is deprecated since Redis 6.2.0 ([#​3768](https://github.com/redis/jedis/issues/3768)) - Add tests for Stream pipelined commands ([#​3763](https://github.com/redis/jedis/issues/3763)) - Bump jackson.version from 2.16.1 to 2.16.2 ([#​3762](https://github.com/redis/jedis/issues/3762)) - Bump org.json:json from [`2024020`](https://github.com/redis/jedis/commit/20240205) to [`2024030`](https://github.com/redis/jedis/commit/20240303) ([#​3752](https://github.com/redis/jedis/issues/3752)) - Add Hashes pipeline commands unit tests ([#​3288](https://github.com/redis/jedis/issues/3288)) - Add unit tests for pipelining - migrate and db commands ([#​3759](https://github.com/redis/jedis/issues/3759)) - Reduce the log level of validateObject to WARN ([#​3750](https://github.com/redis/jedis/issues/3750)) - Bump org.json:json from [`2023101`](https://github.com/redis/jedis/commit/20231013) to [`2024020`](https://github.com/redis/jedis/commit/20240205) ([#​3706](https://github.com/redis/jedis/issues/3706)) - Bump com.kohlschutter.junixsocket:junixsocket-core from 2.8.3 to 2.9.0 ([#​3724](https://github.com/redis/jedis/issues/3724)) - Running doctests also on emb-examples ([#& </details> GitOrigin-RevId: 8a275b1c484ffdcd889591afa909c0ac94f02667
This is
Wasm-WASI
target support for coroutines.This is based on self-written
EventLoop
which has a simple implementation for queued line of callbacks with timeouts.This allows to schedule tasks in scheduler. The
EventLoop
starts on the program entry-point exit (that supported by the Kotlin from 1.9.23).The coroutine tests runner implemented with a direct
EventLoop
call so that looks like theRunBlocking
inNative
orJVM
implementation. We do notRunBlocking
itself because there is no design for it in single-threaded environments.The
EventLoop
throws an exceptionEventLoopException
which is discussable because it is not supposed to be catched by user in normal code (but still possible for therunTest
calls).