RFR: 8282172: CompileBroker::log_metaspace_failure is called from non-compiler threads
Vladimir Kozlov
kvn at openjdk.java.net
Tue Feb 22 17:02:50 UTC 2022
On Mon, 21 Feb 2022 11:22:19 GMT, Aleksey Shipilev <shade at openjdk.org> wrote:
> In several places in hotspot, we call CompileBroker::log_metaspace_failure(). I believe the intent is to call it from compiler threads only, because it ends up calling:
>
>
> void log_metaspace_failure(const char* reason) {
> ResourceMark rm;
> StringLogMessage lm;
> lm.print("%4d COMPILE PROFILING SKIPPED: %s", -1, reason);
> lm.print("\n");
> log(JavaThread::current(), "%s", (const char*)lm);
> }
>
>
> ...which would fail the cast in `JavaThread::current()` if current thread is not Java thread (compiler threads are Java threads too).
>
> It clearly manifests on [JDK-8282170](https://bugs.openjdk.java.net/browse/JDK-8282170) test:
>
>
> 12700 breakpoints set
> 12800 breakpoints set
> 12900 breakpoints set
> 13000 breakpoints set
> # To suppress the following error report, specify this argument
> # after -XX: or in .hotspotrc: SuppressErrorAt=/thread.hpp:1458
> #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> # Internal Error (/home/shade/trunks/jdk/src/hotspot/share/runtime/thread.hpp:1458), pid=889379, tid=889389
> # assert(t->is_Java_thread()) failed: incorrect cast to JavaThread
> V [libjvm.so+0xacfad4] CompilationLog::log_metaspace_failure(char const*)+0x494
> V [libjvm.so+0xac84b0] CompileBroker::log_metaspace_failure()+0x20
> V [libjvm.so+0x15069e9] Method::build_method_counters(Thread*, Method*)+0x119
> V [libjvm.so+0x150851b] BreakpointInfo::set(Method*)+0xfb
> V [libjvm.so+0x127d5ea] JvmtiBreakpoint::each_method_version_do(void (Method::*)(int))+0x5a
> V [libjvm.so+0x1b342ae] VM_Operation::evaluate()+0x18e
>
>
> Additional testing:
> - [x] Linux x86_64 fastdebug does not fail JDK-8282170 test anymore
No, it could be called from Java execution thread too when profiling is triggered. But yes it was assumed that only Java thread can ask for creation `MethodData`.
On other hand `log()` methods accepts `Thread*` parameter and just record it:
https://github.com/openjdk/jdk/blob/master/src/hotspot/share/utilities/events.hpp#L183
May be we don't need to cast it to `JavaThread` in this case.
-------------
Changes requested by kvn (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/7555
More information about the hotspot-compiler-dev
mailing list