Ycallaer opened a new issue, #18395:
URL: https://github.com/apache/iceberg/issues/18395

   ### Apache Iceberg version
   
   1.12.0 (latest release)
   
   ### Query engine
   
   Kafka Connect
   
   ### Please describe the bug 🐞
   
   
[build.gradle.txt](https://github.com/user-attachments/files/33100827/build.gradle.txt)
   
   Hi,
   We recently tried upgrading our kafka connect version from 1.11.0 to 1.12.0 
but ran into an issue.
   Our setup is as follows:
   * kafka connect CFK 8.3.1
   * Catalog : Databricks
   * Behind the catalog is an azure blobstorage account
   
   When we moved to 1.12.0 ( no other changes were done in connect) we saw the 
connector running but no data was being forwarded.
   When we put connect in  debug mode we could see the following failure
   ```
   java.lang.NoSuchMethodError: 'java.lang.String 
io.netty.internal.tcnative.SSL.getGroupName(long)'
        at 
io.netty.handler.ssl.ReferenceCountedOpenSslEngine$DefaultOpenSslSession.handshakeFinished(ReferenceCountedOpenSslEngine.java:2658)
        at 
io.netty.handler.ssl.ExtendedOpenSslSession.handshakeFinished(ExtendedOpenSslSession.java:251)
        at 
io.netty.handler.ssl.ReferenceCountedOpenSslEngine.handshake(ReferenceCountedOpenSslEngine.java:2025)
        at 
io.netty.handler.ssl.ReferenceCountedOpenSslEngine.wrap(ReferenceCountedOpenSslEngine.java:889)
        ...
   ```
   I did some analysis with AI on this ( as I am not super familiar with the 
code base) and we saw the following:
   
   On Iceberg 1.11.0, the iceberg-kafka-connect-runtime distribution resolved 
these versions together:
   - netty-handler:4.2.13.Final
   - netty-tcnative-classes:2.0.74.Final / 
netty-tcnative-boringssl-static:2.0.74.Final
   
   These are mutually compatible, and Azure Blob Storage writes (via 
iceberg.catalog.vended-credentials-enabled=true, which routes file I/O through 
azure-core-http-netty/reactor-netty) worked correctly.
   
   In 1.12.0:
   gradle/libs.versions.toml bumped azuresdk-bom from 1.3.6 to 1.3.8. This 
transitively pulls a newer netty-handler:4.2.18.Final (via 
azure-core-http-netty/reactor-netty), but 
netty-tcnative-classes/netty-tcnative-boringssl-static only moved to 
2.0.78.Final — three releases behind what netty-handler:4.2.18.Final actually 
needs.
   netty-handler:4.2.18.Final's 
ReferenceCountedOpenSslEngine$DefaultOpenSslSession.handshakeFinished() calls:
   io.netty.internal.tcnative.SSL.getGroupName(long)
   This method was only added upstream in netty-tcnative 2.0.81.Final 
(netty/netty-tcnative#991 (https://github.com/netty/netty-tcnative/pull/991), 
merged 2026-07-07). It does not exist in 2.0.74.Final through 2.0.80.Final.
   
   Impact
   Any Kafka Connect sink task writing to Azure Blob Storage with 
iceberg.catalog.vended-credentials-enabled=true hangs silently and permanently 
on its first TLS handshake to blob storage:
   java.lang.NoSuchMethodError: 'java.lang.String 
io.netty.internal.tcnative.SSL.getGroupName(long)'
        at 
io.netty.handler.ssl.ReferenceCountedOpenSslEngine$DefaultOpenSslSession.handshakeFinished(ReferenceCountedOpenSslEngine.java:2658)
        at 
io.netty.handler.ssl.ExtendedOpenSslSession.handshakeFinished(ExtendedOpenSslSession.java:251)
        at 
io.netty.handler.ssl.ReferenceCountedOpenSslEngine.handshake(ReferenceCountedOpenSslEngine.java:2025)
        at 
io.netty.handler.ssl.ReferenceCountedOpenSslEngine.wrap(ReferenceCountedOpenSslEngine.java:889)
        ...
   
   The critical part: the exception happens on a reactor-netty I/O thread, not 
the Kafka Connect task thread, and is caught by 
reactor.core.Exceptions.throwIfFatal, which logs it only at WARN:
   throwIfFatal detected a jvm fatal exception, which is thrown and logged 
below:
   java.lang.NoSuchMethodError: 'java.lang.String 
io.netty.internal.tcnative.SSL.getGroupName(long)'
   It is never propagated back to the sink task. The task's own thread is left 
waiting on a future that will never complete. Kafka Connect shows the 
connector/task as RUNNING with no ERROR-level log at all. The consumer keeps 
polling and advancing offsets, the sink writer successfully builds Parquet 
files in memory, but the coordinator's commit never gets a DataWritten event, 
so every commit cycle logs:
   Coordinator ... completed commit <id>, committed to 0 table(s), 
valid-through null
   indefinitely. From the outside, data appears to stop flowing into the table 
with zero diagnostic signal — only visible at DEBUG level, where the affected 
task's thread simply stops logging mid-stream while other threads/connectors 
continue.
   
   Our fix
   Forcing netty-tcnative-classes and netty-tcnative-boringssl-static to 
2.0.81.Final (the first version with getGroupName) in the kafka-connect-runtime 
module's dependency resolution resolves the NoSuchMethodError. We also had to 
explicitly add a runtimeOnly dependency on the classified 
netty-tcnative-boringssl-static:...:linux-x86_64 artifact, since the default 
(classifier-less) artifact Gradle resolves transitively contains no native .so 
at all — it's a metadata-only jar.
   
   Suggested fix upstream
   In kafka-connect/build.gradle, bump 
netty-tcnative-classes/netty-tcnative-boringssl-static to at least 2.0.81.Final 
to match the netty-handler version actually being shipped, and ensure the 
platform-classified native artifact is included in the runtime distribution.
   I have added the build.gradle.txt ( remove txt extension) which worked for us
   
   
   ### Willingness to contribute
   
   - [ ] I can contribute a fix for this bug independently
   - [ ] I would be willing to contribute a fix for this bug with guidance from 
the Iceberg community
   - [ ] I cannot contribute a fix for this bug at this time


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to