Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DB2-/Oracle-Databae driver causes issue in native compilation #30269

Closed
turing85 opened this issue Jan 10, 2023 · 9 comments
Closed

DB2-/Oracle-Databae driver causes issue in native compilation #30269

turing85 opened this issue Jan 10, 2023 · 9 comments
Labels
area/mandrel area/persistence OBSOLETE, DO NOT USE kind/bug Something isn't working

Comments

@turing85
Copy link
Contributor

Describe the bug

In one of my service,s I observe the following error when compiling natively:

Error: Detected a PlatformManagedObject (a MXBean defined by the virtual machine) in the image heap. This bean is introspecting the VM that runs the image builder, i.e., a VM instance that is no longer available at image runtime. Class of disallowed object: sun.management.MemoryPoolImpl  Object has been initialized by the oracle.jdbc.driver.OracleDriver class initializer with a trace:
        at sun.management.MemoryPoolImpl.<init>(MemoryPoolImpl.java:64)
        at sun.management.ManagementFactoryHelper.createMemoryPool(ManagementFactoryHelper.java:582)
        at sun.management.MemoryImpl.getMemoryPools0(Unknown Source)
        at sun.management.MemoryImpl.getMemoryPools(MemoryImpl.java:92)
        at sun.management.ManagementFactoryHelper.getMemoryPoolMXBeans(ManagementFactoryHelper.java:130)
        at java.lang.management.DefaultPlatformMBeanProvider$6.nameToMBeanMap(DefaultPlatformMBeanProvider.java:276)
        at java.lang.management.ManagementFactory.lambda$getPlatformMBeanServer$0(ManagementFactory.java:488)
        at java.lang.management.ManagementFactory$$Lambda$1971/0x00000007c27bcb40.apply(Unknown Source)
        at java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
        at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
        at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at java.lang.management.ManagementFactory.getPlatformMBeanServer(ManagementFactory.java:489)
        at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:450)
        at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:281)
        at java.security.AccessController.executePrivileged(AccessController.java:776)
        at java.security.AccessController.doPrivileged(AccessController.java:318)
        at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:279)

Digging deeper and tracing the initialization of the oracle.jdbc.driver.OracleDriver reveals the following trace:

Error: Classes that should be initialized at run time got initialized during image building:

oracle.jdbc.driver.OracleDriver the class was requested to be initialized at run time (from command line with 'oracle.jdbc.driver.OracleDriver'). com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource caused initialization of this class with the following trace:
        at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:243)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at java.sql.DriverManager$2.run(DriverManager.java:618)
        at java.sql.DriverManager$2.run(DriverManager.java:598)
        at java.security.AccessController.executePrivileged(AccessController.java:776)
        at java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.sql.DriverManager.ensureDriversInitialized(DriverManager.java:598)
        at java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.ibm.db2.cmx.runtime.internal.trace.DataLogger.getPmrStamp(DataLogger.java:868)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getGlobalLogger(Log.java:438)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getCMXClientLogger(Log.java:311)
        at com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource.<clinit>(ProxiedJdbcDataSource.java:186)

oracle.jdbc.OracleDriver the class was requested to be initialized at run time (subtype of oracle.jdbc.driver.OracleDriver and from command line with 'oracle.jdbc.OracleDriver'). com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource caused initialization of this class with the following trace:
        at oracle.jdbc.OracleDriver.<clinit>(OracleDriver.java)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at java.sql.DriverManager$2.run(DriverManager.java:618)
        at java.sql.DriverManager$2.run(DriverManager.java:598)
        at java.security.AccessController.executePrivileged(AccessController.java:776)
        at java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.sql.DriverManager.ensureDriversInitialized(DriverManager.java:598)
        at java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.ibm.db2.cmx.runtime.internal.trace.DataLogger.getPmrStamp(DataLogger.java:868)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getGlobalLogger(Log.java:438)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getCMXClientLogger(Log.java:311)
        at com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource.<clinit>(ProxiedJdbcDataSource.java:186)

com.oracle.svm.core.util.UserError$UserException: Classes that should be initialized at run time got initialized during image building:

oracle.jdbc.driver.OracleDriver the class was requested to be initialized at run time (from command line with 'oracle.jdbc.driver.OracleDriver'). com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource caused initialization of this class with the following trace:
        at oracle.jdbc.driver.OracleDriver.<clinit>(OracleDriver.java:243)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at java.sql.DriverManager$2.run(DriverManager.java:618)
        at java.sql.DriverManager$2.run(DriverManager.java:598)
        at java.security.AccessController.executePrivileged(AccessController.java:776)
        at java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.sql.DriverManager.ensureDriversInitialized(DriverManager.java:598)
        at java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.ibm.db2.cmx.runtime.internal.trace.DataLogger.getPmrStamp(DataLogger.java:868)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getGlobalLogger(Log.java:438)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getCMXClientLogger(Log.java:311)
        at com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource.<clinit>(ProxiedJdbcDataSource.java:186)

oracle.jdbc.OracleDriver the class was requested to be initialized at run time (subtype of oracle.jdbc.driver.OracleDriver and from command line with 'oracle.jdbc.OracleDriver'). com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource caused initialization of this class with the following trace:
        at oracle.jdbc.OracleDriver.<clinit>(OracleDriver.java)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Unknown Source)
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        at java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at java.sql.DriverManager$2.run(DriverManager.java:618)
        at java.sql.DriverManager$2.run(DriverManager.java:598)
        at java.security.AccessController.executePrivileged(AccessController.java:776)
        at java.security.AccessController.doPrivileged(AccessController.java:318)
        at java.sql.DriverManager.ensureDriversInitialized(DriverManager.java:598)
        at java.sql.DriverManager.getDrivers(DriverManager.java:426)
        at com.ibm.db2.cmx.runtime.internal.trace.DataLogger.getPmrStamp(DataLogger.java:868)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getGlobalLogger(Log.java:438)
        at com.ibm.db2.cmx.runtime.internal.trace.Log.getCMXClientLogger(Log.java:311)
        at com.ibm.db2.cmx.runtime.internal.proxy.ProxiedJdbcDataSource.<clinit>(ProxiedJdbcDataSource.java:186)
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.util.UserError.abort(UserError.java:73)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ProvenSafeClassInitializationSupport.checkDelayedInitialization(ProvenSafeClassInitializationSupport.java:273)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.classinitialization.ClassInitializationFeature.duringAnalysis(ClassInitializationFeature.java:164)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$10(NativeImageGenerator.java:748)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.FeatureHandler.forEachFeature(FeatureHandler.java:85)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.lambda$runPointsToAnalysis$11(NativeImageGenerator.java:748)
        at org.graalvm.nativeimage.pointsto/com.oracle.graal.pointsto.AbstractAnalysisEngine.runAnalysis(AbstractAnalysisEngine.java:162)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.runPointsToAnalysis(NativeImageGenerator.java:745)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.doRun(NativeImageGenerator.java:578)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGenerator.run(NativeImageGenerator.java:535)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.buildImage(NativeImageGeneratorRunner.java:403)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.build(NativeImageGeneratorRunner.java:580)
        at org.graalvm.nativeimage.builder/com.oracle.svm.hosted.NativeImageGeneratorRunner.main(NativeImageGeneratorRunner.java:128)

Expected behavior

Application should compile

Actual behavior

Application produces error, see above

How to Reproduce?

No response

Output of uname -a or ver

N/A

Output of java -version

17.0.5

GraalVM version (if different from Java)

mandrel-22.3.0.1

Quarkus version or git rev

2.13.2.Final

Build tool (ie. output of mvnw --version or gradlew --version)

3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)

Additional information

No response

@turing85 turing85 added the kind/bug Something isn't working label Jan 10, 2023
@quarkus-bot quarkus-bot bot added area/mandrel area/persistence OBSOLETE, DO NOT USE labels Jan 10, 2023
@quarkus-bot
Copy link

quarkus-bot bot commented Jan 10, 2023

/cc @Karm(mandrel), @galderz(mandrel), @mswatosh(db2), @zakkak(mandrel)

@zakkak
Copy link
Contributor

zakkak commented Jan 10, 2023

Looks like a duplicate of #30176, @turing85 can you please test with #28921 ?

@turing85
Copy link
Contributor Author

This might be a stupid question... but how can I test this locally without building quarkus completely? Is there a way to do this?

@zakkak
Copy link
Contributor

zakkak commented Jan 10, 2023

Is there a way to do this?

Unfortunately not.

@gsmet
Copy link
Member

gsmet commented Jan 10, 2023

@turing85 building Quarkus is not that hard. Just follow the steps here https://github.com/quarkusio/quarkus/blob/main/CONTRIBUTING.md#building-main except you should build the pull request instead of the main branch.

@zakkak
Copy link
Contributor

zakkak commented Jan 10, 2023

Note: after building Quarkus you will also need to update the quarkus version to 999-SNAPSHOT in your pom.xml in order to test it.

@gsmet
Copy link
Member

gsmet commented Jan 10, 2023

Yes it's described in the link I provided. You also need to make sure you use io.quarkus:quarkus-bom as the BOM.

@turing85
Copy link
Contributor Author

turing85 commented Jan 10, 2023

This might get complicated. The application I am using uses camel. As for the compatibility matrix of camel, only Camel 3.20.0 is compatible with quarkus 2.15.x (and there is no camel-quarkus version for that). So I need to patch release 2.13.2.Final (the version we are currently using) and hope that nothing else breaks.

@turing85
Copy link
Contributor Author

This issue seems to be resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/mandrel area/persistence OBSOLETE, DO NOT USE kind/bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants