From 8fe8cb8c27c2f42802fd7b6623b8b284e65adbc7 Mon Sep 17 00:00:00 2001 From: Jan Bartel Date: Wed, 2 Dec 2020 10:27:08 +0100 Subject: [PATCH] Issue #5086 Add blocking method for immediate scan. Signed-off-by: Jan Bartel --- .../java/org/eclipse/jetty/util/Scanner.java | 29 +++++++++++++++++++ .../jetty/util/ssl/KeyStoreScanner.java | 23 +++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java b/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java index 70fd1fc78276..f9bd609f0959 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/Scanner.java @@ -611,7 +611,36 @@ public void nudge() }, 0, TimeUnit.MILLISECONDS); } + + /** + * Get the scanner to perform a scan cycle as soon as possible + * and call the Callback when the scan is finished or failed. + * + * @param complete called when the scan cycle finishes or fails. + */ + public void scan(Callback complete) + { + Scheduler s = _scheduler; + + if (!isRunning() || s == null) + complete.failed(new IllegalStateException("Scanner not running")); + + s.schedule(() -> + { + try + { + scan(); + complete.succeeded(); + } + catch (Throwable t) + { + complete.failed(t); + } + }, 0, TimeUnit.MILLISECONDS); + } + + /** * Perform a pass of the scanner and report changes */ diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/KeyStoreScanner.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/KeyStoreScanner.java index 097c4da8f207..46d04a21c923 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/KeyStoreScanner.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ssl/KeyStoreScanner.java @@ -20,8 +20,11 @@ import java.io.File; import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import org.eclipse.jetty.util.Callback; import org.eclipse.jetty.util.Scanner; import org.eclipse.jetty.util.annotation.ManagedAttribute; import org.eclipse.jetty.util.annotation.ManagedOperation; @@ -121,8 +124,24 @@ public void scan() if (LOG.isDebugEnabled()) LOG.debug("scanning"); - _scanner.nudge(); - _scanner.nudge(); + try + { + CountDownLatch complete = new CountDownLatch(2); + Callback callback = Callback.from(complete::countDown, t -> + { + LOG.warn("Scan fail", t); + complete.countDown(); + }); + + _scanner.scan(callback); + _scanner.scan(callback); + complete.await(10, TimeUnit.SECONDS); + + } + catch (Exception e) + { + throw new RuntimeException(e); + } } @ManagedOperation(value = "Reload the SSL Keystore", impact = "ACTION")