Skip to content

Commit

Permalink
make build work in native mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Loic Hermann authored and Loic Hermann committed Aug 9, 2024
1 parent e632209 commit 49d03f4
Showing 1 changed file with 129 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package io.quarkiverse.temporal.deployment.graalvm;

import java.util.Collection;

import org.jboss.jandex.ClassInfo;
import org.jboss.jandex.DotName;

import io.grpc.NameResolverProvider;
import io.grpc.internal.DnsNameResolverProvider;
import io.grpc.internal.ReadableBuffers;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedClassBuildItem;
import io.quarkus.deployment.builditem.nativeimage.RuntimeInitializedPackageBuildItem;

public class NettyShadedProcessor {

static final DotName NAME_RESOLVER_PROVIDER = DotName.createSimple(NameResolverProvider.class.getName());

@BuildStep
void registerReflecttionsNettyShaded(BuildProducer<ReflectiveClassBuildItem> reflections,
CombinedIndexBuildItem combinedIndex) {
ReflectiveClassBuildItem buildItem = ReflectiveClassBuildItem.builder(
"io.grpc.netty.shaded.io.netty.channel.socket.nio.NioSocketChannel",
"io.grpc.netty.shaded.io.netty.util.internal.NativeLibraryUtil",
"io.grpc.netty.shaded.io.netty.util.ReferenceCountUtil",
"io.grpc.netty.shaded.io.netty.buffer.AbstractByteBufAllocator",
"io.grpc.netty.shaded.io.netty.channel.epoll.Epoll",
"io.grpc.netty.shaded.io.netty.channel.epoll.EpollChannelOption",
"io.grpc.netty.shaded.io.netty.channel.epoll.EpollEventLoopGroup",
"io.grpc.netty.shaded.io.netty.channel.epoll.EpollServerSocketChannel",
"io.grpc.netty.shaded.io.netty.channel.epoll.EpollSocketChannel",
"io.grpc.internal.PickFirstLoadBalancerProvider",
"io.grpc.protobuf.services.internal.HealthCheckingRoundRobinLoadBalancerProvider")
.constructors(true)
.methods(true)
.fields(true)
.build();

reflections.produce(buildItem);

String prefixPackageDir = "io.grpc.netty.shaded.io.netty.util.internal.shaded.org.jctools.queues";
reflections.produce(ReflectiveClassBuildItem.builder(
prefixPackageDir + ".MpscArrayQueueProducerIndexField",
prefixPackageDir + ".MpscArrayQueueProducerLimitField",
prefixPackageDir + ".MpscArrayQueueConsumerIndexField",
prefixPackageDir + ".BaseMpscLinkedArrayQueueProducerFields",
prefixPackageDir + ".BaseMpscLinkedArrayQueueColdProducerFields",
prefixPackageDir + ".BaseMpscLinkedArrayQueueConsumerFields",
"io.grpc.internal.DnsNameResolverProvider")
.constructors(true)
.methods(true)
.fields(true)
.build());

Collection<ClassInfo> nrs = combinedIndex.getIndex().getAllKnownSubclasses(NAME_RESOLVER_PROVIDER);
for (ClassInfo nr : nrs) {
reflections.produce(ReflectiveClassBuildItem.builder(nr.name().toString())
.constructors(true)
.methods(true)
.fields(false)
.build());
}

reflections.produce(ReflectiveClassBuildItem.builder(DnsNameResolverProvider.class)
.constructors(true)
.methods(true)
.fields(false)
.build());
reflections.produce(ReflectiveClassBuildItem.builder("io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider")
.constructors(true)
.methods(true)
.fields(false)
.build());
reflections.produce(ReflectiveClassBuildItem.builder(NettyChannelProvider.class)
.constructors(true)
.methods(true)
.fields(false)
.build());
reflections.produce(ReflectiveClassBuildItem.builder(ReadableBuffers.class)
.constructors(true)
.methods(true)
.fields(true)
.build());
}

/**
* The next step fails to package the project
* /* [ERROR] [error]: Build step io.quarkus.deployment.steps.NativeImageResourcesStep#registerPackageResources threw an
* exception: java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 65
*/
// @BuildStep
// void addNativeResourceForNettyShaded(BuildProducer<NativeImageResourceDirectoryBuildItem> resourceBuildItem) {
// resourceBuildItem.produce(new NativeImageResourceDirectoryBuildItem("META-INF"));
// }
@BuildStep
void runTimeInitializationForNettyShaded(BuildProducer<RuntimeInitializedClassBuildItem> runtimeInitialized,
BuildProducer<RuntimeInitializedPackageBuildItem> runtimePackages) {
runtimeInitialized.produce(new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.handler.ssl.OpenSsl"));
runtimeInitialized
.produce(new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.handler.ssl.OpenSslContext"));
runtimeInitialized.produce(new RuntimeInitializedClassBuildItem(
"io.grpc.netty.shaded.io.netty.handler.ssl.ReferenceCountedOpenSslEngine"));
runtimeInitialized.produce(new RuntimeInitializedClassBuildItem(
"io.grpc.netty.shaded.io.netty.handler.ssl.JdkNpnApplicationProtocolNegotiator"));
runtimeInitialized
.produce(new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.handler.ssl.JettyAlpnSslEngine"));
runtimeInitialized.produce(new RuntimeInitializedClassBuildItem(
"io.grpc.netty.shaded.io.netty.handler.ssl.JettyAlpnSslEngine$ClientEngine"));
runtimeInitialized.produce(new RuntimeInitializedClassBuildItem(
"io.grpc.netty.shaded.io.netty.handler.ssl.JettyAlpnSslEngine$ServerEngine"));
runtimeInitialized
.produce(new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.handler.ssl.JettyNpnSslEngine"));
runtimeInitialized.produce(new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.internal.tcnative.SSL"));
runtimeInitialized.produce(
new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.internal.tcnative.CertificateVerifier"));
runtimeInitialized.produce(
new RuntimeInitializedClassBuildItem("io.grpc.netty.shaded.io.netty.internal.tcnative.SSLPrivateKeyMethod"));

runtimePackages.produce(new RuntimeInitializedPackageBuildItem("io.grpc.netty.shaded.io.grpc.netty"));
runtimePackages.produce(new RuntimeInitializedPackageBuildItem("io.grpc.netty.shaded.io.netty.channel.epoll"));
runtimePackages.produce(new RuntimeInitializedPackageBuildItem("io.grpc.netty.shaded.io.netty.channel.unix"));

runtimeInitialized.produce(new RuntimeInitializedClassBuildItem("io.grpc.internal.RetriableStream"));
}
}

0 comments on commit 49d03f4

Please sign in to comment.