quarkusio / quarkus

Quarkus: Supersonic Subatomic Java.
https://quarkus.io
Apache License 2.0
13.58k stars 2.63k forks source link

Classloader Issues on MultiModule Project Tests #27565

Open ismailsimsek opened 2 years ago

ismailsimsek commented 2 years ago

Describe the bug

Quarkus test getting following error is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader

it works fine when the app is packaged.

Might be related to https://github.com/quarkusio/quarkus/issues/24895 . downgrading Quarkus to 2.6.3.Final works.

 java.lang.ClassCastException: class io.debezium.server.converters.TemporalToISOStringConverter cannot be cast to class io.debezium.spi.converter.CustomConverter (io.debezium.server.converters.TemporalToISOStringConverter is in unnamed module of loader 'app'; io.debezium.spi.converter.CustomConverter is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @153cfd86)
    at io.debezium.config.CommonConnectorConfig.lambda$getCustomConverters$1(CommonConnectorConfig.java:767)

cc: @gsmet @aloubyansky

Expected behavior

No response

Actual behavior

exception

2022-08-29 10:09:51,526 INFO  [io.deb.ser.ConnectorLifecycle] (pool-11-thread-1) Connector completed: success = 'false', message = 'Unable to initialize and start connector's task class 'io.debezium.connector.postgresql.PostgresConnectorTask' with config: {connector.class=io.debezium.connector.postgresql.PostgresConnector, debezium.sink.batch.objectkey-partition=true, transforms=unwrap, schema.include.list=inventory, offset.flush.interval.ms.test=0, debezium.sink.bigquerystream.project=ppro-bi-gcp-dev, debezium.sink.batch.objectkey-prefix=debezium-cdc-, include.schema.changes=false, transforms.unwrap.drop.tombstones=true, poll.interval.ms=5000, converters=bqdatetime, transforms.unwrap.type=io.debezium.transforms.ExtractNewRecordState, debezium.sink.bigquerystream.dataset=stage, key.converter=org.apache.kafka.connect.json.JsonConverter, database.dbname=postgres, database.user=postgres, database.history.bigquerybatch.project=ppro-bi-gcp-dev, bqdatetime.type=io.debezium.server.converters.TemporalToISOStringConverter, offset.storage=org.apache.kafka.connect.storage.MemoryOffsetBackingStore, database.history.kafka.bootstrap.servers=kafka:9092, key.converter.schemas.enable=true, transforms.hoist.field=line, debezium.sink.bigquerybatch.project=ppro-bi-gcp-dev, database.password=********, value.converter.schemas.enable=true, name=bigquerybatch, internal.value.converter=org.apache.kafka.connect.json.JsonConverter, topic=topicX, max.batch.size=100, database.history=io.debezium.relational.history.MemoryDatabaseHistory, transforms.unwrap.delete.handling.mode=rewrite, database.history.kafka.topic=dbhistory.fullfillment, database.history.bigquerybatch.dataset=stage, debezium.sink.bigquerybatch.dataset=stage, debezium.sink.bigquerystream.credentialsFile=, table.whitelist=public.table_name, debezium.sink.bigquerybatch.location=EU, offset.storage.file.filename=/Users/ismailsimsek/development/debezium-server-bigquery/debezium-server-bigquery-sinks/target/data/file-connector-offsets.txt, decimal.handling.mode=double, file=/Users/ismailsimsek/development/debezium-server-bigquery/debezium-server-bigquery-sinks/target/data/file-connector-input.txt, value.converter=org.apache.kafka.connect.json.JsonConverter, value.converter.value.schemas.enable=true, database.allowPublicKeyRetrieval=true, debezium.sink.type=bigquerybatch, key.converter.value.schemas.enable=true, database.server.name=testc, offset.flush.timeout.ms=5000, database.port=55111, database.history.bigquerybatch.location=EU, offset.flush.interval.ms=60000, snapshot.select.statement.overrides.inventory.products_on_hand=SELECT * FROM products_on_hand WHERE 1>2, database.history.bigquerybatch.credentialsFile=, transforms.hoist.type=org.apache.kafka.connect.transforms.HoistField$Value, internal.key.converter=org.apache.kafka.connect.json.JsonConverter, database.hostname=localhost, debezium.sink.bigquerystream.location=EU, transforms.unwrap.add.fields=op,table,source.ts_ms,db,source.lsn,source.txId, debezium.sink.bigquerybatch.credentialsFile=, table.include.list=inventory.test_data_types, snapshot.select.statement.overrides.public.table_name=SELECT * FROM table_name WHERE 1>2}', error = '{}': java.lang.ClassCastException: class io.debezium.server.converters.TemporalToISOStringConverter cannot be cast to class io.debezium.spi.converter.CustomConverter (io.debezium.server.converters.TemporalToISOStringConverter is in unnamed module of loader 'app'; io.debezium.spi.converter.CustomConverter is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @176333ee)
    at io.debezium.config.CommonConnectorConfig.lambda$getCustomConverters$1(CommonConnectorConfig.java:767)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at io.debezium.config.CommonConnectorConfig.getCustomConverters(CommonConnectorConfig.java:771)
    at io.debezium.config.CommonConnectorConfig.<init>(CommonConnectorConfig.java:631)
    at io.debezium.relational.RelationalDatabaseConnectorConfig.<init>(RelationalDatabaseConnectorConfig.java:629)
    at io.debezium.connector.postgresql.PostgresConnectorConfig.<init>(PostgresConnectorConfig.java:1103)
    at io.debezium.connector.postgresql.PostgresConnectorTask.start(PostgresConnectorTask.java:64)
    at io.debezium.connector.common.BaseSourceTask.start(BaseSourceTask.java:133)
    at io.debezium.embedded.EmbeddedEngine.run(EmbeddedEngine.java:760)
    at io.debezium.embedded.ConvertingEngineBuilder$2.run(ConvertingEngineBuilder.java:192)
    at io.debezium.server.DebeziumServer.lambda$start$1(DebeziumServer.java:152)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:829)

How to Reproduce?

Reproducing

  1. Clone this branch https://github.com/memiiso/debezium-server-bigquery/tree/add_iso_datetime_converter
  2. change quarks version to in the root pom.xml https://github.com/memiiso/debezium-server-bigquery/blob/add_iso_datetime_converter/pom.xml#L39
  3. run this test https://github.com/memiiso/debezium-server-bigquery/blob/add_iso_datetime_converter/debezium-server-bigquery-sinks/src/test/java/io/debezium/server/converters/ChangeConsumerConverterTest.java

Output of uname -a or ver

No response

Output of java -version

11

GraalVM version (if different from Java)

No response

Quarkus version or git rev

2.11.3.Final

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

No response

Additional information

No response

aloubyansky commented 2 years ago

Thanks @ismailsimsek. I'm getting

The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.

Would it be difficult to have a version that doesn't require setting up the credentials?

ismailsimsek commented 2 years ago

@aloubyansky commented out that section of the code in quarkus_testing_class_loading branch. this one should work

aloubyansky commented 2 years ago

Thanks!

quarkus-bot[bot] commented 2 years ago

/cc @Sanne, @aloubyansky, @gsmet, @radcortez, @stuartwdouglas

ChaudaryAbdulRehman commented 1 year ago

any update on that issue i am facing the same issue, both classes are being loaded by different classLoaders

aloubyansky commented 1 year ago

@ChaudaryAbdulRehman do you have a reproducer for you issue? Looks like the original one is gone now.

aloubyansky commented 1 year ago

This issue should have been closed with the subsequent platform release including the fixed Debezium version.