RFR: 8349755: Fix corner case issues in async UL [v6]

Johan Sjölen jsjolen at openjdk.org
Tue Feb 11 17:25:59 UTC 2025


> Hi,
> 
> There are a few corner-cases when logging with asynchronous UL, all of which I'd like to fix with this PR.
> 
> 1. If the `AsyncLogWriter`  produces a log message,  then it'll deadlock as it'll wait for itself to release the `AsyncLogLock`.
> 2. If a producing thread produces another log message while enqueueing, then a deadlock will occur
> 
> We fix this by keeping a thread as the owner of the lock. If the lock is owned by the current thread, then we resort to synchronous logging.
> 
> Note, this fix introduces a third case:
> 
> 3. If an unattached thread logs then there is no identity, so we cannot check if it holds the lock. We must therefore resort to synchronous logging in this case also
> 
> In UL, we have so far guaranteed Program-Order log message appearance. In other words, `log("A"); log("B");` is guaranteed to always appear in the order `AB` in the log output. For cases 1 and 3, we still keep this guarantee. However, for case 2 we break this guarantee. The recursive log message will appear before any unflushed log messages from the logging thread. As I see no simple way  of fixing this, along with the fact that this is highly unlikely to ever occur (this has never been observed in production), I've decided to break that guarantee and prioritize logs not being missing.
> 
> As it's preferable that we do not have recursive logging (as in case 2 and partially in case 1), I've decided to `assert` that these should not hold. In debug systems, during testing, we can find any accidental recursive logging. In production systems, we will handle this correctly by going back to synchronous logging.
> 
> Testing: GHA only, so far.
> 
> All the best,
> Johan

Johan Sjölen has updated the pull request incrementally with one additional commit since the last revision:

  Add log_debug for other type of enqueue also

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/23513/files
  - new: https://git.openjdk.org/jdk/pull/23513/files/c1c2ee7d..02b0d737

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=23513&range=05
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=23513&range=04-05

  Stats: 1 line in 1 file changed: 1 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/23513.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/23513/head:pull/23513

PR: https://git.openjdk.org/jdk/pull/23513


More information about the hotspot-runtime-dev mailing list