diff --git a/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java b/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java index bca96583a9881..ce1f0e14fd77e 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/dev/RuntimeUpdatesProcessor.java @@ -31,6 +31,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -82,6 +83,8 @@ public class RuntimeUpdatesProcessor implements HotReplacementContext, Closeable */ private volatile boolean firstScanDone = false; + private static volatile boolean instrumentationLogPrinted = false; + private final Map sourceFileTimestamps = new ConcurrentHashMap<>(); private final Map watchedFileTimestamps = new ConcurrentHashMap<>(); private final Map classFileChangeTimeStamps = new ConcurrentHashMap<>(); @@ -255,7 +258,16 @@ public boolean doScan(boolean userInitiated) throws IOException { || (IsolatedDevModeMain.deploymentProblem != null && userInitiated) || configFileRestartNeeded); if (restartNeeded) { restartCallback.accept(filesChanged, changedClassResults); - log.infof("Hot replace total time: %ss ", Timing.convertToBigDecimalSeconds(System.nanoTime() - startNanoseconds)); + long timeNanoSeconds = System.nanoTime() - startNanoseconds; + log.infof("Live reload total time: %ss ", Timing.convertToBigDecimalSeconds(timeNanoSeconds)); + if (TimeUnit.SECONDS.convert(timeNanoSeconds, TimeUnit.NANOSECONDS) >= 4 && !instrumentationEnabled()) { + if (!instrumentationLogPrinted) { + instrumentationLogPrinted = true; + log.info( + "Live reload took more than 4 seconds, you may want to enable instrumentation based reload (quarkus.live-reload.instrumentation=true). This allows small changes to take effect without restarting Quarkus."); + } + } + return true; } else if (!filesChanged.isEmpty()) { for (Consumer> consumer : noRestartChangesConsumers) {