Skip to content

[Native Image] jdk.graal.compiler.debug.GraalError: Frame states being merged are incompatible: mismatch in rethrowException flag #10610

@anovak-sf

Description

@anovak-sf

Describe the Issue

I got an error like this

Fatal error: com.oracle.graal.pointsto.util.AnalysisError$ParsingError: Error encountered while parsing secondfoundation.common.util.RetryConfigurableKt.withRetries(RetryConfigurable.kt:168) 
Parsing context:
   at sf.apiclient.oasis.jarvis.transstatus.OasisTransStatusClient.getTransStatus(OasisTransStatusClient.kt:120)
   at sf.apiclient.oasis.jarvis.transstatus.OasisTransStatusClient.getTransStatus$default(OasisTransStatusClient.kt:84)
   at sf.jarvis.transmission.Reservations.getReservationStatus(Reservations.kt:103)
   at sf.jarvis.transmission.$Reservations$Definition$Exec.dispatch(Unknown Source)
   at io.micronaut.context.AbstractExecutableMethodsDefinition$DispatchedExecutableMethod.invoke(AbstractExecutableMethodsDefinition.java:456)
   at io.micronaut.inject.DelegatingExecutableMethod.invoke(DelegatingExecutableMethod.java:86)
   at io.micronaut.context.bind.DefaultExecutableBeanContextBinder$ContextBoundExecutable.invoke(DefaultExecutableBeanContextBinder.java:152)
   at io.micronaut.scheduling.processor.ScheduledMethodProcessor.lambda$process$2(ScheduledMethodProcessor.java:131)
   at io.micronaut.scheduling.processor.ScheduledMethodProcessor$$Lambda/0x000007e002c733c0.run(Unknown Source)
   at io.micronaut.scheduling.TaskScheduler.lambda$schedule$0(TaskScheduler.java:79)
   at io.micronaut.scheduling.TaskScheduler$$Lambda/0x000007e002c79df0.call(Unknown Source)
   at reactor.core.publisher.MonoCallable.call(MonoCallable.java:72)
   at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:137)
   at reactor.core.publisher.StrictSubscriber.onSubscribe(StrictSubscriber.java:77)
   at reactor.core.publisher.Operators.reportThrowInSubscribe(Operators.java:226)
   at reactor.core.publisher.Mono.subscribe(Mono.java:4571)
   at reactor.core.publisher.Mono.block(Mono.java:1778)
   at com.azure.core.util.polling.PollerFlux.lambda$new$1(PollerFlux.java:306)
   at com.azure.core.util.polling.PollerFlux$$Lambda/0x000007e002a2b0f8.apply(Unknown Source)
   at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1762)
   at java.time.ZoneOffset.ofTotalSeconds(ZoneOffset.java:427)
   at java.time.OffsetTime.with(OffsetTime.java:733)
   at java.time.OffsetTime.with(OffsetTime.java:118)
   at java.time.chrono.ChronoLocalDateTime.adjustInto(ChronoLocalDateTime.java:386)
   at java.time.LocalDateTime.adjustInto(LocalDateTime.java:1623)
   at java.time.OffsetTime.with(OffsetTime.java:690)
   at java.time.OffsetTime.with(OffsetTime.java:118)
   at root method.(Unknown Source)

        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.AnalysisError.parsingError(AnalysisError.java:165)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:184)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureFlowsGraphCreated(MethodTypeFlow.java:152)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.getOrCreateMethodFlowsGraphInfo(MethodTypeFlow.java:110)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.typestate.DefaultStaticInvokeTypeFlow.lambda$update$0(DefaultStaticInvokeTypeFlow.java:75)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.LightImmutableCollection.forEach(LightImmutableCollection.java:90)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.typestate.DefaultStaticInvokeTypeFlow.update(DefaultStaticInvokeTypeFlow.java:74)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.PointsToAnalysis$1.run(PointsToAnalysis.java:575)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.executeCommand(CompletionExecutor.java:166)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.util.CompletionExecutor.lambda$executeService$0(CompletionExecutor.java:152)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1726)
        at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.compute(ForkJoinTask.java:1717)
        at java.base/java.util.concurrent.ForkJoinTask$InterruptibleTask.exec(ForkJoinTask.java:1641)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1458)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2034)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:189)
Caused by: jdk.graal.compiler.debug.GraalError: Frame states being merged are incompatible: mismatch in rethrowException flag
 This frame state: [locals: [1497,1498,1499,1500,1501,1502,1503,1504,9,1505,_,_,102,91,114] stack: [1506] locks: [] rethrowException]
Other frame state: [locals: [648,649,650,651,652,653,654,655,9,656,2035,_,102,91,114] stack: [2036] locks: []]
Parser context: secondfoundation.common.util.RetryConfigurableKt.withRetries-Jg0PXok(RetryConfigurable.kt:126) [bci: 139, intrinsic: false]
 139: goto          143
 142: pop           
 143: new           #55         // secondfoundation.common.util.RetryConfigurableKt$withRetries$2
 146: dup           
 147: aload         7
 149: aload         9

        at jdk.graal.compiler/jdk.graal.compiler.java.FrameStateBuilder.checkCompatibleWith(FrameStateBuilder.java:495)
        at jdk.graal.compiler/jdk.graal.compiler.java.FrameStateBuilder.merge(FrameStateBuilder.java:536)
        at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.createTarget(BytecodeParser.java:3471)
        at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.createTarget(BytecodeParser.java:3358)
        at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.createExceptionDispatch(BytecodeParser.java:3637)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.createExceptionDispatch(SharedGraphBuilderPhase.java:933)
        at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:3542)
        at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.build(BytecodeParser.java:1163)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.build(SharedGraphBuilderPhase.java:205)
        at jdk.graal.compiler/jdk.graal.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:1055)
        at jdk.graal.compiler/jdk.graal.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:103)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.phases.SharedGraphBuilderPhase.run(SharedGraphBuilderPhase.java:157)
        at jdk.graal.compiler/jdk.graal.compiler.phases.Phase.run(Phase.java:49)
        at jdk.graal.compiler/jdk.graal.compiler.phases.BasePhase.apply(BasePhase.java:468)
        at jdk.graal.compiler/jdk.graal.compiler.phases.Phase.apply(Phase.java:42)
        at jdk.graal.compiler/jdk.graal.compiler.phases.Phase.apply(Phase.java:38)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.AnalysisParsedGraph.parseBytecode(AnalysisParsedGraph.java:144)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.parseGraph(AnalysisMethod.java:916)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsedHelper(AnalysisMethod.java:881)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.meta.AnalysisMethod.ensureGraphParsed(AnalysisMethod.java:864)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.lookupEncodedGraph(InlineBeforeAnalysisGraphDecoder.java:181)
        at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.doInline(PEGraphDecoder.java:1215)
        at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.tryInline(PEGraphDecoder.java:1198)
        at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.trySimplifyInvoke(PEGraphDecoder.java:1053)
        at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.handleInvokeWithCallTarget(PEGraphDecoder.java:1005)
        at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.handleInvoke(PEGraphDecoder.java:991)
        at jdk.graal.compiler/jdk.graal.compiler.nodes.GraphDecoder.processNextNode(GraphDecoder.java:926)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysisGraphDecoder.processNextNode(InlineBeforeAnalysisGraphDecoder.java:269)
        at jdk.graal.compiler/jdk.graal.compiler.nodes.GraphDecoder.decode(GraphDecoder.java:654)
        at jdk.graal.compiler/jdk.graal.compiler.replacements.PEGraphDecoder.decode(PEGraphDecoder.java:895)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.phases.InlineBeforeAnalysis.decodeGraph(InlineBeforeAnalysis.java:73)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:200)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:652)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.flow.MethodTypeFlow.createFlowsGraph(MethodTypeFlow.java:167)
        ... 15 more

Actual code at RetryConfigurableKt$withRetries$2 around line 126 is:

suspend fun <T> withRetries(
    maxAttempts: Int,
    backoff: IRetryBackoff = ConstantBackoff.ZERO,
    timeout: Duration? = null,
    logger: Logger? = null,
    execLogLevel: RetryLogLevel = RetryLogLevel.INFO,
    retryLogLevel: RetryLogLevel = RetryLogLevel.WARN,
    exceedLogLevel: RetryLogLevel = RetryLogLevel.INFO,
    block: suspend CoroutineScope.(index: Int) -> T
): T {
    var index = 0
    var lastCause: Exception

    do {
        try {
            return if (timeout == null) {
                logger?.log(execLogLevel, "[withRetries] launching") // line 126, if replaced by if (logger != null) logger.log, the issue moves to line 127
                coroutineScope {
                    block(index).also { 
                        logger?.log(execLogLevel, "[withRetries] succeeded")
                    }
                }
            } else {
                logger?.log(execLogLevel, "[withRetries] launching with timeout ${timeout.inWholeMilliseconds}ms")
                coroutineScope {
                    withTimeout(timeout) {
                        block(index).also {
                            logger?.log(execLogLevel, "[withRetries] succeeded")
                        }
                    }
                }
            }
        } catch (e: TimeoutCancellationException) {
            lastCause = e
            if (handleException(++index, maxAttempts, backoff, logger, execLogLevel, retryLogLevel, exceedLogLevel, e)) {
                break
            }
        } catch (e: CancellationException) {
            throw e
        } catch (e: Exception) {
            lastCause = e
            if (handleException(++index, maxAttempts, backoff, logger, execLogLevel, retryLogLevel, exceedLogLevel, e)) {
                break
            }
        }
    } while (coroutineContext.isActive)

    throw TooManyAttemptsException(lastCause)
}

It is Kotlin code, using also Kotlin libraries, there are no explicit throws clauses.

Using the latest version of GraalVM can resolve many issues.

GraalVM Version

java -version
openjdk version "23.0.1" 2024-10-15
OpenJDK Runtime Environment GraalVM CE 23.0.1+11.1 (build 23.0.1+11-jvmci-b01)
OpenJDK 64-Bit Server VM GraalVM CE 23.0.1+11.1 (build 23.0.1+11-jvmci-b01, mixed mode, sharing)

Operating System and Version

Darwin mac-N9M7V6WTXJ 24.2.0 Darwin Kernel Version 24.2.0: Fri Dec 6 18:56:34 PST 2024; root:xnu-11215.61.5~2/RELEASE_ARM64_T6020 arm64

Build Command

`graalvmNative {
binaries {
named("main") {
imageName.set("jarvis-app")
mainClass.set("sf.jarvis.JarvisApplication")
buildArgs.add("-O0")

        buildArgs.add("--initialize-at-build-time=com.azure.core.util.logging.ClientLogger")
        buildArgs.add("--initialize-at-build-time=org.slf4j.helpers")
        buildArgs.add("--initialize-at-build-time=ch.qos.logback")
        buildArgs.add("--initialize-at-build-time=com.fasterxml.jackson.core")
        buildArgs.add("--initialize-at-build-time=org.xml.sax.helpers")
    }
}
binaries.all {
    buildArgs.add("--verbose")
}

}
`
./gradlew clean build :jarvis-application:nativeCompile

Expected Behavior

No error

Actual Behavior

Error

Steps to Reproduce

I am not sure how to reproduce the issue, I cannot share my project. But it happens 100% of time even with older version.

Additional Context

No response

Build Log Output and Error Messages

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions