[tor-commits] [collector/release] Fix non-RunOnce mode.

karsten at torproject.org karsten at torproject.org
Thu Jan 16 11:13:40 UTC 2020


commit a6359c607438d05e66fa1aa0126af9a44a9bf22e
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Thu Jan 16 11:40:35 2020 +0100

    Fix non-RunOnce mode.
    
    This was accidentally broken in #32554. The RunOnce mode worked just
    fine, but the non-RunOnce mode terminated immediately after scheduling
    tasks.
---
 CHANGELOG.md                                        |  7 ++++++-
 .../java/org/torproject/metrics/collector/Main.java |  8 ++++++--
 .../metrics/collector/cron/Scheduler.java           |  8 +++++---
 .../metrics/collector/cron/ShutdownHook.java        | 21 +++++++++++++++++++++
 4 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3088c3..7161100 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,9 @@
-# Changes in version 1.1?.? - 2020-0?-??
+# Changes in version 1.14.1 - 2020-01-16
+
+ * Medium changes
+   - Stay alive after scheduling (daemon) threads for modules. This
+     was broken by taking out the periodic check for configuration
+     file updates.
 
 
 # Changes in version 1.14.0 - 2020-01-15
diff --git a/src/main/java/org/torproject/metrics/collector/Main.java b/src/main/java/org/torproject/metrics/collector/Main.java
index 77bb2ca..3822353 100644
--- a/src/main/java/org/torproject/metrics/collector/Main.java
+++ b/src/main/java/org/torproject/metrics/collector/Main.java
@@ -87,12 +87,16 @@ public class Main {
       } else {
         conf.loadAndCheckConfiguration(confPath);
       }
-      Scheduler.getInstance().scheduleModuleRuns(collecTorMains, conf);
+      if (!Scheduler.getInstance().scheduleModuleRuns(collecTorMains, conf)) {
+        return;
+      }
     } catch (ConfigurationException ce) {
       printUsage(ce.getMessage());
       return;
     }
-    Runtime.getRuntime().addShutdownHook(new ShutdownHook());
+    ShutdownHook shutdownHook = new ShutdownHook();
+    Runtime.getRuntime().addShutdownHook(shutdownHook);
+    shutdownHook.stayAlive();
   }
 
   private static void printUsage(String msg) {
diff --git a/src/main/java/org/torproject/metrics/collector/cron/Scheduler.java b/src/main/java/org/torproject/metrics/collector/cron/Scheduler.java
index 03292f4..70d27f5 100644
--- a/src/main/java/org/torproject/metrics/collector/cron/Scheduler.java
+++ b/src/main/java/org/torproject/metrics/collector/cron/Scheduler.java
@@ -50,10 +50,10 @@ public final class Scheduler implements ThreadFactory {
   }
 
   /**
-   * Schedule all classes given according to the parameters in the
-   * the configuration.
+   * Schedule all classes given according to the parameters in the configuration
+   * and return whether the caller should wait for completion.
    */
-  public void scheduleModuleRuns(Map<Key,
+  public boolean scheduleModuleRuns(Map<Key,
       Class<? extends CollecTorMain>> collecTorMains, Configuration conf) {
     try {
       gracePeriodMinutes = conf.getLong(Key.ShutdownGraceWaitMinutes);
@@ -89,11 +89,13 @@ public final class Scheduler implements ThreadFactory {
     try {
       if (conf.getBool(Key.RunOnce)) {
         scheduler.invokeAll(runOnceMains);
+        return false;
       }
     } catch (ConfigurationException | InterruptedException
         | RejectedExecutionException | NullPointerException ex) {
       logger.error("Cannot schedule run-once: {}", ex.getMessage(), ex);
     }
+    return true;
   }
 
   private void scheduleExecutions(CollecTorMain ctm, int offset, int period) {
diff --git a/src/main/java/org/torproject/metrics/collector/cron/ShutdownHook.java b/src/main/java/org/torproject/metrics/collector/cron/ShutdownHook.java
index c8f0807..ec34a19 100644
--- a/src/main/java/org/torproject/metrics/collector/cron/ShutdownHook.java
+++ b/src/main/java/org/torproject/metrics/collector/cron/ShutdownHook.java
@@ -13,15 +13,36 @@ public final class ShutdownHook extends Thread {
 
   private static final Logger log = LoggerFactory.getLogger(ShutdownHook.class);
 
+  private boolean stayAlive = true;
+
   /** Names the shutdown thread for debugging purposes. */
   public ShutdownHook() {
     super("CollecTor-ShutdownThread");
   }
 
+  /**
+   * Stay alive until the shutdown thread gets run.
+   */
+  public void stayAlive() {
+    synchronized (this) {
+      while (this.stayAlive) {
+        try {
+          this.wait();
+        } catch (InterruptedException e) {
+          /* Nothing we can do about this. */
+        }
+      }
+    }
+  }
+
   @Override
   public void run() {
     log.info("Shutdown in progress ... ");
     Scheduler.getInstance().shutdownScheduler();
+    synchronized (this) {
+      this.stayAlive = false;
+      this.notify();
+    }
     log.info("Shutdown finished. Exiting.");
   }
 }





More information about the tor-commits mailing list