[ 
https://issues.apache.org/jira/browse/DERBY-6854?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-6854:
--------------------------------------
    Attachment: d6854-classloader.diff

The JDBC classes are about to be moved out of the boot class loader and into 
the platform class loader in JDK 9. See 
[JDK-8154189|https://bugs.openjdk.java.net/browse/JDK-8154189] in the OpenJDK 
bug tracker for details.

I ran the regression tests with JDK 9 patched up with the changes suggested in 
the OpenJDK bug report to see if it would break anything. With sane jars, most 
of the tests that ran under a security manager failed with 
AccessControlExceptions. It looked better with insane jars, but there were 
still failures (NoClassDefFoundErrors) in the upgrade tests and 
SysinfoLocaleTest.

The reason is that Derby has some test and debug code that assumes that the 
JDBC classes live in the boot class loader:

1) Some tests create a new class loader in order to make the test load the 
Derby classes afresh (SysinfoLocaleTest), or to test against a different 
version of Derby (the upgrade tests). To achieve this, they create a 
URLClassLoader which contains the Derby jar files they want to test against, 
and set the parent of the URLClassLoader to null, which means that the boot 
class loader is the parent.

Now that the JDBC classes are not on the boot class loader, this URLClassLoader 
is not able to find the JDBC classes, and the tests fail with 
NoClassDefFoundErrors when trying to load them.

This is fixed by setting the parent of the created URLClassLoader to what 
java.sql.Connection.class.getClassLoader() returns. On JDK 8 and earlier it 
returns null, so nothing changes there. On JDK 9 it returns the platform class 
loader, which is capable of loading the JDBC classes.

2) The org.apache.derby.impl.services.bytecode.d_BCValidate class contains some 
debug code (only included in the sane jars) which runs some sanity checks on 
the generated byte code. To do this, it accesses the class loader of all the 
classes in the method signatures.

When getClassLoader() is called on JDBC classes, a RuntimePermission is needed 
now. This was not the case before when the JDBC classes were in the boot class 
loader, since Class.getClassLoader() does not check for permissions if the 
class loader is null. Now this causes an AccessControlException in tests that 
run with a security manager. The tests actually grant the required permission 
to derby.jar, but the call is not wrapped in AccessController.doPrivileged(), 
so it fails because the permission is not granted to the test code.

The fix is to wrap the call to getClassLoader() in a doPrivileged() block. 
Additionally, because RuntimePermission("getClassLoader") is not a mandatory 
permission for derby.jar, we need to check if it raises a security exception. 
d_BCValidate only needs the class loader in order to check if it is the same 
class loader as d_BCValidate's own class loader. Since Class.getClassLoader() 
does not require any permissions if the class has the same class loader as the 
calling class, we can conclude that the class loaders are different if a 
security exception is raised.

The attached patch [^d6854-classloader.diff] makes those changes. With this 
patch, the tests run cleanly both with JDK 8 and with JDK 9 in my environment.

> Make it possible to run Derby tests on early access versions of JDK 9
> ---------------------------------------------------------------------
>
>                 Key: DERBY-6854
>                 URL: https://issues.apache.org/jira/browse/DERBY-6854
>             Project: Derby
>          Issue Type: Improvement
>          Components: Build tools
>    Affects Versions: 10.12.1.1
>            Reporter: Rick Hillegas
>            Assignee: Rick Hillegas
>         Attachments: d6854-classloader.diff, derby-6854-01-aa-fixFor9-ea.diff
>
>
> Early access versions of JDK 9 (build 100) have "9-ea" as the java.version 
> and "9" as the java.specification.version. This confuses the 
> JavaVersionHolder class which the regression tests use in order to determine 
> the vm level. At a minimum, we need to make JavaVersionHolder recognize these 
> early access strings.
> This issue can be left open even after a fix is applied because we have no 
> idea how java.version and java.specification.version are going to evolve over 
> the remaining development cycle for JDK 9.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to