[tor-commits] [collector/master] Implements 19776 part4: enable a single run.

karsten at torproject.org karsten at torproject.org
Tue Aug 9 09:11:20 UTC 2016


commit 8b48ab75b1cc7bd9f52fdc101d31e245a5939174
Author: iwakeh <iwakeh at torproject.org>
Date:   Mon Aug 8 17:00:26 2016 +0200

    Implements 19776 part4: enable a single run.
---
 build.xml                                          |  5 +++-
 .../java/org/torproject/collector/conf/Key.java    |  1 +
 .../org/torproject/collector/cron/Scheduler.java   | 35 +++++++++++++---------
 src/main/resources/collector.properties            |  4 +++
 .../collector/conf/ConfigurationTest.java          |  2 +-
 .../org/torproject/collector/cron/Counter.java     | 26 ++++++++++++++++
 .../torproject/collector/cron/SchedulerTest.java   | 21 ++++++++++++-
 7 files changed, 77 insertions(+), 17 deletions(-)

diff --git a/build.xml b/build.xml
index d21726e..e06bb99 100644
--- a/build.xml
+++ b/build.xml
@@ -240,7 +240,10 @@
     </cobertura-report>
     <cobertura-check totallinerate="5" totalbranchrate="1" >
       <regex pattern="org.torproject.collector.conf.*" branchrate="100" linerate="100"/>
-      <regex pattern="org.torproject.collector.cron" branchrate="66" linerate="80" />
+      <regex pattern="org.torproject.collector.cron.CollecTorMain"
+             branchrate="50" linerate="63" />
+      <regex pattern="org.torproject.collector.cron.Scheduler"
+             branchrate="75" linerate="82" />
       <regex pattern="org.torproject.collector.Main" branchrate="66" linerate="94" />
     </cobertura-check>
   </target>
diff --git a/src/main/java/org/torproject/collector/conf/Key.java b/src/main/java/org/torproject/collector/conf/Key.java
index d8c87ac..a3a9aa2 100644
--- a/src/main/java/org/torproject/collector/conf/Key.java
+++ b/src/main/java/org/torproject/collector/conf/Key.java
@@ -9,6 +9,7 @@ import java.nio.file.Path;
  */
 public enum Key {
 
+  RunOnce(Boolean.class),
   ExitlistOutputDirectory(Path.class),
   ExitlistUrl(URL.class),
   InstanceBaseUrl(String.class),
diff --git a/src/main/java/org/torproject/collector/cron/Scheduler.java b/src/main/java/org/torproject/collector/cron/Scheduler.java
index 25490aa..66fd7be 100644
--- a/src/main/java/org/torproject/collector/cron/Scheduler.java
+++ b/src/main/java/org/torproject/collector/cron/Scheduler.java
@@ -60,7 +60,7 @@ public class Scheduler implements ThreadFactory {
           String prefix = ctmEntry.getKey().name().replace(ACTIVATED, "");
           CollecTorMain ctm = ctmEntry.getValue()
               .getConstructor(Configuration.class).newInstance(conf);
-          scheduleExecutions(ctm,
+          scheduleExecutions(conf.getBool(Key.RunOnce), ctm,
               conf.getInt(Key.valueOf(prefix + OFFSETMIN)),
               conf.getInt(Key.valueOf(prefix + PERIODMIN)));
         }
@@ -76,19 +76,26 @@ public class Scheduler implements ThreadFactory {
 
   private static final long MILLIS_IN_A_MINUTE = 60_000L;
 
-  private void scheduleExecutions(CollecTorMain ctm, int offset, int period) {
-    this.log.info("Periodic updater started for " + ctm.getClass().getName()
-        + "; offset=" + offset + ", period=" + period + ".");
-    long periodMillis = period * MILLIS_IN_A_MINUTE;
-    long initialDelayMillis = computeInitialDelayMillis(
-        System.currentTimeMillis(), offset * MILLIS_IN_A_MINUTE, periodMillis);
-
-    /* Run after initialDelay delay and then every period min. */
-    log.info("Periodic updater will first run in {} and then every {} minutes.",
-        initialDelayMillis < MILLIS_IN_A_MINUTE ? "under 1 minute"
-        : (initialDelayMillis / MILLIS_IN_A_MINUTE) + " minute(s)", period);
-    this.scheduler.scheduleAtFixedRate(ctm, initialDelayMillis, periodMillis,
-        TimeUnit.MILLISECONDS);
+  private void scheduleExecutions(boolean runOnce, CollecTorMain ctm,
+      int offset, int period) {
+    if (runOnce) {
+      this.log.info("Single run for " + ctm.getClass().getName() + ".");
+      this.scheduler.execute(ctm);
+    } else {
+      this.log.info("Periodic updater started for " + ctm.getClass().getName()
+          + "; offset=" + offset + ", period=" + period + ".");
+      long periodMillis = period * MILLIS_IN_A_MINUTE;
+      long initialDelayMillis = computeInitialDelayMillis(
+          System.currentTimeMillis(), offset * MILLIS_IN_A_MINUTE, periodMillis);
+
+      /* Run after initialDelay delay and then every period min. */
+      log.info("Periodic updater will first run in {} and then every {} "
+          + "minutes.", initialDelayMillis < MILLIS_IN_A_MINUTE
+          ? "under 1 minute"
+          : (initialDelayMillis / MILLIS_IN_A_MINUTE) + " minute(s)", period);
+      this.scheduler.scheduleAtFixedRate(ctm, initialDelayMillis, periodMillis,
+          TimeUnit.MILLISECONDS);
+    }
   }
 
   protected static long computeInitialDelayMillis(long currentMillis,
diff --git a/src/main/resources/collector.properties b/src/main/resources/collector.properties
index 61309d0..9ba4c3e 100644
--- a/src/main/resources/collector.properties
+++ b/src/main/resources/collector.properties
@@ -1,6 +1,10 @@
 ######## Collector Properties
 #
 ######## Run Configuration ########
+# If RunOnce=true, the activated modules below will only be
+# run one time and without any delay.
+# Make sure only to run non-interfering modules together.
+RunOnce = false
 ## the following defines, if this module is activated
 BridgedescsActivated = false
 # period in minutes
diff --git a/src/test/java/org/torproject/collector/conf/ConfigurationTest.java b/src/test/java/org/torproject/collector/conf/ConfigurationTest.java
index 8671ef4..2055ae1 100644
--- a/src/test/java/org/torproject/collector/conf/ConfigurationTest.java
+++ b/src/test/java/org/torproject/collector/conf/ConfigurationTest.java
@@ -22,7 +22,7 @@ public class ConfigurationTest {
   public void testKeyCount() throws Exception {
     assertEquals("The number of properties keys in enum Key changed."
         + "\n This test class should be adapted.",
-        48, Key.values().length);
+        49, Key.values().length);
   }
 
   @Test()
diff --git a/src/test/java/org/torproject/collector/cron/Counter.java b/src/test/java/org/torproject/collector/cron/Counter.java
new file mode 100644
index 0000000..3b404b2
--- /dev/null
+++ b/src/test/java/org/torproject/collector/cron/Counter.java
@@ -0,0 +1,26 @@
+package org.torproject.collector.cron;
+
+import org.torproject.collector.conf.Configuration;
+import org.torproject.collector.conf.ConfigurationException;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class Counter extends CollecTorMain {
+
+  static AtomicInteger count = new AtomicInteger(0);
+
+  public Counter(Configuration c) {
+    super(c);
+  }
+
+  @Override
+  public void startProcessing() throws ConfigurationException {
+    count.getAndIncrement();
+  }
+
+  @Override
+  public String module() {
+    return "counter";
+  }
+}
+
diff --git a/src/test/java/org/torproject/collector/cron/SchedulerTest.java b/src/test/java/org/torproject/collector/cron/SchedulerTest.java
index a1b9af1..9ed1ecf 100644
--- a/src/test/java/org/torproject/collector/cron/SchedulerTest.java
+++ b/src/test/java/org/torproject/collector/cron/SchedulerTest.java
@@ -57,7 +57,6 @@ public class SchedulerTest {
         schedulerField.get(Scheduler.getInstance());
     assertTrue(stpe.getQueue().isEmpty());
     Scheduler.getInstance().scheduleModuleRuns(ctms, conf);
-    Scheduler.getInstance().shutdownScheduler();
   }
 
   @Test()
@@ -71,5 +70,25 @@ public class SchedulerTest {
     assertEquals(60_009L,
         Scheduler.computeInitialDelayMillis(299_991L, 60_000L, 300_000L));
   }
+
+  @Test()
+  public void testRunOnce() throws Exception {
+    Map<Key, Class<? extends CollecTorMain>> ctms = new HashMap<>();
+    Configuration conf = new Configuration();
+    conf.load(new ByteArrayInputStream(runConfigProperties.getBytes()));
+    conf.setProperty(Key.RunOnce.name(), "true");
+    ctms.put(Key.TorperfActivated, Counter.class);
+    ctms.put(Key.BridgedescsActivated, Counter.class);
+    ctms.put(Key.RelaydescsActivated, Counter.class);
+    ctms.put(Key.ExitlistsActivated, Counter.class);
+    ctms.put(Key.UpdateindexActivated, Counter.class);
+    Field schedulerField = Scheduler.class.getDeclaredField("scheduler");
+    schedulerField.setAccessible(true);
+    ScheduledThreadPoolExecutor stpe = (ScheduledThreadPoolExecutor)
+        schedulerField.get(Scheduler.getInstance());
+    Scheduler.getInstance().scheduleModuleRuns(ctms, conf);
+    Scheduler.getInstance().shutdownScheduler();
+    assertEquals(5, Counter.count.get());
+  }
 }
 



More information about the tor-commits mailing list