RFR (S) 8209889: RedefineStress tests crash

coleen.phillimore at oracle.com coleen.phillimore at oracle.com
Thu Oct 4 16:09:23 UTC 2018



On 10/4/18 10:34 AM, Doerr, Martin wrote:
>
> Hi Coleen,
>
> good catch. Looks good where you moved it.
>
> I couldn’t find a place for a NoSafepointVerifier, either.
>
> Maybe it’d be more clear if we replaced the “continue” in the NULL 
> case by an else case in the loop so the CompileTaskWrapper is the 
> first thing after the NULL check (see below).
>

I see, thanks to the magic of patch, the possibly_add_compiler_threads() 
is inside the 'else' clause where there's a compile task on the queue.  
Which makes perfect sense.  It seems like there should be a 
possibly_remove_compiler_thread() in the 'if' case but I'll leave that 
to the next person to touch this code.

Ok, I'll test this variant, which I also like.
thanks,
Coleen

> Best regards,
>
> Martin
>
> --- a/src/hotspot/share/compiler/compileBroker.cpp      Thu Oct 04 
> 14:03:13 2018 +0200
>
> +++ b/src/hotspot/share/compiler/compileBroker.cpp      Thu Oct 04 
> 16:29:45 2018 +0200
>
> @@ -1781,30 +1781,31 @@
>
>            return; // Stop this thread.
>
>          }
>
>        }
>
> -      continue;
>
> -    }
>
> -
>
> -    if (UseDynamicNumberOfCompilerThreads) {
>
> -      possibly_add_compiler_threads();
>
> -    }
>
> +    } else {
>
> +      // Assign the task to the current thread.  Mark this compilation
>
> +      // thread as active for the profiler.
>
> +      // CompileTaskWrapper also keeps the Method* from being 
> deallocated if redefinition
>
> +      // occurs after fetching the compile task off the queue.
>
> +      CompileTaskWrapper ctw(task);
>
> +      nmethodLocker result_handle;  // (handle for the nmethod 
> produced by this task)
>
> + task->set_code_handle(&result_handle);
>
> +      methodHandle method(thread, task->method());
>
> -    // Assign the task to the current thread. Mark this compilation
>
> -    // thread as active for the profiler.
>
> -    CompileTaskWrapper ctw(task);
>
> -    nmethodLocker result_handle;  // (handle for the nmethod produced 
> by this task)
>
> - task->set_code_handle(&result_handle);
>
> -    methodHandle method(thread, task->method());
>
> +      // Never compile a method if breakpoints are present in it
>
> +      if (method()->number_of_breakpoints() == 0) {
>
> +        // Compile the method.
>
> +        if ((UseCompiler || AlwaysCompileLoopMethods) && 
> CompileBroker::should_compile_new_jobs()) {
>
> +          invoke_compiler_on_method(task);
>
> +          thread->start_idle_timer();
>
> +        } else {
>
> +          // After compilation is disabled, remove remaining methods 
> from queue
>
> + method->clear_queued_for_compilation();
>
> + task->set_failure_reason("compilation is disabled");
>
> +        }
>
> +      }
>
> -    // Never compile a method if breakpoints are present in it
>
> -    if (method()->number_of_breakpoints() == 0) {
>
> -      // Compile the method.
>
> -      if ((UseCompiler || AlwaysCompileLoopMethods) && 
> CompileBroker::should_compile_new_jobs()) {
>
> -        invoke_compiler_on_method(task);
>
> -        thread->start_idle_timer();
>
> -      } else {
>
> -        // After compilation is disabled, remove remaining methods 
> from queue
>
> - method->clear_queued_for_compilation();
>
> - task->set_failure_reason("compilation is disabled");
>
> +      if (UseDynamicNumberOfCompilerThreads) {
>
> +        possibly_add_compiler_threads();
>
>        }
>
>      }
>
>    }
>
> *From:*coleen.phillimore at oracle.com <coleen.phillimore at oracle.com>
> *Sent:* Donnerstag, 4. Oktober 2018 13:45
> *To:* hotspot-dev developers <hotspot-dev at openjdk.java.net>; Doerr, 
> Martin <martin.doerr at sap.com>
> *Subject:* RFR (S) 8209889: RedefineStress tests crash
>
> Summary: Create CompileTaskWrapper before potential safepoint
>
> open webrev at http://cr.openjdk.java.net/~coleenp/8209889.01/webrev 
> <http://cr.openjdk.java.net/%7Ecoleenp/8209889.01/webrev>
> bug link https://bugs.openjdk.java.net/browse/JDK-8209889
>
> MetadataOnStackMark needs to find the CompileTask in the current 
> thread, or else the Method isn't marked as being alive, so if it's 
> old/obsolete, it is freed.  There are checks to disable adding old 
> methods to the compile queue but if the method is redefined after this 
> point, there may be a preexisting bug that we compile an old method.  
> This change just fixes the crash.
>
> Can some compiler person (Martin?) look at where I moved 
> possibly_add_compiler_threads and let me know if that looks okay?  
> There's a comment in the change that says why you need to create the 
> CompileTaskWrapper before that call.  I couldn't find a place to put a 
> NoSafepointVerifier.
>
> Tested with the test that failed, which doesn't reproduce the bug 
> except rarely, and test/hotspot/jtreg/compiler tests. tier1 an 2 in 
> progress.
>
> Thanks,
> Coleen
>



More information about the hotspot-dev mailing list