-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Deadlock while calling write-locked method from read-locked method #35136
Comments
Stacktrace showing the readLock and writeLock calls:
|
Yep, I was able to reproduce the problem easily... |
Hm, current impl doesn't really let us peek into the FTR, we are currently using
|
I'm not sure about the correctness but this fix based on |
You beat me to it, I was just trying out pretty much the same thing. I think it is correct as you only ask for hold count by current thread and renew that. |
Another thread might be able to acquire the write lock in the short span between the last read unlock and the write lock, which I think can cause concurrency issues if the read locked method expects only the method it calls to modify things and not someone else.
|
Perhaps take a look at StampedLock? It does have methods for atomically upgrading a read lock to a write lock (or back), although I guess the implementation would end up a bit more complex as it does not support reentrancy. |
I've added a |
- fixes quarkusio#35136 (cherry picked from commit e6c044e)
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.214.0` -> `^0.215.0`](https://renovatebot.com/diffs/npm/flow-bin/0.214.0/0.215.1) | | [org.liquibase:liquibase-maven-plugin](http://www.liquibase.org/liquibase-maven-plugin) ([source](https://github.com/liquibase/liquibase)) | build | patch | `4.23.0` -> `4.23.1` | | [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | minor | `3.2.3.Final` -> `3.3.0` | | [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | minor | `3.2.3.Final` -> `3.3.0` | | [org.apache.maven.plugins:maven-enforcer-plugin](https://maven.apache.org/enforcer/) | build | minor | `3.3.0` -> `3.4.0` | --- ### Release Notes <details> <summary>flowtype/flow-bin</summary> ### [`v0.215.1`](flow/flow-bin@a92ce80...cbb038f) [Compare Source](flow/flow-bin@a92ce80...cbb038f) ### [`v0.215.0`](flow/flow-bin@ca11e28...a92ce80) [Compare Source](flow/flow-bin@ca11e28...a92ce80) </details> <details> <summary>liquibase/liquibase</summary> ### [`v4.23.1`](https://github.com/liquibase/liquibase/blob/HEAD/changelog.txt#Liquibase-4231-is-a-patch-release) [Compare Source](liquibase/liquibase@v4.23.0...v4.23.1) </details> <details> <summary>quarkusio/quarkus</summary> ### [`v3.3.0`](https://github.com/quarkusio/quarkus/releases/tag/3.3.0) [Compare Source](quarkusio/quarkus@3.2.4.Final...3.3.0) ##### Complete changelog - [#​35350](quarkusio/quarkus#35350) - Fix package type system property clearing - [#​35348](quarkusio/quarkus#35348) - quarkus-maven-plugin runs native building even if the profile is commented out - [#​35343](quarkusio/quarkus#35343) - ArC: fix StackOverflowError in AutoAddScopeBuildItem - [#​35319](quarkusio/quarkus#35319) - Register arrays of Hibernate ORM's JDBC basic types for reflection - [#​35315](quarkusio/quarkus#35315) - Fix Datasource timing issues with Liquibase / Flyway and OpenTelemetry - [#​35314](quarkusio/quarkus#35314) - Regression in 3.3.0.CR1: Synthetic bean instance for io.opentelemetry.api.OpenTelemetry not initialized yet - [#​35312](quarkusio/quarkus#35312) - Updates Infinispan to 14.0.13.Final - [#​35308](quarkusio/quarkus#35308) - Lock jib execution to avoid OverlappingFileLockException in parallel builds - [#​35305](quarkusio/quarkus#35305) - Fix the titles of the tables in RESTEasy Reactive doc - [#​35302](quarkusio/quarkus#35302) - Docs: Mention wilcard support in resteasy reactive XML serialisation exclude classes configuration - [#​35301](quarkusio/quarkus#35301) - Fix potential NPE in quarkus-csrf-reactive when no MediaType is found - [#​35299](quarkusio/quarkus#35299) - Output build graph using `quarkus.builder.graph-output` property - [#​35285](quarkusio/quarkus#35285) - NullPointerException during http post request when quarkus-csrf-reactive extension is added to a project - [#​35283](quarkusio/quarkus#35283) - Upgrade proto-google-common-protos to 2.23.0 - [#​35282](quarkusio/quarkus#35282) - Avoid keeping references to BytecodeRecorderImpl - [#​35276](quarkusio/quarkus#35276) - Reinstate DevModeTestUtil to avoid breaking other projects that depend on it - [#​35273](quarkusio/quarkus#35273) - Fix small typo in comment - [#​35263](quarkusio/quarkus#35263) - Stop the recovery service while ArC is still around - [#​35245](quarkusio/quarkus#35245) - Add missing info to init Jobs - [#​35244](quarkusio/quarkus#35244) - Init Jobs are missing ServiceAccount and Image Pull Secrets - [#​35240](quarkusio/quarkus#35240) - Update SmallRye Health to 4.0.4 - [#​34071](quarkusio/quarkus#34071) - 3.1.1 Final - java.lang.IllegalArgumentException: Class java.util.UUID\[] is instantiated reflectively but was never registered - [#​32800](quarkusio/quarkus#32800) - Duplicated checks in health check response - [#​11903](quarkusio/quarkus#11903) - Gradle multimodule project + quarkus-container-image-jib: OverlappingFileLockException ### [`v3.2.4.Final`](https://github.com/quarkusio/quarkus/releases/tag/3.2.4.Final) [Compare Source](quarkusio/quarkus@3.2.3.Final...3.2.4.Final) ##### Complete changelog - [#​35300](quarkusio/quarkus#35300) - Fix `jandex-gradle-plugin-version` in CDI Reference - [#​35296](quarkusio/quarkus#35296) - Upgrade H2 to 2.2.220 - [#​35258](quarkusio/quarkus#35258) - CDI Reference 1.1 has incomplete information for gradle - [#​35255](quarkusio/quarkus#35255) - Quartz: QuarkusMSSQLDelegate should extends MSSQLDelegate - [#​35211](quarkusio/quarkus#35211) - Document Maven config options that may be relevant when running tests - [#​35203](quarkusio/quarkus#35203) - Pass Maven user settings when initializing artifact resolver - [#​35193](quarkusio/quarkus#35193) - OpenTelemetry service name should have higher priority than app name when no resource attributes are set - [#​35189](quarkusio/quarkus#35189) - Quarkus CLI fixes - [#​35188](quarkusio/quarkus#35188) - SmallRyeGraphQLOverWebSocketHandler: use order value > Integer.MIN_VALUE - [#​35181](quarkusio/quarkus#35181) - REST Data with Panache should not produce links when hal is disabled - [#​35174](quarkusio/quarkus#35174) - Ensure the narayana-jta extension fully shuts down the recovery manager - [#​35172](quarkusio/quarkus#35172) - Kafka Streams: restore the feature name at Quarkus startup - [#​35171](quarkusio/quarkus#35171) - kafka-streams: feature not listed on startup - [#​35165](quarkusio/quarkus#35165) - Propagate all user methods in REST Data with Panache - [#​35160](quarkusio/quarkus#35160) - Properly use internal links to point to other guides - [#​35140](quarkusio/quarkus#35140) - ArC: fix deadlock when calling guarded methods on the same thread - [#​35136](quarkusio/quarkus#35136) - Deadlock while calling write-locked method from read-locked method - [#​34908](quarkusio/quarkus#34908) - `@RouteFilter` stopped working with WebSocket requests Quarkus 3.2.0.Final - [#​34875](quarkusio/quarkus#34875) - Quarkus build does not work since 3.2.0 with teamcity/plexus launcher - [#​34713](quarkusio/quarkus#34713) - Option to track build configuration for changes between builds - [#​34576](quarkusio/quarkus#34576) - Live reload stopped working on 3.2 when using XA transactions - [#​34514](quarkusio/quarkus#34514) - Support `@WithUnnamedKey` in documentation - [#​34065](quarkusio/quarkus#34065) - Add support for project Java version update based on extensions - [#​33317](quarkusio/quarkus#33317) - OpenTelemetry SDK autoconfiguration ignores OTEL service name in favor of Quarkus app name - [#​15461](quarkusio/quarkus#15461) - Quarkus tests fails mTLS authentication against internal Maven repository </details> <details> <summary>quarkusio/quarkus-platform</summary> ### [`v3.3.0`](quarkusio/quarkus-platform@3.2.4.Final...3.3.0) [Compare Source](quarkusio/quarkus-platform@3.2.4.Final...3.3.0) ### [`v3.2.4.Final`](quarkusio/quarkus-platform@3.2.3.Final...3.2.4.Final) [Compare Source](quarkusio/quarkus-platform@3.2.3.Final...3.2.4.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. --- - [x] <!-- 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-->
…s-googlecloud-jsonlogging!17) This MR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [io.quarkus:quarkus-extension-processor](https://github.com/quarkusio/quarkus) | | minor | `3.2.3.Final` -> `3.3.0` | | [io.quarkus:quarkus-extension-maven-plugin](https://github.com/quarkusio/quarkus) | build | minor | `3.2.3.Final` -> `3.3.0` | | [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | minor | `3.2.3.Final` -> `3.3.0` | | [io.quarkus:quarkus-bom](https://github.com/quarkusio/quarkus) | import | minor | `3.2.3.Final` -> `3.3.0` | --- ### Release Notes <details> <summary>quarkusio/quarkus</summary> ### [`v3.3.0`](quarkusio/quarkus@3.2.4.Final...3.3.0) [Compare Source](quarkusio/quarkus@3.2.4.Final...3.3.0) ### [`v3.2.4.Final`](https://github.com/quarkusio/quarkus/releases/tag/3.2.4.Final) [Compare Source](quarkusio/quarkus@3.2.3.Final...3.2.4.Final) ##### Complete changelog - [#​35300](quarkusio/quarkus#35300) - Fix `jandex-gradle-plugin-version` in CDI Reference - [#​35296](quarkusio/quarkus#35296) - Upgrade H2 to 2.2.220 - [#​35258](quarkusio/quarkus#35258) - CDI Reference 1.1 has incomplete information for gradle - [#​35255](quarkusio/quarkus#35255) - Quartz: QuarkusMSSQLDelegate should extends MSSQLDelegate - [#​35211](quarkusio/quarkus#35211) - Document Maven config options that may be relevant when running tests - [#​35203](quarkusio/quarkus#35203) - Pass Maven user settings when initializing artifact resolver - [#​35193](quarkusio/quarkus#35193) - OpenTelemetry service name should have higher priority than app name when no resource attributes are set - [#​35189](quarkusio/quarkus#35189) - Quarkus CLI fixes - [#​35188](quarkusio/quarkus#35188) - SmallRyeGraphQLOverWebSocketHandler: use order value > Integer.MIN_VALUE - [#​35181](quarkusio/quarkus#35181) - REST Data with Panache should not produce links when hal is disabled - [#​35174](quarkusio/quarkus#35174) - Ensure the narayana-jta extension fully shuts down the recovery manager - [#​35172](quarkusio/quarkus#35172) - Kafka Streams: restore the feature name at Quarkus startup - [#​35171](quarkusio/quarkus#35171) - kafka-streams: feature not listed on startup - [#​35165](quarkusio/quarkus#35165) - Propagate all user methods in REST Data with Panache - [#​35160](quarkusio/quarkus#35160) - Properly use internal links to point to other guides - [#​35140](quarkusio/quarkus#35140) - ArC: fix deadlock when calling guarded methods on the same thread - [#​35136](quarkusio/quarkus#35136) - Deadlock while calling write-locked method from read-locked method - [#​34908](quarkusio/quarkus#34908) - `@RouteFilter` stopped working with WebSocket requests Quarkus 3.2.0.Final - [#​34875](quarkusio/quarkus#34875) - Quarkus build does not work since 3.2.0 with teamcity/plexus launcher - [#​34713](quarkusio/quarkus#34713) - Option to track build configuration for changes between builds - [#​34576](quarkusio/quarkus#34576) - Live reload stopped working on 3.2 when using XA transactions - [#​34514](quarkusio/quarkus#34514) - Support `@WithUnnamedKey` in documentation - [#​34065](quarkusio/quarkus#34065) - Add support for project Java version update based on extensions - [#​33317](quarkusio/quarkus#33317) - OpenTelemetry SDK autoconfiguration ignores OTEL service name in favor of Quarkus app name - [#​15461](quarkusio/quarkus#15461) - Quarkus tests fails mTLS authentication against internal Maven repository </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. 🔕 **Ignore**: Close this MR and you won't be reminded about these updates again. --- - [ ] <!-- 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-->
Describe the bug
When a method with io.quarkus.arc.Lock.Type.READ lock calls a (public) method in the same class with io.quarkus.arc.Lock.Type.WRITE, a deadlock occurs.
Expected behavior
I'd expect the read lock to be released and a write lock to be acquired until the method with write lock is finished, at which point a read lock is acquired again.
As an alternative the lock interceptor might be able to detect a deadlock will occur and immediately throw if the above option is difficult to implement.
Actual behavior
A deadlock occurs, as the call to the write method waits until all read locks are released, including the lock held by the thread itself.
How to Reproduce?
Run the test in the attached gradle project.
reproducer.zip
Output of
uname -a
orver
Linux devrd0 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.37-1 (2023-07-03) x86_64 GNU/Linux
Output of
java -version
openjdk version "11.0.20" 2023-07-18 LTS OpenJDK Runtime Environment Zulu11.66+15-CA (build 11.0.20+8-LTS) OpenJDK 64-Bit Server VM Zulu11.66+15-CA (build 11.0.20+8-LTS, mixed mode)
GraalVM version (if different from Java)
No response
Quarkus version or git rev
3.2.0.Final, also happens on 2.16.8.Final
Build tool (ie. output of
mvnw --version
orgradlew --version
)gradle 8.0.2
Additional information
Note that when both methods have the same lock type (either read or write) everything is fine.
The text was updated successfully, but these errors were encountered: