Skip to content

Commit

Permalink
Drop support for GraalVM/Mandrel 20.3
Browse files Browse the repository at this point in the history
(cherry picked from commit c6ebe45)
  • Loading branch information
zakkak authored and gsmet committed Dec 1, 2021
1 parent e34425a commit ed9016f
Show file tree
Hide file tree
Showing 12 changed files with 13 additions and 261 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ static final class Version implements Comparable<Version> {
"(GraalVM|native-image)( Version)? ([1-9][0-9]*)\\.([0-9]+)\\.[0-9]+(-dev\\p{XDigit}*)?([^\n$]*)\\s*");

static final Version UNVERSIONED = new Version("Undefined", -1, -1, Distribution.ORACLE);
static final Version VERSION_20_3 = new Version("GraalVM 20.3", 20, 3, Distribution.ORACLE);
static final Version VERSION_21_1 = new Version("GraalVM 21.1", 21, 1, Distribution.ORACLE);
static final Version VERSION_21_2 = new Version("GraalVM 21.2", 21, 2, Distribution.ORACLE);
static final Version VERSION_21_3 = new Version("GraalVM 21.3", 21, 3, Distribution.ORACLE);

static final Version MINIMUM = VERSION_20_3;
static final Version MINIMUM = VERSION_21_2;
static final Version CURRENT = VERSION_21_2;

final String fullVersion;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -658,15 +658,13 @@ public NativeImageInvokerInfo build() {
// This option was removed in GraalVM 21.1 https://github.com/oracle/graal/pull/3258
nativeImageArgs.add("--enable-all-security-services");
}
if (graalVMVersion.isNewerThan(GraalVM.Version.VERSION_20_3)) {
if (inlineBeforeAnalysis) {
if (graalVMVersion.isOlderThan(GraalVM.Version.VERSION_21_3)) {
// Enabled by default in GraalVM >= 21.3
nativeImageArgs.add("-H:+InlineBeforeAnalysis");
}
} else {
nativeImageArgs.add("-H:-InlineBeforeAnalysis");
if (inlineBeforeAnalysis) {
if (graalVMVersion.isOlderThan(GraalVM.Version.VERSION_21_3)) {
// Enabled by default in GraalVM >= 21.3
nativeImageArgs.add("-H:+InlineBeforeAnalysis");
}
} else {
nativeImageArgs.add("-H:-InlineBeforeAnalysis");
}
if (!noPIE.isEmpty()) {
nativeImageArgs.add("-H:NativeLinkerOption=" + noPIE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,18 +435,10 @@ public void write(String s, byte[] bytes) {
}
}
if (entry.getValue().fields) {
BranchResult graalVm21Test = tc.ifGreaterEqualZero(
tc.invokeVirtualMethod(VERSION_COMPARE_TO,
tc.invokeStaticMethod(VERSION_CURRENT),
tc.marshalAsArray(int.class, tc.load(21))));
graalVm21Test.trueBranch().invokeStaticMethod(
tc.invokeStaticMethod(
ofMethod(RUNTIME_REFLECTION, "register", void.class,
boolean.class, boolean.class, Field[].class),
tc.load(entry.getValue().finalFieldsWritable), tc.load(entry.getValue().serialization), fields);
graalVm21Test.falseBranch().invokeStaticMethod(
ofMethod(RUNTIME_REFLECTION, "register", void.class,
boolean.class, Field[].class),
tc.load(entry.getValue().finalFieldsWritable), fields);
} else if (!entry.getValue().fieldSet.isEmpty()) {
ResultHandle farray = tc.newArray(Field.class, tc.load(1));
for (String field : entry.getValue().fieldSet) {
Expand Down Expand Up @@ -547,38 +539,20 @@ private MethodDescriptor createRegisterSerializationForClassMethod(ClassCreator

TryBlock requiredCatch = requiredFeatures.tryBlock();

// It's too early in the GraalVM build to use Version.getCurrent()
BranchResult featuresGraalVm20Test = requiredCatch.ifTrue(requiredCatch
.invokeVirtualMethod(ofMethod(String.class, "startsWith", boolean.class, String.class),
requiredCatch.invokeStaticMethod(
ofMethod(System.class, "getProperty", String.class, String.class),
requiredCatch.load("org.graalvm.version")),
requiredCatch.load("20.")));

BytecodeCreator featuresIfGraalVM21Plus = featuresGraalVm20Test.falseBranch();

ResultHandle serializationFeatureClass = featuresIfGraalVM21Plus
ResultHandle serializationFeatureClass = requiredCatch
.loadClass("com.oracle.svm.reflect.serialize.hosted.SerializationFeature");
featuresIfGraalVM21Plus.returnValue(featuresIfGraalVM21Plus.invokeStaticMethod(
ResultHandle requiredFeaturesList = requiredCatch.invokeStaticMethod(
ofMethod("java.util.Collections", "singletonList", List.class, Object.class),
serializationFeatureClass));
serializationFeatureClass);

BytecodeCreator featuresIfNotGraalVM21Plus = featuresGraalVm20Test.trueBranch();
featuresIfNotGraalVM21Plus
.returnValue(featuresIfNotGraalVM21Plus
.invokeStaticMethod(ofMethod("java.util.Collections", "emptyList", List.class)));
requiredCatch.returnValue(requiredFeaturesList);

// method to register class for registration
MethodCreator addSerializationForClass = file.getMethodCreator("registerSerializationForClass", "V", Class.class);
addSerializationForClass.setModifiers(Modifier.PRIVATE | Modifier.STATIC);
ResultHandle clazz = addSerializationForClass.getMethodParam(0);

BranchResult graalVm21Test = addSerializationForClass.ifGreaterEqualZero(
addSerializationForClass.invokeVirtualMethod(VERSION_COMPARE_TO,
addSerializationForClass.invokeStaticMethod(VERSION_CURRENT),
addSerializationForClass.marshalAsArray(int.class, addSerializationForClass.load(21))));

TryBlock tc = graalVm21Test.trueBranch().tryBlock();
TryBlock tc = addSerializationForClass.tryBlock();

ResultHandle currentThread = tc
.invokeStaticMethod(ofMethod(Thread.class, "currentThread", Thread.class));
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,89 +4,18 @@
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.function.BooleanSupplier;
import java.util.function.Function;

import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.generic.IndexedRecord;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.ResolvingDecoder;
import org.apache.avro.util.WeakIdentityHashMap;
import org.graalvm.home.Version;

import com.oracle.svm.core.annotate.Alias;
import com.oracle.svm.core.annotate.Inject;
import com.oracle.svm.core.annotate.RecomputeFieldValue;
import com.oracle.svm.core.annotate.Substitute;
import com.oracle.svm.core.annotate.TargetClass;

@TargetClass(className = "org.apache.avro.reflect.ReflectionUtil", onlyWith = GraalVM20OrEarlier.class)
final class Target_org_apache_avro_reflect_ReflectionUtil {

/**
* Use reflection instead of method handles
*/
@Substitute
public static <V, R> Function<V, R> getConstructorAsFunction(Class<V> parameterClass, Class<R> clazz) {
try {
Constructor<R> constructor = clazz.getConstructor(parameterClass);
return new Function<V, R>() {
@Override
public R apply(V v) {
try {
return constructor.newInstance(v);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
} catch (Throwable t) {
// if something goes wrong, do not provide a Function instance
return null;
}
}

}

@TargetClass(className = "org.apache.avro.reflect.ReflectData", onlyWith = GraalVM20OrEarlier.class)
final class Target_org_apache_avro_reflect_ReflectData {

@Inject
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.None)
Map<Class<?>, Target_org_apache_avro_reflect_ReflectData_ClassAccessorData> ACCESSORS;

@Substitute
private Target_org_apache_avro_reflect_ReflectData_ClassAccessorData getClassAccessorData(Class<?> c) {
if (ACCESSORS == null) {
ACCESSORS = new HashMap<>();
}

Map<Class<?>, Target_org_apache_avro_reflect_ReflectData_ClassAccessorData> map = ACCESSORS;
Target_org_apache_avro_reflect_ReflectData_ClassAccessorData o = map.get(c);
if (o == null) {
if (!IndexedRecord.class.isAssignableFrom(c)) {
Target_org_apache_avro_reflect_ReflectData_ClassAccessorData d = new Target_org_apache_avro_reflect_ReflectData_ClassAccessorData(
c);
map.put(c, d);
}
return null;
}
return o;
}
}

@TargetClass(className = "org.apache.avro.reflect.ReflectData", innerClass = "ClassAccessorData", onlyWith = GraalVM20OrEarlier.class)
final class Target_org_apache_avro_reflect_ReflectData_ClassAccessorData<T> {
// Just provide access to "ReflectData.ClassAccessorData"

@Alias
public Target_org_apache_avro_reflect_ReflectData_ClassAccessorData(Class<?> c) {

}

}

@TargetClass(className = "org.apache.avro.generic.GenericDatumReader")
final class Target_org_apache_avro_generic_GenericDatumReader {

Expand Down Expand Up @@ -127,12 +56,5 @@ protected Target_org_apache_avro_generic_GenericDatumReader(GenericData data) {

}

class GraalVM20OrEarlier implements BooleanSupplier {
@Override
public boolean getAsBoolean() {
return Version.getCurrent().compareTo(21) < 0;
}
}

class AvroSubstitutions {
}
Original file line number Diff line number Diff line change
@@ -1,63 +1,21 @@
package io.quarkus.kafka.client.runtime.graal;

import static org.apache.kafka.common.record.CompressionType.GZIP;
import static org.apache.kafka.common.record.CompressionType.NONE;

import java.util.List;
import java.util.Map;
import java.util.function.BooleanSupplier;

import org.apache.kafka.common.metrics.JmxReporter;
import org.apache.kafka.common.metrics.KafkaMetric;
import org.apache.kafka.common.metrics.Metrics;
import org.apache.kafka.common.record.CompressionType;
import org.apache.kafka.common.utils.AppInfoParser;
import org.graalvm.home.Version;

import com.oracle.svm.core.annotate.Substitute;
import com.oracle.svm.core.annotate.TargetClass;

/**
* Here is where surgery happens
* * Remove Snappy if not available (require GraalVM 21+).
* * Remove JMX
*/

final class GraalVM20OrEarlier implements BooleanSupplier {

@Override
public boolean getAsBoolean() {
return Version.getCurrent().compareTo(21) < 0;
}
}

@TargetClass(value = CompressionType.class, onlyWith = GraalVM20OrEarlier.class)
final class SubstituteSnappy {

@Substitute
public static CompressionType forName(String name) {
if (NONE.name.equals(name)) {
return NONE;
} else if (GZIP.name.equals(name)) {
return GZIP;
} else {
throw new IllegalArgumentException("Unknown or unsupported compression name: " + name);
}
}

@Substitute
public static CompressionType forId(int id) {
switch (id) {
case 0:
return NONE;
case 1:
return GZIP;
default:
throw new IllegalArgumentException("Unknown or unsupported compression type id: " + id);
}
}
}

@TargetClass(value = AppInfoParser.class)
final class RemoveJMXAccess {

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package io.quarkus.it.kafka;

import static io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan.GraalVMVersion.GRAALVM_21_0;

import io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan;
import io.quarkus.test.junit.NativeImageTest;

@NativeImageTest
@DisableIfBuiltWithGraalVMOlderThan(GRAALVM_21_0)
public class KafkaSnappyCodecITCase extends KafkaSnappyCodecTest {

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package io.quarkus.it.kafka;

import static io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan.GraalVMVersion.GRAALVM_21_0;

import io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan;
import io.quarkus.test.junit.NativeImageTest;

@NativeImageTest
@DisableIfBuiltWithGraalVMOlderThan(GRAALVM_21_0)
public class KafkaSnappyConsumerITCase extends KafkaSnappyConsumerTest {

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
package io.quarkus.it.kafka;

import static io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan.GraalVMVersion.GRAALVM_21_0;

import io.quarkus.test.junit.DisableIfBuiltWithGraalVMOlderThan;
import io.quarkus.test.junit.NativeImageTest;

@NativeImageTest
@DisableIfBuiltWithGraalVMOlderThan(GRAALVM_21_0)
public class KafkaSnappyProducerITCase extends KafkaSnappyProducerTest {

}
Loading

0 comments on commit ed9016f

Please sign in to comment.