From 65ca0a5776df229ee91f420585ca1e8f91e489c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Gr=C3=B6nlund?= Date: Tue, 8 Mar 2022 09:28:46 +0000 Subject: [PATCH] 8276333: jdk/jfr/event/oldobject/TestLargeRootSet.java failed "assert(!contains(edge->reference())) failed: invariant" Reviewed-by: egahlin --- .../jfr/leakprofiler/chains/dfsClosure.cpp | 19 +++++++++---------- .../jfr/leakprofiler/chains/edgeStore.cpp | 15 +++++++++++++-- test/jdk/ProblemList.txt | 1 - 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp b/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp index 8161e172215f4..c6d368a902042 100644 --- a/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp +++ b/src/hotspot/share/jfr/leakprofiler/chains/dfsClosure.cpp @@ -80,24 +80,23 @@ void DFSClosure::closure_impl(UnifiedOopRef reference, const oop pointee) { if (GranularTimer::is_finished()) { return; } + if (_depth == 0 && _ignore_root_set) { // Root set is already marked, but we want // to continue, so skip is_marked check. assert(_mark_bits->is_marked(pointee), "invariant"); - } else { + _reference_stack[_depth] = reference; + } else { if (_mark_bits->is_marked(pointee)) { return; } + _mark_bits->mark_obj(pointee); + _reference_stack[_depth] = reference; + // is the pointee a sample object? + if (pointee->mark().is_marked()) { + add_chain(); + } } - _reference_stack[_depth] = reference; - _mark_bits->mark_obj(pointee); - assert(_mark_bits->is_marked(pointee), "invariant"); - - // is the pointee a sample object? - if (pointee->mark().is_marked()) { - add_chain(); - } - assert(_max_depth >= 1, "invariant"); if (_depth < _max_depth - 1) { _depth++; diff --git a/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp b/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp index 8ba9409df5640..c9bee7d1ab6d5 100644 --- a/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp +++ b/src/hotspot/share/jfr/leakprofiler/chains/edgeStore.cpp @@ -234,7 +234,15 @@ static int leak_context_edge_idx(const ObjectSample* sample) { } bool EdgeStore::has_leak_context(const ObjectSample* sample) const { - return leak_context_edge_idx(sample) != 0; + const int idx = leak_context_edge_idx(sample); + if (idx == 0) { + return false; + } + assert(idx > 0, "invariant"); + assert(_leak_context_edges != nullptr, "invariant"); + assert(idx < _leak_context_edges->length(), "invariant"); + assert(_leak_context_edges->at(idx) != nullptr, "invariant"); + return true; } const StoredEdge* EdgeStore::get(const ObjectSample* sample) const { @@ -243,7 +251,10 @@ const StoredEdge* EdgeStore::get(const ObjectSample* sample) const { assert(SafepointSynchronize::is_at_safepoint(), "invariant"); const int idx = leak_context_edge_idx(sample); if (idx > 0) { - return _leak_context_edges->at(idx); + assert(idx < _leak_context_edges->length(), "invariant"); + const StoredEdge* const edge =_leak_context_edges->at(idx); + assert(edge != nullptr, "invariant"); + return edge; } } return get(UnifiedOopRef::encode_in_native(sample->object_addr())); diff --git a/test/jdk/ProblemList.txt b/test/jdk/ProblemList.txt index 5bbb2e7934018..fc1979b6ed635 100644 --- a/test/jdk/ProblemList.txt +++ b/test/jdk/ProblemList.txt @@ -826,7 +826,6 @@ jdk/jfr/event/compiler/TestCodeSweeper.java 8225209 generic- jdk/jfr/event/os/TestThreadContextSwitches.java 8247776 windows-all jdk/jfr/startupargs/TestStartName.java 8214685 windows-x64 jdk/jfr/startupargs/TestStartDuration.java 8214685 windows-x64 -jdk/jfr/event/oldobject/TestLargeRootSet.java 8276333 generic-x64 jdk/jfr/api/consumer/recordingstream/TestOnEvent.java 8255404 linux-x64 jdk/jfr/jvm/TestWaste.java 8282427 generic-all