From a80f970853e67a52e63b5082fe1a8a578584fc19 Mon Sep 17 00:00:00 2001 From: Radim Vansa Date: Fri, 27 Sep 2019 13:17:21 +0200 Subject: [PATCH] #4241 100% CPU in epoll_wait --- .../netty/deployment/NettyProcessor.java | 7 +++++ .../runtime/graal/NettySubstitutions.java | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java b/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java index bcea7cd28640f..eb1906619745a 100644 --- a/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java +++ b/extensions/netty/deployment/src/main/java/io/quarkus/netty/deployment/NettyProcessor.java @@ -18,6 +18,7 @@ import io.quarkus.deployment.builditem.JniBuildItem; import io.quarkus.deployment.builditem.SystemPropertyBuildItem; import io.quarkus.deployment.builditem.substrate.ReflectiveClassBuildItem; +import io.quarkus.deployment.builditem.substrate.RuntimeReinitializedClassBuildItem; import io.quarkus.deployment.builditem.substrate.SubstrateConfigBuildItem; import io.quarkus.deployment.builditem.substrate.SubstrateSystemPropertyBuildItem; import io.quarkus.netty.BossEventLoopGroup; @@ -162,4 +163,10 @@ void createExecutors(BuildProducer runtimeBeanBuildItemBui .build()); } + @BuildStep + public RuntimeReinitializedClassBuildItem reinitScheduledFutureTask() { + return new RuntimeReinitializedClassBuildItem( + "io.quarkus.netty.runtime.graal.Holder_io_netty_util_concurrent_ScheduledFutureTask"); + } + } diff --git a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java index da0521e7f6eea..27b179bb9a75e 100644 --- a/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java +++ b/extensions/netty/runtime/src/main/java/io/quarkus/netty/runtime/graal/NettySubstitutions.java @@ -12,6 +12,7 @@ import javax.net.ssl.TrustManagerFactory; import com.oracle.svm.core.annotate.Alias; +import com.oracle.svm.core.annotate.Delete; import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; @@ -333,6 +334,33 @@ final class Target_io_netty_util_AbstractReferenceCounted { private static long REFCNT_FIELD_OFFSET; } +// This class is runtime-initialized by NettyProcessor +final class Holder_io_netty_util_concurrent_ScheduledFutureTask { + static final long START_TIME = System.nanoTime(); +} + +@TargetClass(className = "io.netty.util.concurrent.ScheduledFutureTask") +final class Target_io_netty_util_concurrent_ScheduledFutureTask { + @Delete + public static long START_TIME = 0; + + @Substitute + static long nanoTime() { + return System.nanoTime() - Holder_io_netty_util_concurrent_ScheduledFutureTask.START_TIME; + } + + @Alias + public long deadlineNanos() { + return 0; + } + + @Substitute + public long delayNanos(long currentTimeNanos) { + return Math.max(0, + deadlineNanos() - (currentTimeNanos - Holder_io_netty_util_concurrent_ScheduledFutureTask.START_TIME)); + } +} + class NettySubstitutions { }