Skip to content
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

Stabilize CoroutineDispatcher.limitedParallelism #3864

Closed
5 tasks done
qwwdfsad opened this issue Aug 28, 2023 · 15 comments
Closed
5 tasks done

Stabilize CoroutineDispatcher.limitedParallelism #3864

qwwdfsad opened this issue Aug 28, 2023 · 15 comments
Assignees

Comments

@qwwdfsad
Copy link
Contributor

qwwdfsad commented Aug 28, 2023

In general, we received mostly positive feedback about the API shape, and there is no reason to keep it experimental any further.

Few things to address during stabilization:

  • Ensure that doc explicitly states that it limits parallelism and not the number of threads (e.g. limitedParallelism(1) does not re-use the same thread all the time)
  • Ensure that CoroutineContext in dispatch is either transparent or that it can be transparent to the underlying dispatcher to control scheduling tweaks
  • Document isDispatchNeeded and unconfined-like behaviour for limited parallelism
  • Mention limitedParallelism(1) properties
  • Consider Ability to specify a limited dispatcher name #4023
@dovchinnikov
Copy link
Contributor

Since I've started to advertise limitedParallelism is IJ codebase, I see misunderstanding of Dispatchers.IO elasticity:
it's not consistent with other dispatchers, and it raises questions, and I have to direct people to the doc.

I'm afraid that this inconsistency will quickly become a gotcha. I think in the long run it's better to expose the internal unbounded dispatcher since it's already available via Dispatchers.IO.limitedParallelism(Int.MAX_VALUE), and then make Dispatchers.IO.limitedParallelism non-"elastic" for consistency with other dispatchers.

(It also feels like the inconsistency exists only for the sake of API beautification, I hope I'm wrong here, correct me, please)

@elizarov
Copy link
Contributor

Can you be more specific, please, about the gotchas with Dispatchers.IO that you are worried about.

@qwwdfsad qwwdfsad reopened this Sep 20, 2023
@qwwdfsad
Copy link
Contributor Author

(It also feels like the inconsistency exists only for the sake of API beautification, I hope I'm wrong here, correct me, please)

One more reason to move towards public design notes, because I'm going to reiterate ours 😅

Initially, Dispatchers.IO was no different from any other dispatchers.

The design of Dispatchers.IO is straightforward -- it has an arbitrary large (64, but the number does not really matter unless it's too large) number of threads to offload the work,
it by design cannot be unbounded, it's used as the default sink for any blocking or low-prio tasks in an application.
The best part here is that it is a sink, and users don't bother figuring what is the threads limit, when the starvation occurs etc.
If one needs something specific, e.g. the dispatcher sized in accordance with DB connection pool, they should use newFixedThreadPool(100) and call it a day.
So far so good.

Two downsides though -- a lot of context-switching and, more improtantly, a waste of resources -- each dedicated dispatcher is a bunch of threads, each occuppies 2MB of [potentially not committed] memory.

With limitedParallelism we wanted to address all these problems and are directly advocating for the following pattern:

/ 100 threads for MySQL connection
val myMysqlDbDispatcher = Dispatchers.IO.limitedParallelism(100)
// 60 threads for MongoDB connection
val myMongoDbDispatcher = Dispatchers.IO.limitedParallelism(60)
// 2 threads for logger
val loggers = Dispatchers.IO.limitedParallelism(2)

Threads are reused at their best, nothing is allocated unless really required, and there is no need to shut down executors, all good.

Execpt that Dispatchers.IO size is 64. No issues will be uncovered during unit testing, regular quality assurance and average prod. run.
Yet once the application is heavily loaded (e.g. a once-a-season-spike), the application is brought to its knees, with little to no ways to easily figure out what the problem is.

So, we have an API that solves all our problems except one -- it's incident-prone, and such incidents are almost impossible to find in advance.
Providing an effectively unbounded pool for limited parallelism (which, on the other side, limits it :)) was the most reasonable solution among others:

image

@qwwdfsad
Copy link
Contributor Author

I'm afraid that this inconsistency will quickly become a gotcha.

Could you please provide a few examples where this behaviour is a problem or a gotcha that required a fix?

@dovchinnikov
Copy link
Contributor

dovchinnikov commented Sep 21, 2023

Except that Dispatchers.IO size is 64.

This. When I've asked why another newFixedThreadPool exists, it was because "Dispatchers.IO is bounded", and the author didn't want to exhaust Dispatchers.IO, so I've had to explain that they will not exhaust it with limitedParallelism. That's why I find Dispatchers.Unbounded.limitedParallelism(100) more clear than Dispatchers.IO.limitedParallelism(100) for the same use-case.

Providing an effectively unbounded pool ...

That's what I mean by Dispatchers.Unbounded

... for limited parallelism (which, on the other side, limits it :)) was the most reasonable solution among others

And still it was not chosen, why?

@dovchinnikov
Copy link
Contributor

Could you please provide a few examples where this behaviour is a problem or a gotcha that required a fix?

Basically the problem is that Dispatchers.IO.limitedParallelism is left unused, which leads to

a lot of context-switching and, more improtantly, a waste of resources

@dkhalanskyjb
Copy link
Collaborator

I think this is a case where being too educated becomes a problem. IDEA writers are not our only users, and most of our users don't even know Dispatchers.IO has a limited amount of threads. For them, this is just the way to run blocking tasks, and 64 threads are a safeguard guarding their piece silently in the background so too many threads don't get spawned accidentally. Dispatchers.IO.limitedParallelism was made elastic so that "the obvious thing" of creating a view of a dispatcher dedicated to blocking tasks is also the correct one. If people managed to learn coroutines deep enough to know that there's a 64-thread limit, I think they can also learn these new details about its behavior.

@dovchinnikov
Copy link
Contributor

Another thing related to the intent of code.

Some client, which the platform does not control, may regularly exhaust Dispatchers.Default. In few cases we cannot afford starvation because of some plugin. The solution is to have a separate dispatcher, which is private to the platform, and cannot be used by anybody else. The dispatcher looks like Dispatchers.IO.limitedParallelism(Runtime.getRuntime().availableProcessors()). Under load there will be 2xCPU threads doing CPU work, but at least the system will progress. The dispatcher declaration raises a question: if it's for IO-bound tasks, then why it has a size of CPUs, or if it's for CPU-bound tasks, then why it's a view of Dispatchers.IO?

@dkhalanskyjb
Copy link
Collaborator

dkhalanskyjb commented Sep 21, 2023

The case you're describing is an interesting one, thanks!

The issue is, that we're a widely used general-purpose library, so each public definition has a cost. Introducing a whole new Dispatchers.Unbounded would add much confusion, and the case you're describing—intentionally wanting to conflict with Dispatchers.Default for CPU time—is something the overwhelming majority of our users will never even come near to encountering. If the dispatcher declaration looks unclear, there's always the option to write something like val Dispatchers.Unbounded = Dispatchers.IO.limitedParallelism(Int.MAX_VALUE) in your own code. Do you think causing half of Android developers out there a headache just so a workaround in IDEA's code looks more idiomatic is a worthwhile tradeoff?

@dovchinnikov
Copy link
Contributor

Introducing a whole new Dispatchers.Unbounded would add much confusion

I'd expect that it would at least make the user think about why both Dispatchers.IO and Dispatchers.Unbounded exist, and then they will discover that Dispatchers.IO is indeed a bounded view over Dispatchers.Unbounded. I mean that it's not confusion but education in a natural way.

Consider this:

  • Dispatchers.Unbounded is the dispatcher.
  • Dispatchers.Default is a view of Unbounded with parallelism=CPU.
  • Dispatchers.IO is a view of Unbounded with parallelism=64.

Why Dispatchers.Default and Dispatchers.IO even exist in that picture when one can define their own? To convey the intent of the API user: Default for CPU-bound tasks, IO for IO-bound tasks.

Now, limitedParallelism work the same way with any of those, which reduces the cognitive load by avoiding another inconsistency and avoiding to having to remember that such thing as "elasticity" exists.

(Dispatchers.Default still needs to exist in the lib because it's used when no dispatcher is specified. I'm omitting that because I'd like to be able to override the default coroutine context with SPI, which is off topic, but it should make the effective default dispatcher configurable and possible not equal to Dispatchers.Default.)

@dkhalanskyjb
Copy link
Collaborator

I understand your desire for a simpler conceptual model as someone who routinely looks into how coroutines work internally. You are right, exposing Dispatchers.Unbounded would be educational if we wanted people to learn about these implementation details, and yes, aside from performance optimizations related to work-stealing strategies that are aware of whether work is CPU-bound or I/O-bound, Dispatchers.Default could be a view of Unbounded.

The problem is, that these details are almost always irrelevant, and by exposing them, we would only make it more difficult to understand what's important and what isn't, muddying the conceptual field in which people are actually operating.

— I can only call my API endpoint one request at a time. How do I do that?
— You need val apiEndpointDispatcher = Dispatchers.IO.limitedParallelism(1). Because you're connecting over the network, you need Dispatchers.IO, and limitedParallelism(1) here means that not more than one thread at a time may work there.
— Ok, thanks. I also need a thread to connect to SQLite. Should I add another val sqliteDispatcher = Dispatchers.IO.limitedParallelism(1)?
— Yep.
— Gotcha. Oh, hey, we're going to move from SQLite to MySQL soon, which allows up to 100 simultaneous connections. Do I just replace 1 with 100?
— No-no-no-no! Dispatchers.IO doesn't have 100 threads in it, you'll be shooting yourself in the foot. Also, even your dispatcher for the API endpoint may stop working if you do that. You must keep the sum of views on Dispatchers.IO well under 64 at all times. I'd say keep it under 60, so that at least 4 threads are available for work launched on Dispatchers.IO directly.
— Oh.
— You need Dispatchers.Unbounded.limitedParallelism(100).
— What's Dispatchers.Unbounded?
— It's like Dispatchers.IO but without the 64-thread limit.
— Ok, why would I ever use Dispatchers.IO then if it's so error-prone?
— Usually, you do need this limit. Be careful not to use Dispatchers.Unbounded directly in cases when I/O work can come in quick succession: if you get a thousand requests for file reading and push them all to Dispatchers.Unbounded, it may create a thousand threads.
— Is that bad?
— Well, your program may become unresponsive.
— Aren't threads supposed to help utilize a computer to its fullest?
— Yes, but if there are too many threads, there's a cost to switching between them. In fact, just to be safe, don't use Dispatchers.Unbounded directly at all, only its views. This way, you'll have a bounded number of threads at all times, even though Unbounded is used.
— What a mess. So, if it's error-prone to take views of Dispatchers.IO and it's also error-prone to not take views of Dispatchers.Unbounded, why didn't the coroutines guys just make it so that it's safe to take views of Dispatchers.IO and get rid of Dispatchers.Unbounded altogether?
— Don't be silly. This wouldn't be conceptually clean. After all, Dispatchers.IO does only have 64 threads (or however many you configure), and if you're taking its view, clearly you shouldn't expect more threads to appear out of thin air.

Now imagine you're the guy asking the questions, but you don't have anyone to give you answers. All you wanted to do was create a connection pool that uses threads marked for I/O-bound work (because that's the level you operate on), but now you have to dig into liveliness, understand thread pools, scheduling, and so on. Coroutines are supposed to make multithreading easily available, not just dump another layer of complexity on top of what's already difficult about it.

The fact that most people don't know about the 64-thread limit is a testament to it being unobtrusive in practice, not a thing to "fix."

@dovchinnikov
Copy link
Contributor

dovchinnikov commented Sep 21, 2023

So, if it's error-prone to take views of Dispatchers.IO and it's also error-prone to not take views of Dispatchers.Unbounded, why didn't the coroutines guys just make it so that it's safe to take views of Dispatchers.IO and get rid of Dispatchers.Unbounded altogether?

So

  • Dispatchers.Unbounded.limitedParallelism is needed, but Dispatchers.Unbounded is, presumably, error-prone.
  • Dispatchers.IO is needed, but Dispatchers.IO.limitedParallelism is, presumably, error-prone.
  • Let's give Dispatchers.IO.limitedParallelism the semantics of Dispatchers.Unbounded.limitedParallelism, this way we solve two problems at once.

I totally understand and support that exposing Dispatchers.Unbounded might be dangerous.

If you don't want to expose Dispatchers.Unbounded, then how about this:

// returns a new dispatcher view over global scheduler pool
fun Dispatchers.newDispatcher(parallelism: Int): CoroutineDispatcher = TODO()

— I can only call my API endpoint one request at a time. How do I do that?
— You need val apiEndpointDispatcher = Dispatchers.newDispatcher(1). Because you're connecting over the network, you need a new dispatcher 1 here means that not more than one thread at a time may work there.
— Ok, thanks. I also need a thread to connect to SQLite. Should I add another val sqliteDispatcher = Dispatchers.newDispatcher(1)?
— Yep.
— Gotcha. Oh, hey, we're going to move from SQLite to MySQL soon, which allows up to 100 simultaneous connections. Do I just replace 1 with 100?
— Yep!
— So, it's error-prone to take views of Dispatchers.IO?
— Don't be silly, Dispatchers.IO does only have 64 threads (or however many you configure) like Dispatchers.Default has CPU-count threads (or however many you configure), and if you're taking its view, clearly you shouldn't expect more threads to appear out of thin air just like with any other limitedParallelism dispatcher.

This approach aligns with newFixedThreadPool in a way, i.e. Executors.newFixedThreadPool(x) -> Dispatchers.newDispatcher(x).

@dkhalanskyjb
Copy link
Collaborator

Even if we agreed, the ship has sailed: https://duckduckgo.com/?q="dispatchers.io.limitedparallelism"+!g&t=ffab&ia=web There's plenty of documentation that already points to Dispatchers.IO.limitedParallelism as the way to go. So it is already a huge breaking change for us to keep limitedParallelism but remove the elasticity property.

Also, I feel that we're speaking past each other. As I see it, Dispatchers.IO being 64-threaded is an implementation detail. A response to the problem of bursts of tasks happening. It's not an important property one should focus on when writing code, except when it's deeply technical and infrastructural. The inherent limitation to the number of I/O tasks that should be allowed to execute in parallel is much higher than 64, it's just an arbitrary safe number. Maybe one day, we'll discuss removing this limit by default and replacing it with some throttling on creating new threads. I don't see anything that's conceptually stopping us from doing it, only technical considerations. Your point as I see it: "IO is limited to 64 threads, so its views should be a subset of that, or the API becomes muddied." If we took the 64-thread limit as the inherent property of IO, that would be true. My point: "The limit already makes the API dirty, and if people naively used views of IO that respected this limit, the leaky abstraction behind IO would be even more noticeable, and this shouldn't happen." People shouldn't have to know that there's a limit in order to write correct code that uses Dispatchers.IO, especially when incorrect code would look and work correctly in most but the most critical circumstances.

To reiterate my initial point: if you're deep enough to know about the 64-thread limit, you're deep enough to learn about elasticity easily. If you're tired of explaining elasticity to colleagues, you can introduce Dispatchers.Unbounded in your code and replace Disptachers.IO.limitedParallelism with that.

If you have some considerations other than API purity, like if you can imagine error-prone code resulting from people not knowing about elasticity, please share them. Could someone want to hit the 64-thread limit and be surprised when it doesn't happen in the presence of views? Why?

@pacher
Copy link

pacher commented Oct 28, 2023

How about exposing Unbounded but don't let it implement Dispatcher. Call it DispatcherProducer or CommonCoroutinesThreadPool or whatever. The only method available on this new entity is limitedParallelism which creates a Dispatcher. This way as a user when I ctrl click through Dispatchers I will see

Dispatchers.Default = CommonPool.limitedParallelism(numberOfCPU)
Dispatchers.IO = CommonPool.limitedParallelism(64)
etc.

which is pretty clear and makes the relationship between dispatchers (avoiding context-switch) obvious.
There would be also no question on how to create my own MySql dispatcher backed by the same pool.

Then we can still make IO special in a sense that when limitedParallelism called on it the resulting dispatcher is a fresh dispatcher from underlying pool and not the view of IO so that all this documentation out there still valid and there is no breaking change.

@qwwdfsad qwwdfsad removed the for 1.8 label Nov 30, 2023
@qwwdfsad qwwdfsad self-assigned this Apr 8, 2024
@qwwdfsad
Copy link
Contributor Author

On a side note, there seems to be a misconception about limitedParallelism(1) being "racy", for example -- https://github.com/KStateMachine/kstatemachine/blob/master/docs/index.md#use-single-threaded-coroutinescope

While this might not be a goal of our documentation per se, it still would be nice to explicitly bust this myth

svc-squareup-copybara pushed a commit to cashapp/misk that referenced this issue Oct 4, 2024
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
#&#8203;3188](https://github.com/pgjdbc/pgjdbc/pull/3188)
- chore: Add PostgreSQL 15, 16, and 17beta1 to CI tests [PR
#&#8203;3299](https://github.com/pgjdbc/pgjdbc/pull/3299)
- test: Update to 17beta3 [PR
#&#8203;3308](https://github.com/pgjdbc/pgjdbc/pull/3308)
- chore: Implement direct SSL ALPN connections [PR
#&#8203;3252](https://github.com/pgjdbc/pgjdbc/pull/3252)
- translation: Add Korean translation file [PR
#&#8203;3276](https://github.com/pgjdbc/pgjdbc/pull/3276)

##### Fixed

- fix: PgInterval ignores case for represented interval string [PR
#&#8203;3344](https://github.com/pgjdbc/pgjdbc/pull/3344)
- perf: Avoid extra copies when receiving int4 and int2 in PGStream [PR
#&#8203;3295](https://github.com/pgjdbc/pgjdbc/pull/3295)
- fix: Add support for Infinity::numeric values in ResultSet.getObject
[PR #&#8203;3304](https://github.com/pgjdbc/pgjdbc/pull/3304)
- fix: Ensure order of results for getDouble [PR
#&#8203;3301](https://github.com/pgjdbc/pgjdbc/pull/3301)
- perf: Replace BufferedOutputStream with unsynchronized
PgBufferedOutputStream, allow configuring different Java and SO_SNDBUF
buffer sizes [PR
#&#8203;3248](https://github.com/pgjdbc/pgjdbc/pull/3248)
- fix: Fix SSL tests [PR
#&#8203;3260](https://github.com/pgjdbc/pgjdbc/pull/3260)
- fix: Support bytea in preferQueryMode=simple [PR
#&#8203;3243](https://github.com/pgjdbc/pgjdbc/pull/3243)
- fix: Fix [#&#8203;3234](https://github.com/pgjdbc/pgjdbc/issues/3234)
- Return -1 as update count for stored procedure calls [PR
#&#8203;3235](https://github.com/pgjdbc/pgjdbc/pull/3235)
- fix: Fix [#&#8203;3224](https://github.com/pgjdbc/pgjdbc/issues/3224)
- conversion for TIME '24:00' to LocalTime breaks in binary-mode [PR
#&#8203;3225](https://github.com/pgjdbc/pgjdbc/pull/3225)
- perf: Speed up getDate by parsing bytes instead of String [PR
#&#8203;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 #&#8203;3136](https://github.com/pgjdbc/pgjdbc/pull/3136)
- fix: Validates resultset Params in PGStatement constructor. uses
assertThro… [PR
#&#8203;3171](https://github.com/pgjdbc/pgjdbc/pull/3171)
- fix: Validates resultset parameters [PR
#&#8203;3167](https://github.com/pgjdbc/pgjdbc/pull/3167)
- docs: Replace greater to with greater than [PR
#&#8203;3315](https://github.com/pgjdbc/pgjdbc/pull/3315)
- docs: Clarify binaryTransfer and prepareThreshold [PR
#&#8203;3338](https://github.com/pgjdbc/pgjdbc/pull/3338)
- docs: use.md, typo [PR
#&#8203;3314](https://github.com/pgjdbc/pgjdbc/pull/3314)
- test: Use docker v2 which changes docker-compose to docker compose
[#&#8203;3339](https://github.com/pgjdbc/pgjdbc/pull/3339)
- refactor: Merge PgPreparedStatement#setBinaryStream int and long
methods [PR #&#8203;3165](https://github.com/pgjdbc/pgjdbc/pull/3165)
- test: Test both binaryMode=true,false when creating connections in
DatabaseMetaDataTest [PR
#&#8203;3231](https://github.com/pgjdbc/pgjdbc/pull/3231)
- docs: Fixed typos in all source code and documentations [PR
#&#8203;3242](https://github.com/pgjdbc/pgjdbc/pull/3242)
- chore: Remove self-hosted runner [PR
#&#8203;3227](https://github.com/pgjdbc/pgjdbc/pull/3227)
- docs: Add cancelSignalTimeout in README [PR
#&#8203;3190](https://github.com/pgjdbc/pgjdbc/pull/3190)
- docs: Document READ_ONLY_MODE in README [PR
#&#8203;3175](https://github.com/pgjdbc/pgjdbc/pull/3175)
- test: Test for +/- infinity double values [PR
#&#8203;3294](https://github.com/pgjdbc/pgjdbc/pull/3294)
- test: Switch localhost and auth-test around for test-gss [PR
#&#8203;3343](https://github.com/pgjdbc/pgjdbc/pull/3343)
- fix: remove preDescribe from internalExecuteBatch [PR
#&#8203;2883](https://github.com/pgjdbc/pgjdbc/pull/2883)

##### Deprecated

- test: Deprecate all PostgreSQL versions older than 9.1 [PR
#&#8203;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
#&#8203;3147](https://github.com/pgjdbc/pgjdbc/pull/3147)

##### Fixed

- fix: boolean types not handled in SimpleQuery mode [PR
#&#8203;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
#&#8203;3101](https://github.com/pgjdbc/pgjdbc/pull/3101)
- perf: Avoid autoboxing bind indexes by
[@&#8203;bokken](https://github.com/bokken) in [PR
#&#8203;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
[@&#8203;vlsi](https://github.com/vlsi) in [PR
#&#8203;3084](https://github.com/pgjdbc/pgjdbc/pull/3084)

##### Added

- feat: Add PasswordUtil for encrypting passwords client side [PR
#&#8203;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
#&#8203;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
#&#8203;3040](https://github.com/pgjdbc/pgjdbc/pull/3040)
- fix: support waffle-jna 2.x and 3.x by using reflective approach for
ManagedSecBufferDesc [PR
#&#8203;2720](https://github.com/pgjdbc/pgjdbc/pull/2720) Fixes [Issue
#&#8203;2690](https://github.com/pgjdbc/pgjdbc/issues/2720).
- fix: NoSuchMethodError on ByteBuffer#position When Running on Java 8
when accessing arrays, fixes [Issue
#&#8203;3014](https://github.com/pgjdbc/pgjdbc/issues/3014)
- Revert "[PR #&#8203;2925](https://github.com/pgjdbc/pgjdbc/pull/2925)
Use canonical DateStyle name" [PR
#&#8203;3035](https://github.com/pgjdbc/pgjdbc/pull/3035)
Fixes [Issue #&#8203;3008](https://github.com/pgjdbc/pgjdbc/issues/3008)
- Revert "[PR ##&#8203;2973](https://github.com/pgjdbc/pgjdbc/pull/2973)
feat: support SET statements combining with other queries with semicolon
in PreparedStatement" [PR
#&#8203;3010](https://github.com/pgjdbc/pgjdbc/pull/3010)
Fixes [Issue #&#8203;3007](https://github.com/pgjdbc/pgjdbc/issues/3007)
- fix: avoid timezone conversions when sending LocalDateTime to the
database [#&#8203;2852](https://github.com/pgjdbc/pgjdbc/pull/3010)
Fixes [Issue #&#8203;1390](https://github.com/pgjdbc/pgjdbc/issues/1390)
    ,[Issue #&#8203;2850](https://github.com/pgjdbc/pgjdbc/issues/2850)
Closes \[Issue
[#&#8203;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
#&#8203;2967](https://github.com/pgjdbc/pgjdbc/pull/2967)
- feat: return all catalogs for getCatalogs metadata query closes [ISSUE
#&#8203;2949](https://github.com/pgjdbc/pgjdbc/issues/2949) [PR
#&#8203;2953](https://github.com/pgjdbc/pgjdbc/pull/2953)
- feat: support SET statements combining with other queries with
semicolon in PreparedStatement [PR
##&#8203;2973](https://github.com/pgjdbc/pgjdbc/pull/2973)

##### Fixed

- chore: add styleCheck Gradle task to report style violations [PR
#&#8203;2980](https://github.com/pgjdbc/pgjdbc/pull/2980)
- fix: Include currentXid in "Error rolling back prepared transaction"
exception message [PR
#&#8203;2978](https://github.com/pgjdbc/pgjdbc/pull/2978)
- fix: add varbit as a basic type inside the TypeInfoCache [PR
#&#8203;2960](https://github.com/pgjdbc/pgjdbc/pull/2960)
- fix: Fix failing tests for version 16. [PR
#&#8203;2962](https://github.com/pgjdbc/pgjdbc/pull/2962)
- fix: allow setting arrays with ANSI type name [PR
#&#8203;2952](https://github.com/pgjdbc/pgjdbc/pull/2952)
- feat: Use KeepAlive to confirm LSNs [PR
#&#8203;2941](https://github.com/pgjdbc/pgjdbc/pull/2941)
- fix: put double ' around log parameter [PR
#&#8203;2936](https://github.com/pgjdbc/pgjdbc/pull/2936) fixes [ISSUE
#&#8203;2935](https://github.com/pgjdbc/pgjdbc/issues/2935)
- fix: Fix Issue
[#&#8203;2928](https://github.com/pgjdbc/pgjdbc/issues/2928) number of
ports not equal to number of servers in datasource [PR
#&#8203;2929](https://github.com/pgjdbc/pgjdbc/pull/2929)
- fix: Use canonical DateStyle name
([#&#8203;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
#&#8203;2881](https://github.com/pgjdbc/pgjdbc/pull/2881)
- docs: Fix typos in info.html [PR
#&#8203;2860](https://github.com/pgjdbc/pgjdbc/pull/2860)
- fix: Return correct default from
PgDatabaseMetaData.getDefaultTransactionIsolation [PR
#&#8203;2992](https://github.com/pgjdbc/pgjdbc/pull/2992) fixes [Issue
#&#8203;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
#&#8203;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 #&#8203;2635](https://github.com/pgjdbc/pgjdbc/pull/2635)
Fixes [Issue #&#8203;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
[#&#8203;2810](https://github.com/pgjdbc/pgjdbc/issues/2810)]\((https://github.com/pgjdbc/pgjdbc/pull/2810).
- fixes [Issue
#&#8203;2804](https://github.com/pgjdbc/pgjdbc/issues/2804).
- fix: Make sure that github CI runs tests on all [PRs
#&#8203;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
#&#8203;2746](https://github.com/pgjdbc/pgjdbc/issues/2746) [PR
#&#8203;2747](https://github.com/pgjdbc/pgjdbc/pull/2747)
- fix: regression in PgResultSet LONG_MIN copy and paste error fixes
[Issue #&#8203;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
#&#8203;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
#&#8203;2700](https://github.com/pgjdbc/pgjdbc/pull/2700)
- feat: Define binary transfer for custom types
dynamically/automatically fixes [Issue
#&#8203;2554](https://github.com/pgjdbc/pgjdbc/issues/2554) [PR
#&#8203;2556](https://github.com/pgjdbc/pgjdbc/pull/2556)

##### Added

- fix: added gssResponseTimeout as part of [PR
#&#8203;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
#&#8203;2682](https://github.com/pgjdbc/pgjdbc/pull/2682)
- fix: Make sure socket is closed if an exception is thrown in
createSocket fixes [Issue
#&#8203;2684](https://github.com/pgjdbc/pgjdbc/issues/2684) [PR
#&#8203;2685](https://github.com/pgjdbc/pgjdbc/pull/2685)
- fix: Apply patch from [Issue
#&#8203;2683](https://github.com/pgjdbc/pgjdbc/issues/2683) to fix
hanging ssl connections [PR
#&#8203;2687](https://github.com/pgjdbc/pgjdbc/pull/2687)
- fix - binary conversion of (very) long numeric values (longer than 4
\* 2^15 digits) [PR
#&#8203;2697](https://github.com/pgjdbc/pgjdbc/pull/2697) fixes [Issue
#&#8203;2695](https://github.com/pgjdbc/pgjdbc/issues/2695)
- minor: enhance readability connection of startup params [PR
#&#8203;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
#&#8203;2552](https://github.com/pgjdbc/pgjdbc/issues/2552)
- fix: binary decoding of bool values [PR
#&#8203;2640](https://github.com/pgjdbc/pgjdbc/pull/2640)
- perf: improve performance of PgResultSet
getByte/getShort/getInt/getLong for float-typed columns [PR
#&#8203;2634](https://github.com/pgjdbc/pgjdbc/pull/2634)
- chore: fix various spelling errors [PR
#&#8203;2592](https://github.com/pgjdbc/pgjdbc/pull/2592)
- chore: Feature/urlparser improve URLParser [PR
#&#8203;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
#&#8203;1986](https://github.com/pgjdbc/pgjdbc/pull/1986) where float
was aliased to float4 from float8.
float now aliases to float8 [PR
#&#8203;2598](https://github.com/pgjdbc/pgjdbc/pull/2598) fixes [Issue
#&#8203;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
[#&#8203;2553](https://github.com/pgjdbc/pgjdbc/issues/2553))\[https://github.com/pgjdbc/pgjdbc/pull/2553]

##### Added

- fix: make setObject accept UUID array [PR
#&#8203;2587](https://github.com/pgjdbc/pgjdbc/pull/2587)

##### Fixed

- fix: regression with GSS. Changes introduced to support building with
Java 17 caused failures [Issue
#&#8203;2588](https://github.com/pgjdbc/pgjdbc/issues/2588)
- fix: set a timeout to get the return from requesting SSL upgrade. [PR
#&#8203;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 #&#8203;2425](https://github.com/pgjdbc/pgjdbc/issues/2497)
pgbouncer cannot deal with transactions in statement pooling mode [PR
#&#8203;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 #&#8203;2525](https://github.com/pgjdbc/pgjdbc/pull/2525), [Issue
#&#8203;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
#&#8203;2531](https://github.com/pgjdbc/pgjdbc/pull/2531), [issue
#&#8203;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
#&#8203;2520](https://github.com/pgjdbc/pgjdbc/pull/2520) [Issue
#&#8203;2522](https://github.com/pgjdbc/pgjdbc/issues/2522)
- perf: utcTz static and renamed to UTC_TIMEZONE [PR
#&#8203;2519](https://github.com/pgjdbc/pgjdbc/pull/2520)
- doc: fix release version for
[#&#8203;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
[(#&#8203;3454)](https://github.com/mockito/mockito/pull/3454)
- Bump bytebuddy from 1.15.2 to 1.15.3
[(#&#8203;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.
[(#&#8203;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
[(#&#8203;3451)](https://github.com/mockito/mockito/pull/3451)
- Bump bytebuddy from 1.15.1 to 1.15.2
[(#&#8203;3450)](https://github.com/mockito/mockito/pull/3450)
- Update Documentation of ArgumentCaptor.java
[(#&#8203;3448)](https://github.com/mockito/mockito/pull/3448)
- Split subprojects
[(#&#8203;3447)](https://github.com/mockito/mockito/pull/3447)
- Separate extensions from integration tests
[(#&#8203;3443)](https://github.com/mockito/mockito/issues/3443)
- Bump org.eclipse.platform:org.eclipse.osgi from 3.20.0 to 3.21.0
[(#&#8203;3440)](https://github.com/mockito/mockito/pull/3440)
- Bump com.gradle.enterprise from 3.18 to 3.18.1
[(#&#8203;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.
[(#&#8203;3437)](https://github.com/mockito/mockito/pull/3437)
- Bump bytebuddy from 1.15.0 to 1.15.1
[(#&#8203;3434)](https://github.com/mockito/mockito/pull/3434)
- Fixes [#&#8203;3419](https://github.com/mockito/mockito/issues/3419):
Disable mocks with an error message
[(#&#8203;3424)](https://github.com/mockito/mockito/pull/3424)
- Accessing a mock after clearInlineMocks could provide much more useful
error message.
[(#&#8203;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
([#&#8203;4064](https://github.com/Kotlin/kotlinx.coroutines/issues/4064)).
Thanks, [@&#8203;igoriakovlev](https://github.com/igoriakovlev)!
- `limitedParallelism` now optionally accepts the name of the dispatcher
view for easier debugging
([#&#8203;4023](https://github.com/Kotlin/kotlinx.coroutines/issues/4023)).
- No longer initialize `Dispatchers.IO` on the JVM when other standard
dispatchers are accessed
([#&#8203;4166](https://github.com/Kotlin/kotlinx.coroutines/issues/4166)).
Thanks, [@&#8203;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
([#&#8203;1290](https://github.com/Kotlin/kotlinx.coroutines/issues/1290)).
- Closeable dispatchers are instances of `AutoCloseable` now
([#&#8203;4123](https://github.com/Kotlin/kotlinx.coroutines/issues/4123)).

##### Fixes

- Calling `hasNext` on a `Channel`'s iterator is idempotent
([#&#8203;4065](https://github.com/Kotlin/kotlinx.coroutines/issues/4065)).
Thanks, [@&#8203;gitpaxultek](https://github.com/gitpaxultek)!
- `CoroutineScope()` created without an explicit dispatcher uses
`Dispatchers.Default` on Native
([#&#8203;4074](https://github.com/Kotlin/kotlinx.coroutines/issues/4074)).
Thanks, [@&#8203;whyoleg](https://github.com/whyoleg)!
- Fixed a bug that prevented non-Android `Dispatchers.Main` from
initializing when the Firebase dependency is used
([#&#8203;3914](https://github.com/Kotlin/kotlinx.coroutines/issues/3914)).
- Ensured a more intuitive ordering of tasks in `runBlocking`
([#&#8203;4134](https://github.com/Kotlin/kotlinx.coroutines/issues/4134)).
- Forbid casting a `Mutex` to `Semaphore`
([#&#8203;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
([#&#8203;4156](https://github.com/Kotlin/kotlinx.coroutines/issues/4156)).

##### Deprecations and promotions

- Advanced the deprecation levels for `BroadcastChannel`-based API
([#&#8203;4197](https://github.com/Kotlin/kotlinx.coroutines/issues/4197)).
- Advanced the deprecation levels for the old `kotlinx-coroutines-test`
API
([#&#8203;4198](https://github.com/Kotlin/kotlinx.coroutines/issues/4198)).
- Deprecated `Job.cancelFutureOnCompletion`
([#&#8203;4173](https://github.com/Kotlin/kotlinx.coroutines/issues/4173)).
- Promoted `CoroutineDispatcher.limitedParallelism` to stable
([#&#8203;3864](https://github.com/Kotlin/kotlinx.coroutines/issues/3864)).
- Promoted `CoroutineStart.ATOMIC` from `ExperimentalCoroutinesApi` to
`DelicateCoroutinesApi`
([#&#8203;4169](https://github.com/Kotlin/kotlinx.coroutines/issues/4169)).
- Promoted `CancellableContinuation.resume` with an `onCancellation`
lambda to stable, providing extra arguments to the lambda
([#&#8203;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
([#&#8203;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
([#&#8203;3770](https://github.com/Kotlin/kotlinx.coroutines/issues/3770)).

##### Other

- Kotlin was updated to 2.0
([#&#8203;4137](https://github.com/Kotlin/kotlinx.coroutines/issues/4137)).
- Reworked the documentation for `CoroutineStart` and `Channel`-based
API
([#&#8203;4147](https://github.com/Kotlin/kotlinx.coroutines/issues/4147),
[#&#8203;4148](https://github.com/Kotlin/kotlinx.coroutines/issues/4148),
[#&#8203;4167](https://github.com/Kotlin/kotlinx.coroutines/issues/4167)).
Thanks, [@&#8203;globsterg](https://github.com/globsterg)!
- Simplified the internal implementation of `Job`
([#&#8203;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";

      @&#8203;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
([#&#8203;3896](https://github.com/redis/jedis/issues/3896))
- Address change in JSON.GET command without path
([#&#8203;3858](https://github.com/redis/jedis/issues/3858))
- Modify and fail-fast GeoSearchParam
([#&#8203;3827](https://github.com/redis/jedis/issues/3827))
- Support transaction from UnifiedJedis without calling multi first
([#&#8203;3804](https://github.com/redis/jedis/issues/3804))
- Reduce the log level of validateObject to WARN
([#&#8203;3750](https://github.com/redis/jedis/issues/3750))

#### 🧪 Experimental Features

- Support automatic namespacing
([#&#8203;3781](https://github.com/redis/jedis/issues/3781))
- Added support for ADDSCORES argument in FT.AGGREGATE
([#&#8203;3908](https://github.com/redis/jedis/issues/3908))
- Support IGNORE and other optional arguments for timeseries commands
([#&#8203;3860](https://github.com/redis/jedis/issues/3860))

#### 🚀 New Features

- Support Hash field expiration
([#&#8203;3826](https://github.com/redis/jedis/issues/3826))
- Add equals and hashCode to Timeseries Params classes
([#&#8203;3959](https://github.com/redis/jedis/issues/3959))
- Decoding FT.SEARCH reply can be disabled at field level
([#&#8203;3926](https://github.com/redis/jedis/issues/3926))
- Get enriched Connection information
([#&#8203;3745](https://github.com/redis/jedis/issues/3745))
- Support execute the read-only command on replica nodes
([#&#8203;3848](https://github.com/redis/jedis/issues/3848))
- JedisConnectionException contains HostAndPort from
DefaultJedisSocketFactory
([#&#8203;3896](https://github.com/redis/jedis/issues/3896))
- Support \[S]PUBLISH in pipelines and transactions
([#&#8203;3859](https://github.com/redis/jedis/issues/3859))
- Support Hash field expiration
([#&#8203;3826](https://github.com/redis/jedis/issues/3826))
- Custom connection pool to MultiClusterPooledConnectionProvider
([#&#8203;3801](https://github.com/redis/jedis/issues/3801))
- PubSub handle array of messages for RESP2
([#&#8203;3811](https://github.com/redis/jedis/issues/3811))
- Support transaction from UnifiedJedis without calling multi first
([#&#8203;3804](https://github.com/redis/jedis/issues/3804))
- Add last entry id for XREADs and support XREADs reply as map
([#&#8203;3791](https://github.com/redis/jedis/issues/3791))
- Add Experimental, Internal and VisibleForTesting annotations
([#&#8203;3790](https://github.com/redis/jedis/issues/3790))
- Implement equals and hashcode in Params classes
([#&#8203;3728](https://github.com/redis/jedis/issues/3728))
- Add support for redis command: CLIENT TRACKINGINFO
([#&#8203;3751](https://github.com/redis/jedis/issues/3751))
- Support the MAXAGE option for CLIENT KILL
([#&#8203;3754](https://github.com/redis/jedis/issues/3754))
- Polish [#&#8203;3741](https://github.com/redis/jedis/issues/3741)
([#&#8203;3746](https://github.com/redis/jedis/issues/3746))
- Add support for the NOVALUES option of HSCAN
([#&#8203;3741](https://github.com/redis/jedis/issues/3741))
- Support issuing Latency commands
([#&#8203;3729](https://github.com/redis/jedis/issues/3729))

#### 🐛 Bug Fixes

- Accept null replies for BZPOPMAX and BZPOPMIN commands
([#&#8203;3930](https://github.com/redis/jedis/issues/3930))
- Fix empty LUA table reply
([#&#8203;3924](https://github.com/redis/jedis/issues/3924))
- Ensure closing connection in Pipeline
([#&#8203;3865](https://github.com/redis/jedis/issues/3865))
- Address change in JSON.GET command without path
([#&#8203;3858](https://github.com/redis/jedis/issues/3858))
- Consider null values in empty StreamPendingSummary
([#&#8203;3793](https://github.com/redis/jedis/issues/3793))
- Fix UnifiedJedis pexpireAt glitch
([#&#8203;3782](https://github.com/redis/jedis/issues/3782))
- Use expiryOption in PipelineBase.expireAt
([#&#8203;3777](https://github.com/redis/jedis/issues/3777))
- Stop connection fetching before sync/exec
([#&#8203;3756](https://github.com/redis/jedis/issues/3756))
- Check for thread interrupt in subscribe process of PubSub
([#&#8203;3726](https://github.com/redis/jedis/issues/3726))
- Avoid NPE in MultiNodePipelineBase.java
([#&#8203;3697](https://github.com/redis/jedis/issues/3697))
- Fix probable missing (RESP3) protocol processing
([#&#8203;3692](https://github.com/redis/jedis/issues/3692))
- Use circuit breaker fallback exception list
([#&#8203;3664](https://github.com/redis/jedis/issues/3664))

#### 🧰 Maintenance

- Deprecate Triggers and Functions feature
([#&#8203;3968](https://github.com/redis/jedis/issues/3968))
- Bump org.apache.httpcomponents.client5:httpclient5-fluent from 5.3.1
to 5.4 ([#&#8203;3962](https://github.com/redis/jedis/issues/3962))
- Bump org.apache.maven.plugins:maven-surefire-plugin from 3.3.1 to
3.5.0 ([#&#8203;3950](https://github.com/redis/jedis/issues/3950))
- Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.8.0 to
3.10.0 ([#&#8203;3949](https://github.com/redis/jedis/issues/3949))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.5 to 3.2.6
([#&#8203;3957](https://github.com/redis/jedis/issues/3957))
- Added JavaDoc for basic JedisCluster constructors
([#&#8203;3304](https://github.com/redis/jedis/issues/3304))
- Bump org.locationtech.jts:jts-core from 1.19.0 to 1.20.0
([#&#8203;3948](https://github.com/redis/jedis/issues/3948))
- Add A-A failover scenario test
([#&#8203;3935](https://github.com/redis/jedis/issues/3935))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.4 to 3.2.5
([#&#8203;3936](https://github.com/redis/jedis/issues/3936))
- Fix codecov upload
([#&#8203;3933](https://github.com/redis/jedis/issues/3933))
- Rename readonly config param to specify Redis Cluster
([#&#8203;3932](https://github.com/redis/jedis/issues/3932))
- Modify Connection.toIdentityString and test
([#&#8203;3931](https://github.com/redis/jedis/issues/3931))
- Revert "Creating CODEOWNERS for the examples
([#&#8203;3570](https://github.com/redis/jedis/issues/3570))"
([#&#8203;3897](https://github.com/redis/jedis/issues/3897))
- Bump org.apache.maven.plugins:maven-surefire-plugin from 3.2.5 to
3.3.1 ([#&#8203;3891](https://github.com/redis/jedis/issues/3891))
- Bump org.hamcrest:hamcrest from 2.2 to 3.0
([#&#8203;3914](https://github.com/redis/jedis/issues/3914))
- Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.7.0 to 3.8.0
([#&#8203;3909](https://github.com/redis/jedis/issues/3909))
- Bump net.javacrumbs.json-unit:json-unit from 2.38.0 to 2.40.1
([#&#8203;3903](https://github.com/redis/jedis/issues/3903))
- Bump org.apache.maven.plugins:maven-release-plugin from 3.0.1 to 3.1.1
([#&#8203;3890](https://github.com/redis/jedis/issues/3890))
- Fixed typo in Javadoc
([#&#8203;3917](https://github.com/redis/jedis/issues/3917))
- Bump org.apache.maven.plugins:maven-jar-plugin from 3.4.1 to 3.4.2
([#&#8203;3910](https://github.com/redis/jedis/issues/3910))
- Bump com.kohlschutter.junixsocket:junixsocket-core from 2.9.1 to
2.10.0 ([#&#8203;3901](https://github.com/redis/jedis/issues/3901))
- Bump jackson.version from 2.17.1 to 2.17.2
([#&#8203;3902](https://github.com/redis/jedis/issues/3902))
- Add Scenario tests
([#&#8203;3847](https://github.com/redis/jedis/issues/3847))
- Modify the judgment that reads a response as empty to isEmpty method
([#&#8203;3888](https://github.com/redis/jedis/issues/3888))
- Replace `synchronized` with `j.u.c.l.ReentrantLock` for Loom
([#&#8203;3480](https://github.com/redis/jedis/issues/3480))
- Extract messages of unsupported exception as constants
([#&#8203;3887](https://github.com/redis/jedis/issues/3887))
- Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.6.3 to 3.7.0
([#&#8203;3851](https://github.com/redis/jedis/issues/3851))
- Bump org.sonatype.plugins:nexus-staging-maven-plugin from 1.6.13 to
1.7.0 ([#&#8203;3850](https://github.com/redis/jedis/issues/3850))
- Bump com.google.code.gson:gson from 2.10.1 to 2.11.0
([#&#8203;3842](https://github.com/redis/jedis/issues/3842))
- Merge doc tests into main branch to keep in-sync with the code
([#&#8203;3861](https://github.com/redis/jedis/issues/3861))
- Deprecate unused Set<Tuple> builders
([#&#8203;3857](https://github.com/redis/jedis/issues/3857))
- Disable Redis Graph tests
([#&#8203;3856](https://github.com/redis/jedis/issues/3856))
- Introduce EndpointConfig and load endpoint settings from the
endpoints.json file
([#&#8203;3836](https://github.com/redis/jedis/issues/3836))
- Address Gears test fail - Cleanup Function libraries
([#&#8203;3840](https://github.com/redis/jedis/issues/3840))
- Bump jackson.version from 2.17.0 to 2.17.1
([#&#8203;3833](https://github.com/redis/jedis/issues/3833))
- Add methods in CommandArguments and RawableFactory
([#&#8203;3834](https://github.com/redis/jedis/issues/3834))
- Modify and fail-fast GeoSearchParam
([#&#8203;3827](https://github.com/redis/jedis/issues/3827))
- Bump org.apache.maven.plugins:maven-jar-plugin from 3.4.0 to 3.4.1
([#&#8203;3822](https://github.com/redis/jedis/issues/3822))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.3 to 3.2.4
([#&#8203;3823](https://github.com/redis/jedis/issues/3823))
- Bump org.apache.maven.plugins:maven-jar-plugin from 3.3.0 to 3.4.0
([#&#8203;3819](https://github.com/redis/jedis/issues/3819))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.2 to 3.2.3
([#&#8203;3818](https://github.com/redis/jedis/issues/3818))
- Add more tests for the CommandObjects class
([#&#8203;3809](https://github.com/redis/jedis/issues/3809))
- Resolve compile warnings
([#&#8203;3810](https://github.com/redis/jedis/issues/3810))
- Bump com.kohlschutter.junixsocket:junixsocket-core from 2.9.0 to 2.9.1
([#&#8203;3806](https://github.com/redis/jedis/issues/3806))
- Bump org.jacoco:jacoco-maven-plugin from 0.8.11 to 0.8.12
([#&#8203;3805](https://github.com/redis/jedis/issues/3805))
- Bump org.apache.maven.plugins:maven-source-plugin from 3.3.0 to 3.3.1
([#&#8203;3807](https://github.com/redis/jedis/issues/3807))
- Deprecate unused JSON.ARRAPPEND in CommandObjects
([#&#8203;3798](https://github.com/redis/jedis/issues/3798))
- Extensive unit tests for the CommandObjects class
([#&#8203;3796](https://github.com/redis/jedis/issues/3796))
- Add extensive tests for UnifiedJedis
([#&#8203;3788](https://github.com/redis/jedis/issues/3788))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.1 to 3.2.2
([#&#8203;3794](https://github.com/redis/jedis/issues/3794))
- Add Experimental, Internal and VisibleForTesting annotations
([#&#8203;3790](https://github.com/redis/jedis/issues/3790))
- Add TS.INFO \[DEGUB] and CF.MEXISTS in pipelined commands
([#&#8203;3787](https://github.com/redis/jedis/issues/3787))
- Bump org.apache.maven.plugins:maven-compiler-plugin from 3.12.1 to
3.13.0 ([#&#8203;3786](https://github.com/redis/jedis/issues/3786))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.2.0 to 3.2.1
([#&#8203;3785](https://github.com/redis/jedis/issues/3785))
- Pipelined tests for lists and sets, and API typo fix
([#&#8203;3772](https://github.com/redis/jedis/issues/3772))
- Extensive unit tests for PipeliningBase
([#&#8203;3778](https://github.com/redis/jedis/issues/3778))
- Bump jackson.version from 2.16.2 to 2.17.0
([#&#8203;3776](https://github.com/redis/jedis/issues/3776))
- Bump org.apache.maven.plugins:maven-gpg-plugin from 3.1.0 to 3.2.0
([#&#8203;3775](https://github.com/redis/jedis/issues/3775))
- Fix typo in SetPipelineCommands method name
([#&#8203;3773](https://github.com/redis/jedis/issues/3773))
- Streamline test execution
([#&#8203;3760](https://github.com/redis/jedis/issues/3760))
- Add pipelined tests for sorted sets
([#&#8203;3771](https://github.com/redis/jedis/issues/3771))
- Geo pipelined tests
([#&#8203;3767](https://github.com/redis/jedis/issues/3767))
- Reenable clustering tests
([#&#8203;3764](https://github.com/redis/jedis/issues/3764))
- GETSET command is deprecated since Redis 6.2.0
([#&#8203;3768](https://github.com/redis/jedis/issues/3768))
- Add tests for Stream pipelined commands
([#&#8203;3763](https://github.com/redis/jedis/issues/3763))
- Bump jackson.version from 2.16.1 to 2.16.2
([#&#8203;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)
([#&#8203;3752](https://github.com/redis/jedis/issues/3752))
- Add Hashes pipeline commands unit tests
([#&#8203;3288](https://github.com/redis/jedis/issues/3288))
- Add unit tests for pipelining - migrate and db commands
([#&#8203;3759](https://github.com/redis/jedis/issues/3759))
- Reduce the log level of validateObject to WARN
([#&#8203;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)
([#&#8203;3706](https://github.com/redis/jedis/issues/3706))
- Bump com.kohlschutter.junixsocket:junixsocket-core from 2.8.3 to 2.9.0
([#&#8203;3724](https://github.com/redis/jedis/issues/3724))
-   Running doctests also on emb-examples ([#&

</details>

GitOrigin-RevId: 8a275b1c484ffdcd889591afa909c0ac94f02667
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants