apache / apache/camel-quarkus

[Quarkus 2.11.1.Final] Subclass of EndpointRouteBuilder quarkus:dev fail to start due to "Method too large" error

Open
#3,963 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
302
Forks
232
Avg merge
1d 20h
Merged PRs (30d)
114

Description

We recently upgraded to camel-quarkus `2.11.0` that is on quarkus `2.11.1.Final`. We have noticed that the routes defined in the subclass of `EndpointRouteBuilder` fail to start with `mvn clean quarkus:dev`. After some debugging it seems to be caused by including more than a few methods in the subclass. We have managed to reproduce the error with a bare minimum class:
```
import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class TestRoute extends EndpointRouteBuilder {

protected int dummy() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}
protected int dummy1() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}

protected int dummy2() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}

protected int dummy4() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}

protected int dummy5() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}

protected int dummy6() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}

protected int dummy3() {
int a = 0;
a++;
a++;
a++;
a++;
a++;
a++;
return a;
}

@Override
public void configure() throws Exception {

}
}
```
When trying to start up with `mvn clean quarkus:dev`, gives the following errors:

```
Failed to start quarkus: java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#generateResources threw an exception: org.objectweb.asm.MethodTooLargeException: Method too large: TestRoute_Subclass. (Ljavax/enterprise/context/spi/CreationalContext;Lio/quarkus/arc/InjectableInterceptor;)V
at org.objectweb.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2088)
at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:511)
at io.quarkus.gizmo.ClassCreator.writeTo(ClassCreator.java:214)
at io.quarkus.gizmo.ClassCreator.close(ClassCreator.java:225)
at io.quarkus.arc.processor.SubclassGenerator.generate(SubclassGenerator.java:124)
at io.quarkus.arc.processor.BeanProcessor.generateResources(BeanProcessor.java:212)
at io.quarkus.arc.deployment.ArcProcessor.generateResources(ArcProcessor.java:537)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:977)
at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:829)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)

at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:330)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:252)
at io.quarkus.runner.bootstrap.AugmentActionImpl.createInitialRuntimeApplication(AugmentActionImpl.java:60)
at io.quarkus.deployment.dev.IsolatedDevModeMain.firstStart(IsolatedDevModeMain.java:95)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:485)
at io.quarkus.deployment.dev.IsolatedDevModeMain.accept(IsolatedDevModeMain.java:68)
at io.quarkus.bootstrap.app.CuratedApplication.runInCl(CuratedApplication.java:148)
at io.quarkus.bootstrap.app.CuratedApplication.runInAugmentClassLoader(CuratedApplication.java:103)
at io.quarkus.deployment.dev.DevModeMain.start(DevModeMain.java:131)
at io.quarkus.deployment.dev.DevModeMain.main(DevModeMain.java:62)
Caused by: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[error]: Build step io.quarkus.arc.deployment.ArcProcessor#generateResources threw an exception: org.objectweb.asm.MethodTooLargeException: Method too large: TestRoute_Subclass. (Ljavax/enterprise/context/spi/CreationalContext;Lio/quarkus/arc/InjectableInterceptor;)V
at org.objectweb.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2088)
at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:511)
at io.quarkus.gizmo.ClassCreator.writeTo(ClassCreator.java:214)
at io.quarkus.gizmo.ClassCreator.close(ClassCreator.java:225)
at io.quarkus.arc.processor.SubclassGenerator.generate(SubclassGenerator.java:124)
at io.quarkus.arc.processor.BeanProcessor.generateResources(BeanProcessor.java:212)
at io.quarkus.arc.deployment.ArcProcessor.generateResources(ArcProcessor.java:537)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:977)
at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:829)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)

at io.quarkus.builder.Execution.run(Execution.java:123)
at io.quarkus.builder.BuildExecutionBuilder.execute(BuildExecutionBuilder.java:79)
at io.quarkus.deployment.QuarkusAugmentor.run(QuarkusAugmentor.java:158)
at io.quarkus.runner.bootstrap.AugmentActionImpl.runAugment(AugmentActionImpl.java:328)
... 9 more
Caused by: org.objectweb.asm.MethodTooLargeException: Method too large: TestRoute_Subclass. (Ljavax/enterprise/context/spi/CreationalContext;Lio/quarkus/arc/InjectableInterceptor;)V
at org.objectweb.asm.MethodWriter.computeMethodInfoSize(MethodWriter.java:2088)
at org.objectweb.asm.ClassWriter.toByteArray(ClassWriter.java:511)
at io.quarkus.gizmo.ClassCreator.writeTo(ClassCreator.java:214)
at io.quarkus.gizmo.ClassCreator.close(ClassCreator.java:225)
at io.quarkus.arc.processor.SubclassGenerator.generate(SubclassGenerator.java:124)
at io.quarkus.arc.processor.BeanProcessor.generateResources(BeanProcessor.java:212)
at io.quarkus.arc.deployment.ArcProcessor.generateResources(ArcProcessor.java:537)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:977)
at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
at java.base/java.lang.Thread.run(Thread.java:829)
at org.jboss.threads.JBossThread.run(JBossThread.java:501)
```

pom.xml
```
...

2.11.0
2.11.1.Final
2.11.1.Final

...
```
Runtime:
```
> java -version
openjdk version "11.0.15" 2022-04-19
OpenJDK Runtime Environment GraalVM CE 22.1.0 (build 11.0.15+10-jvmci-22.1-b06)
OpenJDK 64-Bit Server VM GraalVM CE 22.1.0 (build 11.0.15+10-jvmci-22.1-b06, mixed mode, sharing)
```

If the size/number of methods is reduced (e.g., commenting out some methods in the example), the application starts up fine.

Note that this works fine if it is a subclass of `RouteBuilder`.

Previously, the same code worked without errors on quarkus 2.10.0.

Contributor guide

No contributing guide indexed for this repository

Research direction

Reproduce the failure with the minimal TestRoute subclass and the listed Quarkus 2.11.1.Final and Camel Quarkus 2.11.0 versions. Start from the ArcProcessor#generateResources and SubclassGenerator entries in the stack trace, then compare behavior with RouteBuilder and Quarkus 2.10.0. Done means the EndpointRouteBuilder example starts in mvn clean quarkus:dev without MethodTooLargeException.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.