[
https://issues.apache.org/jira/browse/IGNITE-28863?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dmitry Werner updated IGNITE-28863:
-----------------------------------
Attachment: _Apache_Ignite_2.x_Tests_SPI_URI_Deploy_40213.log
> Fix flaky GridFileDeploymentSelfTest
> ------------------------------------
>
> Key: IGNITE-28863
> URL: https://issues.apache.org/jira/browse/IGNITE-28863
> Project: Ignite
> Issue Type: Test
> Reporter: Dmitry Werner
> Assignee: Dmitry Werner
> Priority: Minor
> Labels: MakeTeamcityGreenAgain, ise
> Attachments: _Apache_Ignite_2.x_Tests_SPI_URI_Deploy_40213.log
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> *Root Cause*
> All 7 GridFileDeploymentSelfTest failures stem from a duplicate entry in
> deployfile-bad-signed.jar.
> The pom.xml build script intentionally creates a corrupted JAR for testing
> bad signature verification:
> 1. Copies `GridUriDeploymentTestTask11.class` under the name
> `GridUriDeploymentTestWithNameTask11.class` (bytecode contains `this_class =
> GridUriDeploymentTestTask11` → mismatch with filename)
> 2. Packs this corrupted class into JAR, signs it, then updates the JAR with
> the correct class:
> {code:java}
> <zip destfile="...${bad-signed.jar}" basedir=".../target/classes/"
> includes=".../GridUriDeploymentTestWithNameTask11.class" update="yes"
> />{code}
> The problem: `ant zip update="yes"` behavior changed in Ant 1.9+. Instead of
> replacing an existing entry, it appends a duplicate at the end of the
> archive. The JAR now contains two entries with the same name:
> - First entry (corrupted, `this_class = GridUriDeploymentTestTask11`) —
> loaded by `URLClassLoader`
> - Second entry (correct, `this_class = GridUriDeploymentTestWithNameTask11`)
> — never reached
> On JDK 17, `URLClassLoader.findClass()` loads the first (corrupted) entry →
> JVM throws `NoClassDefFoundError: wrong name`. This crashes the
> `grid-uri-scanner` thread, stopping all subsequent deployments. All
> `checkTask()` assertions fail with `findResource() == null`.
> {code:java}
>
> [ERROR][grid-uri-scanner-#35%file.GridFileDeploymentSelfTest%-#269%file.GridFileDeploymentSelfTest%][UriDeploymentScannerManager]
> Runtime error caught during grid runnable execution:
> IgniteSpiThread
> [name=grid-uri-scanner-#35%file.GridFileDeploymentSelfTest%-#269%file.GridFileDeploymentSelfTest%]
> java.lang.NoClassDefFoundError:
> org/apache/ignite/spi/deployment/uri/tasks/GridUriDeploymentTestWithNameTask11
> (wrong name: org/apache/ignite/spi/deployment/uri/tasks/
> GridUriDeploymentTestTask11)
> at java.base/java.lang.ClassLoader.defineClass1(Native Method)
> at
> java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
> at
> java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
> at
> java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:524)
> at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:427)
> at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:421)
> at
> java.base/java.security.AccessController.doPrivileged(JavaAccessController.java:77)
> at
> java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:420)
> at
> org.apache.ignite.spi.deployment.uri.GridUriDeploymentClassLoader.loadClass(GridUriDeploymentClassLoader.java:56)
> at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
> at
> org.apache.ignite.spi.deployment.uri.GridUriDeploymentFileResourceLoader.createResource(GridUriDeploymentFileResourceLoader.java:72)
> at
> org.apache.ignite.spi.deployment.uri.GridUriDeploymentDiscovery.findResourcesInDirectory(GridUriDeploymentDiscovery.java:109)
> ... (recursive directory traversal) ...
> at
> org.apache.ignite.spi.deployment.uri.GridUriDeploymentDiscovery.getClasses(GridUriDeploymentDiscovery.java:71)
> at
> org.apache.ignite.spi.deployment.uri.GridUriDeploymentFileProcessor.processNoDescriptorFile(GridUriDeploymentFileProcessor.java:388)
> at
> org.apache.ignite.spi.deployment.uri.GridUriDeploymentFileProcessor.processFile(GridUriDeploymentFileProcessor.java:108)
> at
> org.apache.ignite.spi.deployment.uri.UriDeploymentSpi$2.onNewOrUpdatedFile(UriDeploymentSpi.java:590)
> at
> org.apache.ignite.spi.deployment.uri.scanners.file.UriDeploymentFileScanner$URIContext.handleFile(UriDeploymentFileScanner.java:268)
> at
> org.apache.ignite.spi.deployment.uri.scanners.file.UriDeploymentFileScanner$URIContext$1.handle(UriDeploymentFileScanner.java:178)
> at
> org.apache.ignite.spi.deployment.uri.scanners.GridDeploymentFolderScannerHelper.scanFolder(GridDeploymentFolderScannerHelper.java:49)
> at
> org.apache.ignite.spi.deployment.uri.scanners.GridDeploymentFolderScannerHelper.scanFolder(GridDeploymentFolderScannerHelper.java:52)
> at
> org.apache.ignite.spi.deployment.uri.scanners.file.UriDeploymentFileScanner$URIContext.scan(UriDeploymentFileScanner.java:183)
> at
> org.apache.ignite.spi.deployment.uri.scanners.file.UriDeploymentFileScanner.scan(UriDeploymentFileScanner.java:73){code}
> The same issue exists for `bad-signed-deployfile.gar` with
> `GridUriDeploymentTestWithNameTask6`.
> *Fix*
> Replace `ant zip update="yes"` with the standard unzip → copy → zip pattern
> that works reliably across all Ant versions:
> {code:java}
> <unzip src=".../${bad-signed.jar}" dest="${basedir}/target/file_tmp/zipfix"
> />
> <copy
> file="${basedir}/target/classes/.../GridUriDeploymentTestWithNameTask11.class"
> todir="${basedir}/target/file_tmp/zipfix/..." overwrite="yes" />
> <delete file=".../${bad-signed.jar}" />
> <zip destfile=".../${bad-signed.jar}"
> basedir="${basedir}/target/file_tmp/zipfix" />{code}
> Applied to both `deployfile-bad-signed.jar` and `bad-signed-deployfile.gar`.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)