Project

General

Profile

Bug #10276

Joinable interface should be made public

Added by Andrei Plugaru about 1 year ago. Updated about 1 year ago.

Status:
New
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
Due date:
% Done:

0%

billable:
No
vendor_id:
GCD
case_num:
version_reported:
version_resolved:
reviewer:
production:
No
env_name:
topics:

History

#1 Updated by Andrei Plugaru about 1 year ago

While investigating #8279, I found an important functional issue regarding Joinable interface. I was getting this exception while running a small testcase with a CompoundQuery:

java.lang.IllegalAccessError: failed to access class com.goldencode.p2j.persist.Joinable from class com.goldencode.p2j.persist.CompoundQueryMethodAccess (com.goldencode.p2j.persist.Joinable is in unnamed module of loader 'app'; com.goldencode.p2j.persist.CompoundQueryMethodAccess is in unnamed module of loader com.esotericsoftware.reflectasm.AccessClassLoader @28ec166e)
    at com.goldencode.p2j.persist.CompoundQueryMethodAccess.invoke(Unknown Source)
    at com.goldencode.p2j.util.Utils.invoke(Utils.java:1737)
    at com.goldencode.p2j.persist.RuntimeJastInterpreter.callMethod(RuntimeJastInterpreter.java:1021)
    at com.goldencode.p2j.persist.RuntimeJastInterpreter.execMethod(RuntimeJastInterpreter.java:685)
    at com.goldencode.p2j.persist.RuntimeJastInterpreter.interpret(RuntimeJastInterpreter.java:444)
    at com.goldencode.p2j.persist.DynamicQueryHelper$2.onQueryOpen(DynamicQueryHelper.java:781)
    at com.goldencode.p2j.persist.AbstractQuery.notifyQueryOpenListeners(AbstractQuery.java:1129)
    at com.goldencode.p2j.persist.QueryWrapper.queryOpen(QueryWrapper.java:4720)
    at com.goldencode.dataset.Eight237.lambda$p1$1(Eight237.java:60)
    at com.goldencode.p2j.util.Block.body(Block.java:636)
    at com.goldencode.p2j.util.BlockManager.processBody(BlockManager.java:9613)
    at com.goldencode.p2j.util.BlockManager.topLevelBlock(BlockManager.java:9221)
    at com.goldencode.p2j.util.BlockManager.internalProcedure(BlockManager.java:851)
    at com.goldencode.p2j.util.BlockManager.internalProcedure(BlockManager.java:828)
    at com.goldencode.dataset.Eight237.p1(Eight237.java:55)
    at com.goldencode.dataset.Eight237MethodAccess.invoke(Unknown Source)
    at com.goldencode.p2j.util.ControlFlowOps$InternalEntryCaller.invokeImpl(ControlFlowOps.java:9761)
    at com.goldencode.p2j.util.ControlFlowOps$InternalEntryCaller.invoke(ControlFlowOps.java:9717)
    at com.goldencode.p2j.util.ControlFlowOps.lambda$invokeImpl$12(ControlFlowOps.java:7611)
    at com.goldencode.p2j.util.ControlFlowOps.invokeImpl(ControlFlowOps.java:7626)
    at com.goldencode.p2j.util.ControlFlowOps.invoke(ControlFlowOps.java:4572)
    at com.goldencode.p2j.util.ControlFlowOps.invokeImpl(ControlFlowOps.java:7189)
    at com.goldencode.p2j.util.ControlFlowOps.invokeImpl(ControlFlowOps.java:7092)
    at com.goldencode.p2j.util.ControlFlowOps.invokeWithMode(ControlFlowOps.java:1447)
    at com.goldencode.p2j.util.ControlFlowOps.invokeWithMode(ControlFlowOps.java:1429)
    at com.goldencode.p2j.util.ControlFlowOps.invoke(ControlFlowOps.java:1377)
    at com.goldencode.p2j.util.InvokeConfig.run(InvokeConfig.java:427)
    at com.goldencode.dataset.Eight237.lambda$execute$0(Eight237.java:44)
    at com.goldencode.p2j.util.Block.body(Block.java:636)
    at com.goldencode.p2j.util.BlockManager.processBody(BlockManager.java:9613)
    at com.goldencode.p2j.util.BlockManager.topLevelBlock(BlockManager.java:9221)
    at com.goldencode.p2j.util.BlockManager.externalProcedure(BlockManager.java:691)
    at com.goldencode.p2j.util.BlockManager.externalProcedure(BlockManager.java:664)
    at com.goldencode.dataset.Eight237.execute(Eight237.java:33)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    at com.goldencode.p2j.util.Utils.invoke(Utils.java:1815)
    at com.goldencode.p2j.main.StandardServer$MainInvoker.execute(StandardServer.java:2929)
    at com.goldencode.p2j.main.StandardServer.invoke(StandardServer.java:2202)
    at com.goldencode.p2j.main.StandardServer.standardEntry(StandardServer.java:704)
    at com.goldencode.p2j.main.StandardServerMethodAccess.invoke(Unknown Source)
    at com.goldencode.p2j.util.MethodInvoker.invoke(MethodInvoker.java:156)
    at com.goldencode.p2j.net.Dispatcher.processInbound(Dispatcher.java:807)
    at com.goldencode.p2j.net.Conversation.block(Conversation.java:418)
    at com.goldencode.p2j.net.Conversation.run(Conversation.java:237)
    at java.base/java.lang.Thread.run(Thread.java:840)

A quick fix for that is to make Joinable interface public. However, it's interesting that this problem only occurred in the dataset, not for any large customer application. The difference is that server.sh for some(maybe all) large customer applications contains --add-opens java.base/java.lang=ALL-UNNAMED. This somehow solves the issue even in my dataset. However, I am confused why this happens. As far as I understand, that option should have allowed access to non-public members of java.base/java.lang for all the code that is in an unnamed module. However, we would have needed access to non-public members in com.goldencode.p2j.persist.

However, even though some clients use --add-opens java.base/java.lang=ALL-UNNAMED and they don't see this problem, I think it is still worth to change the access modifier of Joinable interface to public in order to avoid further issues.

Also available in: Atom PDF