RFR: 8241456: ThreadRunner shouldn't use Wicket for threads starting synchronization
David Holmes
david.holmes at oracle.com
Thu Apr 2 04:18:26 UTC 2020
Looks good - thanks Leonid.
David
On 2/04/2020 12:17 pm, Leonid Mesnik wrote:
> Find new version (updated webrev.00 by mistake)
>
> http://cr.openjdk.java.net/~lmesnik/8241456/webrev.00/
>
> The moving lock.lock() outside of try is required to don't get
> IllegalStateException.
>
> And avoiding locks in ThreadRunner is needed to avoid OOME.
>
> Leonid
>
> On 3/26/20 4:41 PM, Leonid Mesnik wrote:
>>
>> On 3/26/20 4:29 PM, David Holmes wrote:
>>> On 27/03/2020 9:16 am, Leonid Mesnik wrote:
>>>>
>>>> On 3/26/20 4:06 PM, David Holmes wrote:
>>>>> Hi Leonid,
>>>>>
>>>>> On 27/03/2020 7:39 am, Leonid Mesnik wrote:
>>>>>> Replying with correct summary.
>>>>>>
>>>>>> Leonid
>>>>>>
>>>>>> On 3/23/20 8:55 PM, Leonid Mesnik wrote:
>>>>>>> Hi
>>>>>>>
>>>>>>> Could you please review following fix which update ThreadsRunner
>>>>>>> to use AtomicInteger/spinOnWait instead of Wicket to synchronize
>>>>>>> starting of stress test threads.
>>>>>>>
>>>>>>> Failing tests allocated all memory by earlier started threads
>>>>>>> before Lock.unlock is called in the latest threads. So thread
>>>>>>> might get an OOME exception while trying to release lock and/or
>>>>>>> get into inconsistent state.
>>>>>
>>>>> You have a bug in Wicket:
>>>>>
>>>>> + try {
>>>>> + lock.lock();
>>>>> ...
>>>>> + } finally {
>>>>> + lock.unlock();
>>>>>
>>>>> The lock() has to go outside the try block. That is why you were
>>>>> getting IllegalMonitorStateExceptions when the lock() threw OOME.
>>>> Thanks for explanation. But anyway, as I understand locks use memory
>>>> and might be inconsistent if OOME happened.
>>>
>>> They use memory and so lock() can throw OOME, but they are never
>>> inconsistent.
>> Ok, I will move lock.lock() outside of try {}. Thanks for explanation.
>>>
>>>>>
>>>>> But the OOME itself is still a problem as it means you can't use
>>>>> any proper synchronizer. I don't like seeing the spin-loops but in
>>>>> this code you may have no choice if memory may already be exhausted.
>>>>
>>>> It should be really short spin-loop, test only start thread during
>>>> this loop and don't do anything more. Also, it is done only once for
>>>> all stress test. The goal is to start thread completely before heap
>>>> is exhausted.
>>>
>>> Okay. I'm somewhat dubious about making these changes in mainline now
>>> just to support loom. I don't see why we need to care about pinning
>>> threads in this kind of situation.
>>
>> The idea is to add some nsk/share stress tests for virtual threads.
>> Basically, there are the same tests as existing (gc, sysdict) but
>> running in virtual threads. And these tests are going to be executed
>> after loom is integrated. And I want to keep the difference as small
>> as possible between mainline and loom.
>>
>> Leonid
>>
>>>
>>> David
>>>
>>>> Leonid
>>>>
>>>>>
>>>>> David
>>>>> -----
>>>>>
>>>>>
>>>>>>>
>>>>>>> The bug was introduced by
>>>>>>> https://bugs.openjdk.java.net/browse/JDK-8241123
>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8241123>
>>>>>>> The Atomic works fine for stress test finishing sync. I just
>>>>>>> didn't expect that tests might OOME while releasing start lock.
>>>>>>> Verified that tests now don't fail with -Xcomp -server
>>>>>>> -XX:-TieredCompilation -XX:-UseCompressedOops.
>>>>>>>
>>>>>>> webrev: http://cr.openjdk.java.net/~lmesnik/8241456/webrev.00/
>>>>>>> <http://cr.openjdk.java.net/~lmesnik/8241456/webrev.00/>
>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8241456
>>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8241456>
>>>>>>>
>>>>>>> Leonid
More information about the serviceability-dev
mailing list