From 0ad34a4b00abe04d257d4fff9fac0fb70fdc2657 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sat, 13 Jun 2015 16:25:58 +0000
Subject: [PATCH] Timestamper: Reduce NTP timeouts to shorten startup time when
 NTP is blocked

---
 .../src/net/i2p/router/time/NtpClient.java     | 13 +++++++------
 .../net/i2p/router/time/RouterTimestamper.java | 18 ++++++++++--------
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/router/java/src/net/i2p/router/time/NtpClient.java b/router/java/src/net/i2p/router/time/NtpClient.java
index 68c325f94a..d5fecdc2df 100644
--- a/router/java/src/net/i2p/router/time/NtpClient.java
+++ b/router/java/src/net/i2p/router/time/NtpClient.java
@@ -55,7 +55,8 @@ class NtpClient {
     /** difference between the unix epoch and jan 1 1900 (NTP uses that) */
     private final static double SECONDS_1900_TO_EPOCH = 2208988800.0;
     private final static int NTP_PORT = 123;
-    
+    private static final int DEFAULT_TIMEOUT = 10*1000;
+
     /**
      * Query the ntp servers, returning the current time from first one we find
      *
@@ -84,7 +85,7 @@ class NtpClient {
      * @throws IllegalArgumentException if none of the servers are reachable
      * @since 0.7.12
      */
-    public static long[] currentTimeAndStratum(String serverNames[]) {
+    public static long[] currentTimeAndStratum(String serverNames[], int perServerTimeout) {
         if (serverNames == null) 
             throw new IllegalArgumentException("No NTP servers specified");
         ArrayList<String> names = new ArrayList<String>(serverNames.length);
@@ -92,7 +93,7 @@ class NtpClient {
             names.add(serverNames[i]);
         Collections.shuffle(names);
         for (int i = 0; i < names.size(); i++) {
-            long[] rv = currentTimeAndStratum(names.get(i));
+            long[] rv = currentTimeAndStratum(names.get(i), perServerTimeout);
             if (rv != null && rv[0] > 0)
                 return rv;
         }
@@ -105,7 +106,7 @@ class NtpClient {
      * @return milliseconds since january 1, 1970 (UTC), or -1 on error
      */
     public static long currentTime(String serverName) {
-         long[] la = currentTimeAndStratum(serverName);
+         long[] la = currentTimeAndStratum(serverName, DEFAULT_TIMEOUT);
          if (la != null)
              return la[0];
          return -1;
@@ -116,7 +117,7 @@ class NtpClient {
      * @return time in rv[0] and stratum in rv[1], or null for error
      * @since 0.7.12
      */
-    private static long[] currentTimeAndStratum(String serverName) {
+    private static long[] currentTimeAndStratum(String serverName, int timeout) {
         DatagramSocket socket = null;
         try {
             // Send request
@@ -135,7 +136,7 @@ class NtpClient {
 
             // Get response
             packet = new DatagramPacket(buf, buf.length);
-            socket.setSoTimeout(10*1000);
+            socket.setSoTimeout(timeout);
             socket.receive(packet);
 
             // Immediately record the incoming timestamp
diff --git a/router/java/src/net/i2p/router/time/RouterTimestamper.java b/router/java/src/net/i2p/router/time/RouterTimestamper.java
index 4d8892442d..cde08d093d 100644
--- a/router/java/src/net/i2p/router/time/RouterTimestamper.java
+++ b/router/java/src/net/i2p/router/time/RouterTimestamper.java
@@ -43,6 +43,8 @@ public class RouterTimestamper extends Timestamper {
     /** how many times do we have to query if we are changing the clock? */
     private static final int DEFAULT_CONCURRING_SERVERS = 3;
     private static final int MAX_CONSECUTIVE_FAILS = 10;
+    private static final int DEFAULT_TIMEOUT = 10*1000;
+    private static final int SHORT_TIMEOUT = 5*1000;
     
     public static final String PROP_QUERY_FREQUENCY = "time.queryFrequencyMs";
     public static final String PROP_SERVER_LIST = "time.sntpServerList";
@@ -177,7 +179,7 @@ public class RouterTimestamper extends Timestamper {
                             if (_log != null && _log.shouldDebug())
                                 _log.debug("Querying servers " + servers);
                             try {
-                                lastFailed = !queryTime(servers.toArray(new String[servers.size()]));
+                                lastFailed = !queryTime(servers.toArray(new String[servers.size()]), SHORT_TIMEOUT);
                             } catch (IllegalArgumentException iae) {
                                 if (!lastFailed && _log != null && _log.shouldWarn())
                                     _log.warn("Unable to reach any regional NTP servers: " + servers);
@@ -192,7 +194,7 @@ public class RouterTimestamper extends Timestamper {
                         if (_log != null && _log.shouldDebug())
                             _log.debug("Querying servers " + _servers);
                         try {
-                            lastFailed = !queryTime(_servers.toArray(new String[_servers.size()]));
+                            lastFailed = !queryTime(_servers.toArray(new String[_servers.size()]), DEFAULT_TIMEOUT);
                         } catch (IllegalArgumentException iae) {
                             lastFailed = true;
                         }
@@ -259,18 +261,18 @@ public class RouterTimestamper extends Timestamper {
     /**
      * True if the time was queried successfully, false if it couldn't be
      */
-    private boolean queryTime(String serverList[]) throws IllegalArgumentException {
+    private boolean queryTime(String serverList[], int perServerTimeout) throws IllegalArgumentException {
         long found[] = new long[_concurringServers];
         long now = -1;
         int stratum = -1;
         long expectedDelta = 0;
         _wellSynced = false;
         for (int i = 0; i < _concurringServers; i++) {
-            if (i > 0) {
-                // this delays startup when net is disconnected or the timeserver list is bad, don't make it too long
-                try { Thread.sleep(2*1000); } catch (InterruptedException ie) {}
-            }
-            long[] timeAndStratum = NtpClient.currentTimeAndStratum(serverList);
+            //if (i > 0) {
+            //    // this delays startup when net is disconnected or the timeserver list is bad, don't make it too long
+            //    try { Thread.sleep(2*1000); } catch (InterruptedException ie) {}
+            //}
+            long[] timeAndStratum = NtpClient.currentTimeAndStratum(serverList, perServerTimeout);
             now = timeAndStratum[0];
             stratum = (int) timeAndStratum[1];
             long delta = now - _context.clock().now();
-- 
GitLab