CRR: 7034139: G1: assert(Thread::current()->is_ConcurrentGC_thread()) failed: only a conc GC thread can call this (S)
Tony Printezis
tony.printezis at oracle.com
Fri Apr 29 14:38:47 UTC 2011
Bengt,
I clearly misread your e-mail. Apologies for the confusion!
Tony
On 4/29/2011 1:45 AM, Bengt Rutisson wrote:
>
> Tony,
>
>>> I like that you have a way of testing this, but if it is possible I
>>> would like to see if it can be made more obvious in the code what
>>> parts are "real" code and what parts are there just for testing.
>>
>> Basically, the fix is just the conditional calling of stsLeave() and
>> stsJoin(). The rest is instrumentation to artificially cause N
>> overflows per concurrent cycle and remark. We could try to write a
>> test to cause that condition but, IMHO, it'd be quite hard (in
>> particular, it'd be hard to cause the overflow during remark; which
>> is why we've only seen this failure only once). So, with the
>> instrumentation enabled, the overflow condition will be caused every
>> time there's a marking cycle.
>
> Sorry for being unclear. I agree with you here. I think it would be
> difficult to write a test case that will trigger the overflows in the
> desired way. This is not what I meant when I talked about "real code"
> and "testing code". What I meat was what you are pointing out further
> down. Whether there is an acceptable way to signal already at the call
> site that a call has no effect in product builds.
>
> I'll comment on that in a response to Ramki's email shortly.
>
> Bengt
>
>
>>
>>> For example, I think I would prefer that concurrentMark.cpp had
>>> calls like:
>>>
>>> DEBUG_ONLY(force_overflow()->update());
>>>
>>> rather than having this in concurrentMark.hpp:
>>>
>>> void update() PRODUCT_RETURN;
>>>
>>> That way someone browsing the code in concurrentMark.cpp can quickly
>>> see the difference between test code and product code. I realize
>>> that this might be a matter of taste, so I'm ok with the way it is
>>> now as well.
>>
>> I do see the point you and Jesper (he made in his subsequent e-mail)
>> and, of course :-), we're generally not consistent in taking one
>> approach over the other in HotSpot. Having said this, this is the
>> sort of situation for which the PRODUCT_RETURN macro was introduced
>> in the first place. I personally like using PRODUCT_RETURN since it
>> cuts down the clutter. Compare:
>>
>> void foo() PRODUCT_RETURN;
>>
>> #ifndef PRODUCT
>> void foo() {
>> ...
>> }
>> #endif
>>
>> foo();
>>
>> with:
>>
>> NOT_PRODUCT(void foo();)
>>
>> #ifndef PRODUCT
>> void foo() {
>> ...
>> }
>> #endif
>>
>> NOT_PRODUCT(foo();)
>>
>>
>> But I'd be OK with the latter for the reasons you and Jesper brought
>> up. Anyone else in group have a strong opinion one way or another?
>>
>> Tony
>> Tony
>>
>>
>>> Bengt
>>>
>>> On 2011-04-23 00:58, Tony Printezis wrote:
>>>> Thanks to John Cuthbertson for looking at this. I took his advice
>>>> and I'm going to disable the forced overflow by default (by setting
>>>> the default parameter to 0), but leave the code in as it's helpful.
>>>> Latest version here:
>>>>
>>>> http://cr.openjdk.java.net/~tonyp/7034139/webrev.2/
>>>>
>>>> Tony
>>>>
>>>> Tony Printezis wrote:
>>>>> Hi all,
>>>>>
>>>>> I'd still like a couple of code reviews for this. Here's the
>>>>> latest version (I only rephrased a couple of comments, so if
>>>>> you're looking at the earlier version already you can ignore this
>>>>> one):
>>>>>
>>>>> http://cr.openjdk.java.net/~tonyp/7034139/webrev.1/
>>>>>
>>>>> Tony
>>>>>
>>>>> Tony Printezis wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Could I get a couple of people to look at this? (I'd like to push
>>>>>> this this week if possible)
>>>>>>
>>>>>> http://cr.openjdk.java.net/~tonyp/7034139/webrev.0/
>>>>>>
>>>>>> The actual fix is reasonably small (leave / join the
>>>>>> SuspendibleThreadSet only if we are in concurrent mode). Most of
>>>>>> the changes are new infrastructure to cause a fixed number of
>>>>>> overflows during marking (in non-product builds of course) to
>>>>>> stress the overflow code. This was the only way I could reliably
>>>>>> reproduce the failure. This did uncover a couple of extra issues
>>>>>> which I also fixed:
>>>>>>
>>>>>> - If we overflow during remark we should not actually deal with
>>>>>> it during remark but we should abort the remark pause and restart
>>>>>> a concurrent mark phase. For some reason we were not doing that.
>>>>>> I fixed that (for this I had to ensure that the overflow flag is
>>>>>> not cleared when we exit the do_marking_step() method).
>>>>>> - Because we were clearing the overflow, it was also possible
>>>>>> that the workers would deadlock (for that to happen a worker had
>>>>>> to finish handling one overflow and immediately raise another
>>>>>> one, so it was highly unlikely to occur in prcatice; good to find
>>>>>> it and eliminate it though).
>>>>>>
>>>>>> I've already tested it, I'll run more tests overnight.
>>>>>>
>>>>>> Tony
>>>>>
>>>
>
More information about the hotspot-gc-dev
mailing list