Request for Review (s) - 8149343: assert(rp->num_q() == no_of_gc_workers) failed: sanity
Kim Barrett
kim.barrett at oracle.com
Wed Mar 16 05:59:56 UTC 2016
> On Mar 10, 2016, at 2:53 PM, Jon Masamitsu <jon.masamitsu at oracle.com> wrote:
>
> https://bugs.openjdk.java.net/browse/JDK-8149343
>
> The error here was that the number of active workers was
> not always set correctly for parallel Reference processing.
> The first fix was to set the number of active workers in the
> ReferenceProcessor in the task constructor. Once thatDiff
> was fixed a subsequent assertion failure occurred.
>
> # Internal Error (/export/jmasa/java/jdk9-rt-8149343/src/share/vm/gc/shared/referenceProcessor.cpp:884), pid=18444, tid=18500
> # assert(id < _max_num_q) failed: Id is out-of-bounds id 23 and max id 23)
>
> This was fixed by the change
>
> - if (++_next_id == _num_q) {
> + assert(!_discovery_is_mt, "Round robin should only be used in serial discovery");
> + if (++_next_id >= _num_q) {
>
> See the CR for an example log which showed _num_q changing
> values between different phases of a collection and where the
> value of _next_id was greater than _num_q.
>
> The last change was to add a parameter to the logging function so that
> the logging only output the active lists (which made the reading of the
> logs simpler)
>
> - void log_reflist_counts(DiscoveredList ref_lists[], size_t total_count) PRODUCT_RETURN;
> + void log_reflist_counts(DiscoveredList ref_lists[], uint active_length, size_t total_count) PRODUCT_RETURN;
>
> This patch fixes UseG1GC for the failure where
> UseDynamicNumberOfGCThreads and ParallelRefProcEnabled
> are both turned on. There is still a failure with UseParallelGC
> that is being fixed under 8150994.
>
> http://cr.openjdk.java.net/~jmasa/8149343/webrev.00/
>
> Testing: gc_test_suite with UseDynamicNumberOfGCThreads on and
> ParallelRefProcEnabled on and off. rbt in progress
Looks good.
------------------------------------------------------------------------------
I agree with Thomas about the oddness of using >= in the _next_id
wraparound check. It seems like the place to initialize it is in
set_active_mt_degree. Oh, I see you are already considering that.
I would also be ok with just a comment in next_id().
------------------------------------------------------------------------------
src/share/vm/gc/shared/referenceProcessor.cpp
705 for (uint i = 0; i < active_length; ++i) {
For paranoia, perhaps afterward loop from active_length below
_max_num_q and report any unexpected non-empty lists.
------------------------------------------------------------------------------
test/gc/ergonomics/TestDynamicNumberOfGCThreads.java
Copyright.
------------------------------------------------------------------------------
src/share/vm/gc/shared/referenceProcessor.cpp
723 total_refs += ref_lists[i].length();
724 }
725 log_reflist_counts(ref_lists, _max_num_q, total_refs);
788 balanced_total_refs += ref_lists[i].length();
789 }
790 log_reflist_counts(ref_lists, _num_q, balanced_total_refs);
More information about the hotspot-gc-dev
mailing list