Skip to content

Conversation

rbygrave
Copy link
Contributor

@rbygrave rbygrave commented Oct 5, 2022

Referencing #1951 for outline / motivation which is to improve compatibility with loom.

Change PgStatement, PgPreparedStatement and PgCallableStatement replacing synchronized (this) blocks with use of ReentrantLock to be compatible with loom.

In doing this change for PgStatement this PR must include:

All synchronized (this) blocks in PgStatement
All synchronized (this) blocks in it's sub types (PgPreparedStatement and PgCallableStatement)
I confirm that this PR includes all synchronized (this) blocks across PgStatement and all it's sub types.

Note that this PR does not add any new tests or change any existing tests. I do not believe either is required.

@vlsi
Copy link
Member

vlsi commented Oct 6, 2022

The PR looks good to me, except there's still some synchronized (connection) { left in PgStatement.java: https://github.com/rbygrave/pgjdbc/blob/feature/1951-PgStatement-3/pgjdbc/src/main/java/org/postgresql/jdbc/PgStatement.java#L977-L984

Have you tried adjusting it as well?

I'm inclined we might get concurrency issues if we replace only a fraction of synchronizations on Statement with Lock.

@rbygrave
Copy link
Contributor Author

rbygrave commented Oct 6, 2022

synchronized (connection)

My intention was to leave those for now and do that change as a separate PR as they are a different lock - a lock on the connection instance rather than the statement.

If we want to include the change for the connection lock we could and there are a couple of things to note.

  • With the lock on connection we use .notifyAll() and .wait(). This is no problem as those are supported by ReentrantLock.
  • We need to decide how to expose the PgConnection lock to PgStatement. One option is change the PgStatement.connection type to PgConnection and then use a package private method on PgConnection. A second option is to add a method to the BaseConnection interface (which would be a public method so for myself I'd be less keen for this option).

We could do this change as an additional commit to this PR or a separate PR (or even hold off for now if that was desired).

get concurrency issues if we replace only a fraction of synchronizations

We need to specifically be careful wrt use of synchronized (somethingThatIsNotThis) ... like for example synchronized (connection). For example, in the "lock on connection" case we easily find all the uses inside of PgConnection (and subclasses if it had any) but we also search globally for code like synchronized (connection) and we need to be sure we find all the cases and this part is a manual search we need to do carefully.

In this case of the lock on PgStatement [and subclasses] we need to:

  • Change all synchronized methods in PgStatement and subclasses
  • Change all synchronized (this) in PgStatement and subclasses
  • Find all uses of the lock on PgStatement instances in the rest of the code by globally searching synchronized ( ... checking there are no cases of synchronized (statement) or similar [edit: and in this case there are no other uses of the lock]

So we do need to be careful but yes we can replace just the lock on PgStatement from synchronized to ReentrantLock and be very comfortable in doing that and leaving other locks like synchronized (connection) there unmodified.

@vlsi
Copy link
Member

vlsi commented Oct 6, 2022

Suppose there's a class:

class Counter {
  private int value;
  synchronized void increase() {
    value++;
  }
  synchronized void decrease() {
    value--;
  }
}

I would like to refrain from having two PRs that address increase and decrease methods separately because if we merge a PR that changes only increase from synchronized to ReentrantLock, then we basically get a broken class like:

class Counter {
  private int value;
  private Lock lock = new ReentrantLock();
  void increase() {
    lock.lock();
    try {
      value++;
    } finally {
      lock.unlock();
    }
  }
  synchronized void decrease() {
    value--;
  }
}

In that case, calling increase and decrease concurrently would break.

That is why I would rather prefer a single PR with multiple commits instead of multiple PRs that might result in a half-broken code. GitHub does allow clicking into individual commits that form the PR, so I believe PRs like https://github.com/GoogleCloudPlatform/app-gradle-plugin/pull/398/commits are reviewable.

Of course, there are cases when the change is a no-brainer. It might be fine to include them (and even merge) in a separate PRs. However, I would refrain from merging only a half of Statement or Connection-related synchronizations because it would make pgjdbc unreleasable until we merge all the changes.

@rbygrave
Copy link
Contributor Author

rbygrave commented Oct 6, 2022

Are we ok changing the type of PgStatement.connection to PgConnection from BaseConnection?

See my comment from "We need to decide how to expose the PgConnection lock to PgStatement."

@vlsi
Copy link
Member

vlsi commented Oct 7, 2022

By the way, @rbygrave , have you considered adding something like AutoCloseableLock extends ReentrantLock for patterns like try (ResourceLock ignored = obtainLock()) { ... }?

@rbygrave
Copy link
Contributor Author

rbygrave commented Oct 7, 2022

Not really no. The JDK devs could have added such support to the jdk but didn't so some hesitation from me due to that.

I think there are 2 approaches ...
A) a wrapper type (downside of extra instance per lock)
B) a type that extends ReentrantLock (downside, can be used incorrectly in try-with-resources)

We have a lot of lock code blocks so I can see the value of doing it (remove the finally blocks) but there does look to be a downside to both approaches as I see it.

Edit: FWIW right now my gut says keep it simple and stick with the finally blocks. Slightly ugly but simple and everyone immediately understands it. Happy to try an AutoClosableLock if you or others are keen.

@vlsi
Copy link
Member

vlsi commented Oct 7, 2022

B) a type that extends ReentrantLock (downside, can be used incorrectly in try-with-resources)

Could you please clarify what you mean by "can be used incorrectly"?
I think a pattern like "use locks in try-with-resources only" should be less prone to errors than "use raw Lock API" (e.g. one might forget to add finally).

Happy to try an AutoClosableLock if you or others are keen

I think it is a small addition that makes the code slightly easier to read/write, and it brings no downsides performance-wise.
We could have used withLock(() -> ...) pattern, however, it would incur overhead.

@rbygrave
Copy link
Contributor Author

rbygrave commented Oct 7, 2022

can be used incorrectly

With B) try (autoClosableLock) { will compile but be invalid - this is the way in which (B) can be used incorrectly. We always need to use a method like obtainLock() such that .lock() is called like: try (ResourceLock ignored = autoClosableLock.obtainLock()).

be less prone to errors than "use raw Lock API" (e.g. one might forget to add finally).

It's a compile error to add the try { ... } without a finally [or catch] so for myself I don't see that as less error prone. For example, when we replace the synchronized (this) { with the lock.lock(); try { ... we are always in effect adding a new try block so it will not compile without adding the finally. The only way to get it wrong is to add a catch () { } block instead of a finally { ... }. IntelliJ will have a little red marker showing us where the missing finally block needs to go.

Said another way, for this change we can never re-use an existing try { block - we always need to add a new try { ... so in that way the compiler tells us to add a finally { ... } [or catch (..) { .. }].

We could have used withLock(() -> ...)

Yes agreed, closure overhead there.

@rbygrave
Copy link
Contributor Author

Did that make sense @vlsi ? Are you still keen for us to create a ResourceLock extends ReentrantLock as per (B) and use it via try (ResourceLock ignored = lock.obtainLock()) { ... } and remove the finally blocks or keep it as it current is with the finally blocks?

@davecramer
Copy link
Member

@rbygrave seems @vlsi may be out of touch for a bit. I'd like to see this move forward. For now use what you think is right and if Vladimir strenuously objects later we can change it.

@vlsi
Copy link
Member

vlsi commented Oct 12, 2022

It's a compile error to add the try { ... } without a finally [or catch] so for myself I

The following would be a misuse of the lock API which would be impossible with try-with-resources.

lock.lock()
try {
    ...
} catch(SQLException e) {
    e.printStacktrace(); // or whatever
}

We always need to use a method like obtainLock() such that .lock() is called like: try (ResourceLock ignored = autoClosableLock.obtainLock()).

Well, there could be a private (or package-private) method obtainLock, so the usage would be as follows:

try (AutoClosable ignored = obtainLock()) {
    ...
}

@rbygrave
Copy link
Contributor Author

The following would be a misuse of the lock API

Yes agreed. That is what I said as well.

so the usage would be as follows:

Pretty much but I would suggest that obtainLock() would instead be lock.obtainLock() because we would not want to add a local helper method on each and every type that we use a "ResourceLock" so I'd suggest it would end up as:

try (AutoClosable ignored = lock.obtainLock()) {
    ...
}

For myself, my gut says that I'd prefer being more explicit using ResourceLock rather than AutoClosable like:

try (ResourceLock ignored = lock.obtainLock()) {
    ...
}

... as I think that would be clearer / more explicit about what's going on for folks reading the code in the future.

For myself, I'm happy if we take a day or two for everyone to be comfortable with the style we want to use going forward because it's going to be repeated a lot. Of course we can change our minds later on but yeah happy to get good comfort levels with the style and approach first - a few days isn't going to hurt us.

Currently our question is, are we keen to create a ResourceLock extends ReentrantLock implements AutoClosable as per (B) and use it via try (AutoClosable ignored = lock.obtainLock()) { ... } and remove the finally blocks or keep it as it currently is with the finally blocks?

For me I'm happy either way. I could even make that change using a ResourceLock and push another commit and then everyone gets to see both styles explicitly. If we don't like it we could just remove that last commit. Should we do that?

@rbygrave
Copy link
Contributor Author

Hi @vlsi @davecramer and anyone else participating here. Just checking in on ...

Are we keen to create a ResourceLock extends ReentrantLock implements AutoClosable as per (B)?
Do you want me to push another commit with that approach or keen to go with what we have with the finally blocks?

Cheers, Rob.

@vlsi
Copy link
Member

vlsi commented Oct 18, 2022

I incline to ResourceLock extends ReentrantLock implements AutoClosable.

@davecramer
Copy link
Member

I incline to ResourceLock extends ReentrantLock implements AutoClosable.

I'll defer to @vlsi as I am not an expert in this area

@rbygrave
Copy link
Contributor Author

Ok, added ResourceLock and using that with try-with-resources. Let me know what you think.

@rbygrave
Copy link
Contributor Author

Had a chance to look at it yet?

@vlsi
Copy link
Member

vlsi commented Oct 21, 2022

Had a chance to look at it yet?

In general, I like how it all goes, however, there are test failures, so I did not look closely.
Do you think you could figure out the reason for the test failures?

@davecramer
Copy link
Member

I'm surprised our code style check doesn't pick up on the lack of the header in ResourceLock and ResourceLockTest

@vlsi
Copy link
Member

vlsi commented Nov 8, 2022

I'm surprised our code style check doesn't pick up on the lack of the header in ResourceLock and ResourceLockTest

By default it prints limited number of warnings into the console to keep the log manageable/readable: https://github.com/pgjdbc/pgjdbc/actions/runs/3279472138/jobs/5613343062#step:4:288

For instance, if someone accidentally commits "change all LF to CRLF line endings", then we don't want to get a ton of lines with wrong line endings.

@Powerrr
Copy link
Contributor

Powerrr commented Dec 1, 2022

Do you think you could figure out the reason for the test failures?

I believe this happens because of incorrect Lock API usage: we shoudn't use .wait()/.notify() on locks - these methods are inherited from Object and are using the same object monitor as synchronized blocks.
It seems that the correct way is to use the Condition object that can be obtained using lock.newCondition(), something like

final ReentrantLock lock = new ReentrantLock();
final Condition lockCondition = lock.newCondition();

void foo() {
  lock.lock();
  try {
    lockCondition.await();
    // or
    lockCondition.signal();
  } finally {
    lock.unlock();
  }
}

And since we need only one Condition per lock (the substitute for the object monitor), we can add it to the ResourceLock helper:

public final class ResourceLock extends ReentrantLock implements AutoCloseable {
  private final Condition condition = this.newCondition();

  // add either the getter for the condition field or even some wrapper methods, for example:
  public void await() throws InterruptedException {
    condition.await();
  }

  //...
}

@gavlyukovskiy
Copy link

Hi, just a heads up - I've tried running some loom tests on this PR with -Djdk.tracePinnedThreads=full and virtual threads still pin on synchronized methods inside QueryExecutorImpl:

    org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:356) <== monitors:1
    org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:497)
    org.postgresql.jdbc.PgStatement.execute(PgStatement.java:414)
    org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190)
    org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:134)
    com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
Full stacktrace:
Thread[#67,ForkJoinPool-1-worker-1,5,CarrierThreads]
    java.base/java.lang.VirtualThread$VThreadContinuation.onPinned(VirtualThread.java:180)
    java.base/jdk.internal.vm.Continuation.onPinned0(Continuation.java:398)
    java.base/jdk.internal.vm.Continuation.yield0(Continuation.java:390)
    java.base/jdk.internal.vm.Continuation.yield(Continuation.java:357)
    java.base/java.lang.VirtualThread.yieldContinuation(VirtualThread.java:370)
    java.base/java.lang.VirtualThread.park(VirtualThread.java:499)
    java.base/java.lang.System$2.parkVirtualThread(System.java:2596)
    java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:54)
    java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:369)
    java.base/sun.nio.ch.Poller.poll2(Poller.java:139)
    java.base/sun.nio.ch.Poller.poll(Poller.java:102)
    java.base/sun.nio.ch.Poller.poll(Poller.java:87)
    java.base/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:175)
    java.base/sun.nio.ch.NioSocketImpl.park(NioSocketImpl.java:196)
    java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:304)
    java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:340)
    java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:789)
    java.base/java.net.Socket$SocketInputStream.read(Socket.java:1025)
    org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:161)
    org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:128)
    org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:113)
    org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73)
    org.postgresql.core.PGStream.receiveChar(PGStream.java:453)
    org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2120)
    org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:356) <== monitors:1
    org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:497)
    org.postgresql.jdbc.PgStatement.execute(PgStatement.java:414)
    org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190)
    org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:134)
    com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52)
    com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java)
    com.github.gavlyukovskiy.app.PostgresRepository.getWorld(SpringWebApplication.kt:85)
    com.github.gavlyukovskiy.app.Controller$db$1.invoke(SpringWebApplication.kt:144)
    com.github.gavlyukovskiy.app.Controller$db$1.invoke(SpringWebApplication.kt:144)
    com.github.gavlyukovskiy.app.Controller.record(SpringWebApplication.kt:152)
    com.github.gavlyukovskiy.app.Controller.db(SpringWebApplication.kt:144)
    java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    java.base/java.lang.reflect.Method.invoke(Method.java:578)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:207)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:152)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1080)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:895)
    jakarta.servlet.http.HttpServlet.service(HttpServlet.java:500)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:880)
    jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
    org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
    org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739)
    org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
    java.base/java.util.concurrent.ThreadPerTaskExecutor$TaskRunner.run(ThreadPerTaskExecutor.java:314)
    java.base/java.lang.VirtualThread.run(VirtualThread.java:287)
    java.base/java.lang.VirtualThread$VThreadContinuation.lambda$new$0(VirtualThread.java:174)
    java.base/jdk.internal.vm.Continuation.enter0(Continuation.java:327)
    java.base/jdk.internal.vm.Continuation.enter(Continuation.java:320)

@rbygrave
Copy link
Contributor Author

rbygrave commented Dec 4, 2022

Hi, just a heads up - ... and virtual threads still pin on synchronized methods inside QueryExecutorImpl

Yes. I had a "next change" to push which includes QueryExecutorImpl, QueryExecutorBase and CopyOperationImpl. If people are happy with what we have so far I can push this as an extra commit to this PR or another separate PR. The changes here are the expected/mechanical changes + a change to CopyOperationImpl.isActive() where I have added a helper method and people reading the diff might need to look twice etc (I'll add a comment into the PR to point this bit out).

If this next workflow run goes all green (style fixes for imports and checkerframework suppress warning) and if everyone is happy with it we can choose to add those changes as another commit to this PR or create a separate PR.

@rbygrave
Copy link
Contributor Author

rbygrave commented Dec 4, 2022

This PR is ready to run again @davecramer @vlsi - I have fixed the style and checkerframework issues (and this time, I have run those all locally to ensure I got those correct touch wood)

@apatrida
Copy link

apatrida commented Feb 5, 2023

@vlsi nor does Heinz share the benchmark, odd.

@vlsi vlsi added the minor label Feb 18, 2023
@rbygrave rbygrave deleted the feature/1951-PgStatement-3 branch February 19, 2023 06:21
benkard added a commit to benkard/mulkcms2 that referenced this pull request Apr 4, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [flow-bin](https://github.com/flowtype/flow-bin) ([changelog](https://github.com/facebook/flow/blob/master/Changelog.md)) | devDependencies | minor | [`^0.201.0` -> `^0.203.0`](https://renovatebot.com/diffs/npm/flow-bin/0.201.0/0.203.1) |
| [com.rometools:rome](http://rometools.com) ([source](https://github.com/rometools/rome)) | compile | minor | `2.0.0` -> `2.1.0` |
| [org.postgresql:postgresql](https://jdbc.postgresql.org) ([source](https://github.com/pgjdbc/pgjdbc)) | build | minor | `42.5.4` -> `42.6.0` |
| [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) | build | minor | `2.34.0` -> `2.35.0` |
| [org.apache.maven.plugins:maven-resources-plugin](https://maven.apache.org/plugins/) | build | patch | `3.3.0` -> `3.3.1` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | patch | `2.16.4.Final` -> `2.16.6.Final` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `2.16.4.Final` -> `2.16.6.Final` |

---

### Release Notes

<details>
<summary>flowtype/flow-bin</summary>

### [`v0.203.1`](flow/flow-bin@0c16b26...5e0645d)

[Compare Source](flow/flow-bin@0c16b26...5e0645d)

### [`v0.203.0`](flow/flow-bin@861f798...0c16b26)

[Compare Source](flow/flow-bin@861f798...0c16b26)

### [`v0.202.1`](flow/flow-bin@2b48bba...861f798)

[Compare Source](flow/flow-bin@2b48bba...861f798)

### [`v0.202.0`](flow/flow-bin@86aea9c...2b48bba)

[Compare Source](flow/flow-bin@86aea9c...2b48bba)

</details>

<details>
<summary>rometools/rome</summary>

### [`v2.1.0`](https://github.com/rometools/rome/releases/tag/2.1.0)

[Compare Source](rometools/rome@2.0.0...2.1.0)

<!-- Release notes generated using configuration in .github/release.yml at 2.1.0 -->

#### What's Changed

##### ⭐ New Features

-   Downgrade Java from version 11 to 8 by [@&#8203;PatrickGotthard](https://github.com/PatrickGotthard) in rometools/rome#642
-   Add support for GraalVM native images by [@&#8203;artembilan](https://github.com/artembilan) in rometools/rome#636

##### 🔨 Dependency Upgrades

-   Bump maven-compiler-plugin from 3.10.1 to 3.11.0 by [@&#8203;dependabot](https://github.com/dependabot) in rometools/rome#635

##### 🧹 Cleanup

-   Remove unused config files by [@&#8203;PatrickGotthard](https://github.com/PatrickGotthard) in rometools/rome#632
-   Polish GitHub workflows by [@&#8203;PatrickGotthard](https://github.com/PatrickGotthard) in rometools/rome#633
-   Polish code by [@&#8203;antoniosanct](https://github.com/antoniosanct) in rometools/rome#631

##### ✔ Other Changes

-   Update configuration for automatically generated release notes by [@&#8203;PatrickGotthard](https://github.com/PatrickGotthard) in rometools/rome#634

#### New Contributors

-   [@&#8203;artembilan](https://github.com/artembilan) made their first contribution in rometools/rome#636

**Full Changelog**: rometools/rome@2.0.0...2.1.0

</details>

<details>
<summary>pgjdbc/pgjdbc</summary>

### [`v42.6.0`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#&#8203;4260-2023-03-17-153434--0400)

##### Changed

fix: use PhantomReferences instead of `Obejct.finalize()` to track Connection leaks [MR #&#8203;2847](pgjdbc/pgjdbc#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 [MR #&#8203;2635](pgjdbc/pgjdbc#2635)
Fixes [Issue #&#8203;1951](pgjdbc/pgjdbc#1951)

</details>

<details>
<summary>diffplug/spotless</summary>

### [`v2.35.0`](https://github.com/diffplug/spotless/blob/HEAD/CHANGES.md#&#8203;2350---2023-02-10)

##### Added

-   CleanThat Java Refactorer. ([#&#8203;1560](diffplug/spotless#1560))
-   Introduce `LazyArgLogger` to allow for lazy evaluation of log messages in slf4j logging. ([#&#8203;1565](diffplug/spotless#1565))

##### Fixed

-   Allow multiple instances of the same npm-based formatter to be used by separating their `node_modules` directories. ([#&#8203;1565](diffplug/spotless#1565))
-   `ktfmt` default style uses correct continuation indent. ([#&#8203;1562](diffplug/spotless#1562))

##### Changes

-   Bump default `ktfmt` version to latest `0.42` -> `0.43` ([#&#8203;1561](diffplug/spotless#1561))
-   Bump default `jackson` version to latest `2.14.1` -> `2.14.2` ([#&#8203;1536](diffplug/spotless#1536))

</details>

<details>
<summary>quarkusio/quarkus</summary>

### [`v2.16.6.Final`](https://github.com/quarkusio/quarkus/releases/tag/2.16.6.Final)

[Compare Source](quarkusio/quarkus@2.16.5.Final...2.16.6.Final)

##### Complete changelog

-   [#&#8203;32319](quarkusio/quarkus#32319) - \[2.16] Revert io.netty.noUnsafe change
-   [#&#8203;32302](quarkusio/quarkus#32302) - Qute - fix validation of expressions with the "cdi" namespace
-   [#&#8203;32253](quarkusio/quarkus#32253) - (2.16) Upgrade to graphql-java 19.4
-   [#&#8203;32223](quarkusio/quarkus#32223) - (2.16) Upgrade wildfly-elytron to 1.20.3.Final
-   [#&#8203;32110](quarkusio/quarkus#32110) - Prevent splitting of cookie header values when using AWS Lambda
-   [#&#8203;32107](quarkusio/quarkus#32107) - Fix Podman detection on Windows
-   [#&#8203;32106](quarkusio/quarkus#32106) - Native building with container: Podman not detected on Windows
-   [#&#8203;32093](quarkusio/quarkus#32093) - Re-use current ApplicationModel for JaCoCo reports when testing Gradle projects
-   [#&#8203;32090](quarkusio/quarkus#32090) - K8s moved its registry
-   [#&#8203;32088](quarkusio/quarkus#32088) - Remove the session cookie if ID token verification failed
-   [#&#8203;32082](quarkusio/quarkus#32082) - Add missing quote in Hibernate Reactive with Panache guide
-   [#&#8203;32079](quarkusio/quarkus#32079) - Quarkus JaCoCo extension fails to start Gradle daemon
-   [#&#8203;32058](quarkusio/quarkus#32058) - Allow use of null in REST Client request body
-   [#&#8203;32047](quarkusio/quarkus#32047) - rest client reactive throws npe on null request body
-   [#&#8203;32041](quarkusio/quarkus#32041) - K8s is moving it's images
-   [#&#8203;32037](quarkusio/quarkus#32037) - Set-Cookie Header is Split when using OIDC together with AWS Lambda
-   [#&#8203;32015](quarkusio/quarkus#32015) - Support repeatable Incomings annotation for reactive messaging
-   [#&#8203;32002](quarkusio/quarkus#32002) - Quarkus: Kafka Event Processor with 2 `@incoming` annotations throws Null Pointer SRMSG00212
-   [#&#8203;31984](quarkusio/quarkus#31984) - Only substitute OctetKeyPair\* classes when on the classpath
-   [#&#8203;31978](quarkusio/quarkus#31978) - Remove quarkus.hibernate-orm.database.generation=drop-and-create from Hibernate ORM codestart
-   [#&#8203;31930](quarkusio/quarkus#31930) - Native build fails for JWT
-   [#&#8203;31893](quarkusio/quarkus#31893) - Docker or Podman required for tests since 3.0.0.Alpha6
-   [#&#8203;31857](quarkusio/quarkus#31857) - Container runtime detection cached in sys prop, container-docker extension
-   [#&#8203;31811](quarkusio/quarkus#31811) - Check the expiry date for inactive OIDC tokens
-   [#&#8203;31717](quarkusio/quarkus#31717) - Quarkus OIDC Session Cookie not deleted in case of 401 unauthorized
-   [#&#8203;31714](quarkusio/quarkus#31714) - OIDC token refresh fails with 401, if user info is used and not available in the cache (anymore)
-   [#&#8203;31662](quarkusio/quarkus#31662) - Warning when docker is not running
-   [#&#8203;31525](quarkusio/quarkus#31525) - Bump Keycloak version to 21.0.1
-   [#&#8203;31490](quarkusio/quarkus#31490) - Enable Podman and Docker Windows quarkus-container-image-docker testing
-   [#&#8203;31307](quarkusio/quarkus#31307) - Native Build on Windows has incorrect resource slashes
-   [#&#8203;30383](quarkusio/quarkus#30383) - Create a new base classloader including parent-first test scoped dependencies when bootstrapping for CT

### [`v2.16.5.Final`](https://github.com/quarkusio/quarkus/releases/tag/2.16.5.Final)

[Compare Source](quarkusio/quarkus@2.16.4.Final...2.16.5.Final)

##### Complete changelog

-   [#&#8203;31959](quarkusio/quarkus#31959) - New home for Narayana LRA coordinator Docker images
-   [#&#8203;31931](quarkusio/quarkus#31931) - Support raw collections in RESTEasy Reactive server and client
-   [#&#8203;31922](quarkusio/quarkus#31922) - Add more lenient Liquibase ZipPathHandler to work around includeAll not working in prod mode
-   [#&#8203;31904](quarkusio/quarkus#31904) - \[2.16] Upgrade SmallRye GraphQL to 1.9.4
-   [#&#8203;31894](quarkusio/quarkus#31894) - Supply missing extension metadata for reactive keycloak client
-   [#&#8203;31891](quarkusio/quarkus#31891) - Fix truststore REST Client config when password is not set
-   [#&#8203;31867](quarkusio/quarkus#31867) - Qute type-safe fragments - fix validation for loop metadata and globals
-   [#&#8203;31866](quarkusio/quarkus#31866) -  The behavior of the `@RestHeader` annotation is different from the `@HeaderParam` annotation when the parameter is of type List
-   [#&#8203;31864](quarkusio/quarkus#31864) - Fix incorrect generic type passed to MessageBodyWriter#writeTo
-   [#&#8203;31818](quarkusio/quarkus#31818) - Jackson JAX-RS YAML Provider for Resteasy Reactive
-   [#&#8203;31804](quarkusio/quarkus#31804) - \[2.16] A test to make sure non-existing modules are ignored during workspace discovery
-   [#&#8203;31793](quarkusio/quarkus#31793) - \[2.16] Fix NPE loading workspace modules
-   [#&#8203;31770](quarkusio/quarkus#31770) - Fix native compilation when using quarkus-jdbc-oracle with elasticsearch-java
-   [#&#8203;31769](quarkusio/quarkus#31769) - Capability added for quarkus-rest-client-reactive-jackson
-   [#&#8203;31756](quarkusio/quarkus#31756) - quarkus-rest-client-reactive-jackson doesn't provide capabilities
-   [#&#8203;31728](quarkusio/quarkus#31728) - Register additional cache implementations for reflection
-   [#&#8203;31718](quarkusio/quarkus#31718) - Properly close metadata file in integration tests
-   [#&#8203;31713](quarkusio/quarkus#31713) - "Too many open files" When test native image.
-   [#&#8203;31712](quarkusio/quarkus#31712) - Make request scoped beans work properly in ReaderInterceptors
-   [#&#8203;31705](quarkusio/quarkus#31705) - Remove all dev services for kubernetes dependencies from kubernetes-client-internal
-   [#&#8203;31692](quarkusio/quarkus#31692) - RequestScoped context not active when using a ReaderInterceptor with large HTTP requests
-   [#&#8203;31688](quarkusio/quarkus#31688) - Suppress config changed warning for quarkus.test.arg-line
-   [#&#8203;31643](quarkusio/quarkus#31643) - Fix iterator issue when executing a zrange with score on a missing key
-   [#&#8203;31626](quarkusio/quarkus#31626) - quarkus.test.arg-line has become a built-time fixed property in 2.16.4
-   [#&#8203;31624](quarkusio/quarkus#31624) - native compilation : quarkus-jdbc-oracle with elasticsearch-java strange behaviour
-   [#&#8203;31617](quarkusio/quarkus#31617) - Bump Stork version 1.4.2
-   [#&#8203;31579](quarkusio/quarkus#31579) - Reinitialize sun.security.pkcs11.P11Util at runtime
-   [#&#8203;31560](quarkusio/quarkus#31560) - Prevent SSE writing from potentially causing accumulation of headers
-   [#&#8203;31559](quarkusio/quarkus#31559) - `SseUtil` unexpectedly stores headers in `Serialisers.EMPTY_MULTI_MAP`
-   [#&#8203;31551](quarkusio/quarkus#31551) - Scheduler - detect scheduled methods of the same name on a class
-   [#&#8203;31547](quarkusio/quarkus#31547) - Scheduler - it's possible to declare two scheduled methods of the same name on the same class
-   [#&#8203;31545](quarkusio/quarkus#31545) - Append System.lineSeparator() to config error messages
-   [#&#8203;31536](quarkusio/quarkus#31536) - Missing newline characters in config error message
-   [#&#8203;31532](quarkusio/quarkus#31532) - Interpret negative/zero body-limit as infinite when logging REST Client request body
-   [#&#8203;31523](quarkusio/quarkus#31523) - Request rejected by CORS for fonts in dev UI when `quarkus.http.cors=true` is set
-   [#&#8203;31496](quarkusio/quarkus#31496) - Filter out RESTEasy related warning in ProviderConfigInjectionWarningsTest
-   [#&#8203;31482](quarkusio/quarkus#31482) - Remove incorrect default value for keepAliveEnabled
-   [#&#8203;31440](quarkusio/quarkus#31440) - Several quarkus integration tests fail to compile to native with latest GraalVM master
-   [#&#8203;31384](quarkusio/quarkus#31384) - Ignore required documentation for `@ConfigMapping` default methods
-   [#&#8203;30757](quarkusio/quarkus#30757) - Allow same origin CORS requests without 3rd party origins being configured
-   [#&#8203;30744](quarkusio/quarkus#30744) - \[Quarkus Native] ClassNotFoundException: com.github.benmanes.caffeine.cache.SSSW
-   [#&#8203;30698](quarkusio/quarkus#30698) - CORS Request same origin ignored if no other origin set

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v2.16.6.Final`](quarkusio/quarkus-platform@2.16.5.Final...2.16.6.Final)

[Compare Source](quarkusio/quarkus-platform@2.16.5.Final...2.16.6.Final)

### [`v2.16.5.Final`](quarkusio/quarkus-platform@2.16.4.Final...2.16.5.Final)

[Compare Source](quarkusio/quarkus-platform@2.16.4.Final...2.16.5.Final)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This MR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
wendigo added a commit to wendigo/trino that referenced this pull request Apr 15, 2023
This version introduces Loom-friendly synchronization (pgjdbc/pgjdbc#2635)
electrum pushed a commit to trinodb/trino that referenced this pull request Apr 18, 2023
This version introduces Loom-friendly synchronization (pgjdbc/pgjdbc#2635)
@jerometambo
Copy link

Hi, there is still some synchronized occurences (in core/v3/QueryExecutorImpl.java and util/LazyCleaner.java). Is it safe to use pgjdbc in multithread execution with Java 21 without potential performance issues ?

@vlsi
Copy link
Member

vlsi commented Mar 12, 2024

Java 21 supports synchronized, so go ahead and use pgjdbc with Java 21

@jerometambo
Copy link

jerometambo commented Mar 12, 2024

Yes but what if we start using Virtual Threads (cf. https://blog.fastthread.io/2023/02/28/pitfalls-to-avoid-when-switching-to-virtual-threads/ for example) ?

@rob-bygrave
Copy link

rob-bygrave commented Mar 13, 2024

The use of synchronised in QueryExecutorImpl is not an issue for Virtual Threads.

Looking at: https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java#L2967-L3040 ... we note there is that there is nothing executed INSIDE the synchronized blocks (like IO etc) that would park a Virtual Thread. That is, the code executed inside the synchronised blocks are just manipulations of the local useBinaryReceiveForOids HashSet to no Virtual Thread parking will incur in there and so this is all fine.

LazyCleaner to me is similar apart from the method https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/util/LazyCleaner.java#L105-L169 which includes Thread thread = threadFactory.newThread(new Runnable() { .... The question here is, could a Virtual Thread park with the threadFactory.newThread() call? For myself I'm not sure.

Note: For myself, I do have applications using Virtual Threads (via Helidon 4.x so all requests are using Virtual Threads for these apps) and these apps have all been working fine - I've observed no issues with thread pinning etc. Not sure if that is because threadFactory.newThread() doesn't park VT or more if I've been lucky somehow.

Q: Can we confirm if threadFactory.newThread() can park a virtual thread?
Q: Do we want to change LazyCleaner over to ReentrantLock just to be safer?

@davecramer
Copy link
Member

The use of synchronised in QueryExecutorImpl is not an issue for Virtual Threads.

Looking at: https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java#L2967-L3040 ... we note there is that there is nothing executed INSIDE the synchronized blocks (like IO etc) that would park a Virtual Thread. That is, the code executed inside the synchronised blocks are just manipulations of the local useBinaryReceiveForOids HashSet to no Virtual Thread parking will incur in there and so this is all fine.

LazyCleaner to me is similar apart from the method https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/util/LazyCleaner.java#L105-L169 which includes Thread thread = threadFactory.newThread(new Runnable() { .... The question here is, could a Virtual Thread park with the threadFactory.newThread() call? For myself I'm not sure.

Note: For myself, I do have applications using Virtual Threads (via Helidon 4.x so all requests are using Virtual Threads for these apps) and these apps have all been working fine - I've observed no issues with thread pinning etc. Not sure if that is because threadFactory.newThread() doesn't park VT or more if I've been lucky somehow.

Q: Can we confirm if threadFactory.newThread() can park a virtual thread? Q: Do we want to change LazyCleaner over to ReentrantLock just to be safer?

Are there any issues with changing this to ReentrantLock ?

I have no objections. Ideally Java 8 goes away (haha) and we get rid of this code :)

@vlsi
Copy link
Member

vlsi commented Mar 15, 2024

Q: Can we confirm if threadFactory.newThread() can park a virtual thread?

I think it should not park. It is just creating a new thread, see

this(threadTtl, runnable -> {
Thread thread = new Thread(runnable, threadName);
thread.setDaemon(true);
return thread;
});

Q: Do we want to change LazyCleaner over to ReentrantLock just to be safer?

I'm +-0 on that. Of course, as we already use ReentrantLock, it should not be much worse if we refactor LazyCleaner. It would deviate from the original source though.

svc-squareup-copybara pushed a commit to cashapp/misk that referenced this pull request 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

Successfully merging this pull request may close these issues.

10 participants