[jdk17] RFR: 8269865: Async UL needs to handle ERANGE on exceeding SEM_VALUE_MAX

David Holmes dholmes at openjdk.java.net
Tue Jul 6 07:16:48 UTC 2021


On Tue, 6 Jul 2021 06:43:24 GMT, Xin Liu <xliu at openjdk.org> wrote:

> This patch solved the sempahore overflow issue with errno ERANGE or EOVERFLOW.
> Previously, we have asymmetric p/v operations for semaphore _sem. Each iteration
> only decrements _sem 1 but dequeues N messages. If logging threads keep preempting
> async logging thread, it may cause the value of _sem accumulates until overflow! 
> 
> The patch corrects the value of _sem after write(). n messages are dequeued/processed.
> We need to invoke _sem.wait() max(n-1, 1) time. This ensures that each iteration
> decrements n instead of 1.

Hi Xin,

I wasn't expecting to see an attempt to balance the semaphore count on each write, but this seems to be okay.

One simplification suggested below.

Thanks,
David

src/hotspot/share/logging/logAsyncWriter.cpp line 163:

> 161: 
> 162:     int n = write();
> 163:     for (int i = n - 1; i > 0; --i) {

`while (--n > 0) { // pre-decrement as we already performed the first wait`

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

Marked as reviewed by dholmes (Reviewer).

PR: https://git.openjdk.java.net/jdk17/pull/216


More information about the hotspot-runtime-dev mailing list