8068036: assert(is_available(index)) failed in G1 cset

Tue, 31 Mar 2015 11:36:37 +0200

author
tschatzl
date
Tue, 31 Mar 2015 11:36:37 +0200
changeset 7673
c04f46b4abe4
parent 7660
3ca53859c3c7
child 7674
12eb26c15642

8068036: assert(is_available(index)) failed in G1 cset
Summary: Some verification code iterated over the heap using the region mapping array. This is not allowed. Changed to use the regular iteration method with closure.
Reviewed-by: jwilhelm, brutisso

src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp file | annotate | diff | comparison | revisions
src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp file | annotate | diff | comparison | revisions
     1.1 --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Thu Mar 19 15:25:54 2015 +0100
     1.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp	Tue Mar 31 11:36:37 2015 +0200
     1.3 @@ -6017,56 +6017,68 @@
     1.4    guarantee(!cl.failures(), "bitmap verification");
     1.5  }
     1.6  
     1.7 -bool G1CollectedHeap::check_cset_fast_test() {
     1.8 -  bool failures = false;
     1.9 -  for (uint i = 0; i < _hrm.length(); i += 1) {
    1.10 -    HeapRegion* hr = _hrm.at(i);
    1.11 -    InCSetState cset_state = (InCSetState) _in_cset_fast_test.get_by_index((uint) i);
    1.12 +class G1CheckCSetFastTableClosure : public HeapRegionClosure {
    1.13 + private:
    1.14 +  bool _failures;
    1.15 + public:
    1.16 +  G1CheckCSetFastTableClosure() : HeapRegionClosure(), _failures(false) { }
    1.17 +
    1.18 +  virtual bool doHeapRegion(HeapRegion* hr) {
    1.19 +    uint i = hr->hrm_index();
    1.20 +    InCSetState cset_state = (InCSetState) G1CollectedHeap::heap()->_in_cset_fast_test.get_by_index(i);
    1.21      if (hr->isHumongous()) {
    1.22        if (hr->in_collection_set()) {
    1.23          gclog_or_tty->print_cr("\n## humongous region %u in CSet", i);
    1.24 -        failures = true;
    1.25 -        break;
    1.26 +        _failures = true;
    1.27 +        return true;
    1.28        }
    1.29        if (cset_state.is_in_cset()) {
    1.30          gclog_or_tty->print_cr("\n## inconsistent cset state %d for humongous region %u", cset_state.value(), i);
    1.31 -        failures = true;
    1.32 -        break;
    1.33 +        _failures = true;
    1.34 +        return true;
    1.35        }
    1.36        if (hr->continuesHumongous() && cset_state.is_humongous()) {
    1.37          gclog_or_tty->print_cr("\n## inconsistent cset state %d for continues humongous region %u", cset_state.value(), i);
    1.38 -        failures = true;
    1.39 -        break;
    1.40 +        _failures = true;
    1.41 +        return true;
    1.42        }
    1.43      } else {
    1.44        if (cset_state.is_humongous()) {
    1.45          gclog_or_tty->print_cr("\n## inconsistent cset state %d for non-humongous region %u", cset_state.value(), i);
    1.46 -        failures = true;
    1.47 -        break;
    1.48 +        _failures = true;
    1.49 +        return true;
    1.50        }
    1.51        if (hr->in_collection_set() != cset_state.is_in_cset()) {
    1.52          gclog_or_tty->print_cr("\n## in CSet %d / cset state %d inconsistency for region %u",
    1.53                                 hr->in_collection_set(), cset_state.value(), i);
    1.54 -        failures = true;
    1.55 -        break;
    1.56 +       _failures = true;
    1.57 +       return true;
    1.58        }
    1.59        if (cset_state.is_in_cset()) {
    1.60          if (hr->is_young() != (cset_state.is_young())) {
    1.61            gclog_or_tty->print_cr("\n## is_young %d / cset state %d inconsistency for region %u",
    1.62                                   hr->is_young(), cset_state.value(), i);
    1.63 -          failures = true;
    1.64 -          break;
    1.65 +          _failures = true;
    1.66 +          return true;
    1.67          }
    1.68          if (hr->is_old() != (cset_state.is_old())) {
    1.69            gclog_or_tty->print_cr("\n## is_old %d / cset state %d inconsistency for region %u",
    1.70                                   hr->is_old(), cset_state.value(), i);
    1.71 -          failures = true;
    1.72 -          break;
    1.73 +          _failures = true;
    1.74 +          return true;
    1.75          }
    1.76        }
    1.77      }
    1.78 -  }
    1.79 -  return !failures;
    1.80 +    return false;
    1.81 +  }
    1.82 +
    1.83 +  bool failures() const { return _failures; }
    1.84 +};
    1.85 +
    1.86 +bool G1CollectedHeap::check_cset_fast_test() {
    1.87 +  G1CheckCSetFastTableClosure cl;
    1.88 +  _hrm.iterate(&cl);
    1.89 +  return !cl.failures();
    1.90  }
    1.91  #endif // PRODUCT
    1.92  
     2.1 --- a/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp	Thu Mar 19 15:25:54 2015 +0100
     2.2 +++ b/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp	Tue Mar 31 11:36:37 2015 +0200
     2.3 @@ -213,6 +213,9 @@
     2.4    // Other related classes.
     2.5    friend class G1MarkSweep;
     2.6  
     2.7 +  // Testing classes.
     2.8 +  friend class G1CheckCSetFastTableClosure;
     2.9 +
    2.10  private:
    2.11    // The one and only G1CollectedHeap, so static functions can find it.
    2.12    static G1CollectedHeap* _g1h;

mercurial