Skip to content

Commit 0d5fad8

Browse files
committed
Enh 38282553 - [38277648->15.1.1.0.0] GraalVM Add Coherence GraalVM native feature - update native test logic
(merge 15.1.1-0 -> ce/15.1.1-0 118444) [git-p4: depot-paths = "//dev/coherence-ce/release/coherence-ce-v15.1.1.0/": change = 118445]
1 parent 70933ed commit 0d5fad8

File tree

76 files changed

+645
-119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+645
-119
lines changed

prj/coherence-bedrock/coherence-bedrock/src/main/java/com/oracle/bedrock/runtime/coherence/graal/BedrockNativeImageFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ protected Set<Class<? extends Annotation>> getAnnotations()
4747
@Override
4848
protected Set<String> getLoadAllClassesFromPackages()
4949
{
50-
return Set.of("com.oracle.bedrock");
50+
return Set.of("com.oracle.bedrock", "org.hamcrest");
5151
}
5252

5353
// ----- data members ---------------------------------------------------

prj/coherence-core-components/src/main/java/com/tangosol/coherence/graal/AbstractNativeImageFeature.java

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.graalvm.nativeimage.hosted.RuntimeReflection;
1818
import org.graalvm.nativeimage.hosted.RuntimeSerialization;
1919

20+
import java.io.Serializable;
2021
import java.lang.annotation.Annotation;
2122
import java.lang.reflect.Constructor;
2223
import java.lang.reflect.Method;
@@ -69,24 +70,46 @@ public void beforeAnalysis(BeforeAnalysisAccess access)
6970

7071
for (String packageName : setPackage)
7172
{
72-
if (classInfo.getPackageName().startsWith(packageName))
73+
if (clazz.getPackageName().startsWith(packageName))
7374
{
7475
registerAllElements(clazz);
76+
if (Serializable.class.isAssignableFrom(clazz))
77+
{
78+
RuntimeSerialization.register(clazz);
79+
}
7580
fRegistered = true;
7681
break;
7782
}
7883
}
7984

80-
for (Class<?> serializableType : getSerializableTypes())
85+
if (!fRegistered)
8186
{
82-
if (serializableType.isAssignableFrom(clazz))
87+
for (Class<?> handledSuperType : getSupertypes())
8388
{
84-
RuntimeSerialization.register(clazz);
85-
if (!fRegistered)
89+
if (handledSuperType.isAssignableFrom(clazz))
8690
{
8791
registerAllElements(clazz);
92+
if (Serializable.class.isAssignableFrom(clazz))
93+
{
94+
RuntimeSerialization.register(clazz);
95+
}
96+
fRegistered = true;
97+
break;
98+
}
99+
}
100+
}
101+
102+
if (!fRegistered)
103+
{
104+
for (Class<?> serializableType : getSerializableTypes())
105+
{
106+
if (serializableType.isAssignableFrom(clazz))
107+
{
108+
RuntimeSerialization.register(clazz);
109+
registerAllElements(clazz);
110+
fRegistered = true;
111+
break;
88112
}
89-
break;
90113
}
91114
}
92115

@@ -110,30 +133,14 @@ public void afterRegistration(AfterRegistrationAccess access)
110133
try
111134
{
112135
var clazz = Class.forName(classInfo.getName(), false, imageClassLoader);
113-
boolean registered = false;
114-
115136
for (Class<? extends Annotation> annotation : getAnnotations())
116137
{
117138
if (clazz.getAnnotation(annotation) != null)
118139
{
119140
registerAllElements(clazz);
120-
registered = true;
121141
break;
122142
}
123143
}
124-
125-
if (!registered)
126-
{
127-
for (Class<?> handledSuperType : getSupertypes())
128-
{
129-
if (handledSuperType.isAssignableFrom(clazz))
130-
{
131-
registerAllElements(clazz);
132-
break;
133-
}
134-
}
135-
}
136-
137144
processClassAfterRegistration(access, clazz);
138145
}
139146
catch (ClassNotFoundException | LinkageError e)
@@ -184,6 +191,9 @@ protected void scan(ClassLoader imageClassLoader, List<Path> classPath, Consumer
184191
.overrideClasspath(classPath)
185192
.overrideClassLoaders(imageClassLoader)
186193
.enableAllInfo()
194+
.ignoreClassVisibility()
195+
.ignoreFieldVisibility()
196+
.ignoreMethodVisibility()
187197
.scan(Runtime.getRuntime().availableProcessors()))
188198
{
189199
scanResult.getAllClasses().forEach(consumer);

prj/coherence-core-components/src/main/java/com/tangosol/coherence/graal/CoherenceNativeImageFeature.java

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package com.tangosol.coherence.graal;
99

10+
import com.oracle.coherence.common.base.SimpleHolder;
1011
import com.oracle.coherence.common.internal.security.SecurityProvider;
1112
import com.oracle.coherence.common.schema.SchemaExtension;
1213
import com.oracle.coherence.common.schema.SchemaSource;
@@ -105,6 +106,8 @@
105106
import javax.management.openmbean.OpenMBeanConstructorInfoSupport;
106107
import java.io.IOException;
107108
import java.io.InputStream;
109+
import java.io.NotSerializableException;
110+
import java.io.ObjectStreamException;
108111
import java.io.Serializable;
109112
import java.lang.annotation.Annotation;
110113

@@ -203,7 +206,7 @@ public void duringSetup(DuringSetupAccess access)
203206
Properties props = new Properties();
204207
props.load(in);
205208
COHERENCE_PROPERTIES.add(props);
206-
addPackageNames(props.getProperty("packages"));
209+
addPackageNames(props.getProperty(PROP_LOAD_ALL_CLASSES));
207210
}
208211
}
209212
catch (IOException e)
@@ -270,15 +273,18 @@ else if (Map.class.isAssignableFrom(clazz) && Serializable.class.isAssignableFro
270273
registerAllElements(CacheFactory.class);
271274

272275
// Register exceptions
273-
RuntimeSerialization.register(StackTraceElement.class);
274-
RuntimeSerialization.register(Throwable.class);
276+
RuntimeSerialization.register(ClassNotFoundException.class);
275277
RuntimeSerialization.register(Exception.class);
276-
RuntimeSerialization.register(RuntimeException.class);
277-
RuntimeSerialization.register(WrapperException.class);
278-
RuntimeSerialization.register(ReflectiveOperationException.class);
279278
RuntimeSerialization.register(InvocationTargetException.class);
280-
RuntimeSerialization.register(RejectedExecutionException.class);
281279
RuntimeSerialization.register(MBeanException.class);
280+
RuntimeSerialization.register(NotSerializableException.class);
281+
RuntimeSerialization.register(ObjectStreamException.class);
282+
RuntimeSerialization.register(ReflectiveOperationException.class);
283+
RuntimeSerialization.register(RejectedExecutionException.class);
284+
RuntimeSerialization.register(RuntimeException.class);
285+
RuntimeSerialization.register(StackTraceElement.class);
286+
RuntimeSerialization.register(Throwable.class);
287+
RuntimeSerialization.register(WrapperException.class);
282288

283289
RuntimeSerialization.register(LicensedObject.class);
284290
RuntimeSerialization.register(Permission.class);
@@ -322,6 +328,11 @@ else if (Map.class.isAssignableFrom(clazz) && Serializable.class.isAssignableFro
322328
RuntimeSerialization.register(Collections.EMPTY_SET.getClass());
323329
registerAllElements(Collections.EMPTY_SET.getClass());
324330

331+
RuntimeSerialization.register(SimpleHolder.class);
332+
registerAllElements(SimpleHolder.class);
333+
RuntimeSerialization.register(com.tangosol.util.SimpleHolder.class);
334+
registerAllElements(com.tangosol.util.SimpleHolder.class);
335+
325336
registerAllElements(SecurityProvider.class);
326337
}
327338

@@ -482,6 +493,8 @@ public void accept(DuringAnalysisAccess access, Class<?> clazz)
482493
*/
483494
private final List<Properties> COHERENCE_PROPERTIES = new CopyOnWriteArrayList<>();
484495

485-
private final SortedSet<String> loadAllClassesFromPackages
486-
= new TreeSet<>(Set.of("com.oracle.coherence", "com.tangosol"));
496+
private final SortedSet<String> loadAllClassesFromPackages = new TreeSet<>(
497+
Set.of("com.oracle.coherence",
498+
"com.tangosol",
499+
"com.github.benmanes.caffeine.cache"));
487500
}

prj/coherence-core/src/main/resources/META-INF/native-image/com.oracle.coherence/coherence/reachability-metadata.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,10 @@
12081208
"parameterTypes": []
12091209
}
12101210
]
1211+
},
1212+
{
1213+
"type": "com.oracle.svm.core.jdk.UnsupportedFeatureError",
1214+
"serializable": true
12111215
}
12121216
],
12131217
"resources": [

prj/coherence-native/pom.xml

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
4+
5+
Licensed under the Universal Permissive License v 1.0 as shown at
6+
https://oss.oracle.com/licenses/upl.
7+
-->
8+
9+
<project xmlns="http://maven.apache.org/POM/4.0.0"
10+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
11+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
12+
<modelVersion>4.0.0</modelVersion>
13+
14+
<parent>
15+
<groupId>com.oracle.coherence.ce</groupId>
16+
<artifactId>main</artifactId>
17+
<version>${revision}</version>
18+
<relativePath>../pom.xml</relativePath>
19+
</parent>
20+
21+
<artifactId>coherence-native</artifactId>
22+
<packaging>jar</packaging>
23+
<name>Coherence GraalVM Native Image</name>
24+
25+
<properties>
26+
<useModulePath>false</useModulePath>
27+
<bedrockUseModules>false</bedrockUseModules>
28+
</properties>
29+
30+
<dependencies>
31+
<dependency>
32+
<groupId>${coherence.group.id}</groupId>
33+
<artifactId>coherence</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>${coherence.group.id}</groupId>
37+
<artifactId>coherence-grpc-proxy</artifactId>
38+
</dependency>
39+
<dependency>
40+
<groupId>${coherence.group.id}</groupId>
41+
<artifactId>coherence-json</artifactId>
42+
</dependency>
43+
44+
<dependency>
45+
<groupId>org.glassfish</groupId>
46+
<artifactId>jakarta.json</artifactId>
47+
<classifier>module</classifier>
48+
</dependency>
49+
50+
<!-- tracing dependencies -->
51+
<dependency>
52+
<groupId>io.opentelemetry</groupId>
53+
<artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
54+
</dependency>
55+
<dependency>
56+
<groupId>io.opentelemetry</groupId>
57+
<artifactId>opentelemetry-exporter-otlp</artifactId>
58+
<exclusions>
59+
<exclusion>
60+
<groupId>com.squareup.okhttp3</groupId>
61+
<artifactId>okhttp</artifactId>
62+
</exclusion>
63+
</exclusions>
64+
</dependency>
65+
<!--
66+
Added due to https://github.com/open-telemetry/opentelemetry-java/issues/7491.
67+
This should be resolved in a future release at which point this can be removed.
68+
-->
69+
<dependency>
70+
<groupId>com.squareup.okhttp3</groupId>
71+
<artifactId>okhttp-jvm</artifactId>
72+
</dependency>
73+
74+
<!-- slf4j -->
75+
<dependency>
76+
<groupId>org.slf4j</groupId>
77+
<artifactId>slf4j-simple</artifactId>
78+
</dependency>
79+
80+
<dependency>
81+
<groupId>${coherence.group.id}</groupId>
82+
<artifactId>coherence-testing-support</artifactId>
83+
<version>${project.version}</version>
84+
<scope>test</scope>
85+
</dependency>
86+
<dependency>
87+
<groupId>${coherence.group.id}</groupId>
88+
<artifactId>coherence-bedrock-testing-support</artifactId>
89+
<version>${project.version}</version>
90+
<scope>test</scope>
91+
</dependency>
92+
93+
<dependency>
94+
<groupId>org.junit.jupiter</groupId>
95+
<artifactId>junit-jupiter-api</artifactId>
96+
<scope>test</scope>
97+
</dependency>
98+
<dependency>
99+
<groupId>org.junit.jupiter</groupId>
100+
<artifactId>junit-jupiter-params</artifactId>
101+
<scope>test</scope>
102+
</dependency>
103+
104+
<dependency>
105+
<groupId>org.hamcrest</groupId>
106+
<artifactId>hamcrest-all</artifactId>
107+
<scope>test</scope>
108+
</dependency>
109+
<dependency>
110+
<groupId>org.mockito</groupId>
111+
<artifactId>mockito-core</artifactId>
112+
<scope>test</scope>
113+
</dependency>
114+
<dependency>
115+
<groupId>net.bytebuddy</groupId>
116+
<artifactId>byte-buddy</artifactId>
117+
<scope>test</scope>
118+
</dependency>
119+
<dependency>
120+
<groupId>net.bytebuddy</groupId>
121+
<artifactId>byte-buddy-agent</artifactId>
122+
<scope>test</scope>
123+
</dependency>
124+
</dependencies>
125+
126+
<build>
127+
<plugins>
128+
<plugin>
129+
<groupId>org.apache.maven.plugins</groupId>
130+
<artifactId>maven-failsafe-plugin</artifactId>
131+
<configuration>
132+
<skip>true</skip>
133+
</configuration>
134+
</plugin>
135+
136+
<plugin>
137+
<groupId>org.apache.maven.plugins</groupId>
138+
<artifactId>maven-surefire-plugin</artifactId>
139+
<configuration>
140+
<skip>true</skip>
141+
</configuration>
142+
</plugin>
143+
</plugins>
144+
</build>
145+
146+
<profiles>
147+
<profile>
148+
<id>native</id>
149+
<activation>
150+
<activeByDefault>false</activeByDefault>
151+
</activation>
152+
<build>
153+
<plugins>
154+
<plugin>
155+
<groupId>org.graalvm.buildtools</groupId>
156+
<artifactId>native-maven-plugin</artifactId>
157+
<extensions>true</extensions>
158+
<executions>
159+
<execution>
160+
<id>build-native</id>
161+
<goals>
162+
<goal>compile-no-fork</goal>
163+
</goals>
164+
<phase>package</phase>
165+
<configuration>
166+
<skip>${skip.native.build}</skip>
167+
<mainClass>com.tangosol.net.Coherence</mainClass>
168+
<quickBuild>true</quickBuild>
169+
<imageName>coherence</imageName>
170+
<buildArgs>
171+
<buildArg>-march=native</buildArg>
172+
<buildArg>--future-defaults=all</buildArg>
173+
<buildArg>--emit</buildArg>
174+
<buildArg>build-report</buildArg>
175+
<buildArg>-J-Xmx45g</buildArg>
176+
<buildArg>-H:+UnlockExperimentalVMOptions</buildArg>
177+
<buildArg>-H:+UseConservativeUnsafeAccess</buildArg>
178+
<!-- Required for using http e.g. metrics, management, etc... -->
179+
<buildArg>--enable-http</buildArg>
180+
<buildArg>--enable-https</buildArg>
181+
<!-- Required for tests that use JMX -->
182+
<buildArg>--enable-monitoring=jmxserver,jmxclient,jvmstat</buildArg>
183+
<!-- Required for tests that add -XX:+HeapDumpOnOutOfMemoryError -->
184+
<buildArg>--enable-monitoring=heapdump</buildArg>
185+
<!-- Required to generate thread dumps in a native image -->
186+
<buildArg>--enable-monitoring=threaddump</buildArg>
187+
<!-- Required for tests that use JFRs, for example, management tests -->
188+
<buildArg>--enable-monitoring=jfr</buildArg>
189+
<!-- This is to capture a JFR of the native image compiler; it may break tests -->
190+
<!-- <buildArg>-J-XX:StartFlightRecording=dumponexit=true</buildArg> -->
191+
</buildArgs>
192+
</configuration>
193+
</execution>
194+
</executions>
195+
</plugin>
196+
</plugins>
197+
</build>
198+
</profile>
199+
</profiles>
200+
</project>

0 commit comments

Comments
 (0)