From b8c29e753b565748fa5406e460f9f06ebbcd099e Mon Sep 17 00:00:00 2001
From: blavenie <benoit.lavenier@e-is.pro>
Date: Fri, 1 Feb 2019 16:36:16 +0100
Subject: [PATCH] [fix] Network CLI: change default timeout to 300ms

---
 .../duniter/client/actions/NetworkAction.java | 40 ++++++++++++++-----
 .../client/actions/params/PeerParameters.java |  2 +-
 .../i18n/duniter4j-client_en_GB.properties    |  4 +-
 .../i18n/duniter4j-client_fr_FR.properties    |  8 ++--
 .../service/local/NetworkServiceImpl.java     |  7 +++-
 5 files changed, 41 insertions(+), 20 deletions(-)

diff --git a/duniter4j-client/src/main/java/org/duniter/client/actions/NetworkAction.java b/duniter4j-client/src/main/java/org/duniter/client/actions/NetworkAction.java
index e329116d..d02f4c90 100644
--- a/duniter4j-client/src/main/java/org/duniter/client/actions/NetworkAction.java
+++ b/duniter4j-client/src/main/java/org/duniter/client/actions/NetworkAction.java
@@ -81,17 +81,21 @@ public class NetworkAction extends AbstractAction {
         final Peer mainPeer = peerParameters.getPeer();
         checkOutputFileIfNotNull(); // make sure the file (if any) is writable
 
-        // Reducing node timeout when broadcast
-        if (peerParameters.timeout != null) {
-            Configuration.instance().getApplicationConfig().setOption(ConfigurationOption.NETWORK_TIMEOUT.getKey(), peerParameters.timeout.toString());
+        Configuration config = Configuration.instance();
+
+        // Configure network timeout
+        Integer timeout = peerParameters.timeout;
+        if (timeout == null) {
+            timeout = 300; // Override default timeout to 300ms.
         }
+        config.getApplicationConfig().setOption(ConfigurationOption.NETWORK_TIMEOUT.getKey(), timeout.toString());
 
         dateFormat = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.MEDIUM, I18n.getDefaultLocale());
 
         console = new RegexAnsiConsole();
         System.setOut(console);
 
-        log.info(I18n.t("duniter4j.client.network.loadingPeers"));
+        log.info(I18n.t("duniter4j.client.network.loadingPeers", timeout));
 
         NetworkService service = ServiceLocator.instance().getNetworkService();
 
@@ -130,11 +134,14 @@ public class NetworkAction extends AbstractAction {
             return;
         }
 
-        Peer mainConsensusPeer = peers.iterator().next();
-        Peer.Stats mainConsensusStats = mainConsensusPeer.getStats();
-        if (mainConsensusStats.isMainConsensus()) {
-            Long mediantTime = mainConsensusStats.getMedianTime();
-            String medianTime = dateFormat.format(new Date(mediantTime * 1000));
+        Peer.Stats mainConsensusStats = peers.stream()
+                .filter(p -> p.getStats() != null && p.getStats().getMedianTime() != null && p.getStats().isMainConsensus())
+                .map(Peer::getStats)
+                .findFirst().orElse(null);
+
+        // Define color of main consensus info
+        if (mainConsensusStats != null) {
+            String medianTime = dateFormat.format(new Date(mainConsensusStats.getMedianTime() * 1000));
             String mainBuid = formatBuid(mainConsensusStats);
 
             console.reset()
@@ -144,7 +151,7 @@ public class NetworkAction extends AbstractAction {
                    .fgString(medianTime, Ansi.Color.GREEN);
 
             peers.stream()
-                    .filter(peer -> peer.getStats().isForkConsensus())
+                    .filter(peer -> peer.getStats() != null && peer.getStats().isForkConsensus())
                     .map(peer -> formatBuid(peer.getStats()))
                     .forEach(forkConsensusBuid -> console.fgString(Formatters.formatBuid(forkConsensusBuid), Ansi.Color.YELLOW));
 
@@ -175,7 +182,7 @@ public class NetworkAction extends AbstractAction {
                     peer.getStats().getStatus().name(),
                     isUp ? formatApi(peer) : "",
                     isUp ? peer.getStats().getVersion() : "",
-                    (isUp && peer.getStats().getHardshipLevel() != null) ? peer.getStats().getHardshipLevel() : (peer.getStats().getUid() == null ? I18n.t("duniter4j.client.network.mirror") : ""),
+                    isUp ? formatHarshipLevel(peer) : "",
                     isUp ? formatBuid(peer.getStats()) : ""
             };
         })
@@ -253,4 +260,15 @@ public class NetworkAction extends AbstractAction {
 
         return peer.getApi();
     }
+
+    protected String formatHarshipLevel(Peer peer) {
+        // Mirror
+        if (peer.getStats().getHardshipLevel() == null || peer.getStats().getUid() == null) {
+            return I18n.t("duniter4j.client.network.mirror");
+        }
+        if (peer.getStats().getHardshipLevel() == 0) {
+            return "?";
+        }
+        return peer.getStats().getHardshipLevel().toString();
+    }
 }
diff --git a/duniter4j-client/src/main/java/org/duniter/client/actions/params/PeerParameters.java b/duniter4j-client/src/main/java/org/duniter/client/actions/params/PeerParameters.java
index c89e74d2..59ff738e 100644
--- a/duniter4j-client/src/main/java/org/duniter/client/actions/params/PeerParameters.java
+++ b/duniter4j-client/src/main/java/org/duniter/client/actions/params/PeerParameters.java
@@ -46,7 +46,7 @@ public class PeerParameters {
     public boolean useSsl = false;
 
     @Parameter(names = "--timeout", description = "HTTP request timeout, in millisecond", descriptionKey = "duniter4j.client.params.peer.timeout")
-    public Long timeout = null;
+    public Integer timeout = null;
 
     private Peer peer = null;
 
diff --git a/duniter4j-client/src/main/resources/i18n/duniter4j-client_en_GB.properties b/duniter4j-client/src/main/resources/i18n/duniter4j-client_en_GB.properties
index 25bd1dd4..8003be8e 100644
--- a/duniter4j-client/src/main/resources/i18n/duniter4j-client_en_GB.properties
+++ b/duniter4j-client/src/main/resources/i18n/duniter4j-client_en_GB.properties
@@ -4,8 +4,8 @@ duniter4j.client.network.action=Display network peers
 duniter4j.client.network.cesiumPlus=Cs+
 duniter4j.client.network.error.outputFieNotWritable=Output file not writable
 duniter4j.client.network.executionTime=Execution time\: %s ms
-duniter4j.client.network.header=Main block [%1$s] computed at [%2$s] validated by [%3$3.2f%%] of peers
-duniter4j.client.network.loadingPeers=Reading network peers...
+duniter4j.client.network.header=Head: block {%1$s} computed at %2$s (UTC time) validated by {%3$3.2f%%} of the peers
+duniter4j.client.network.loadingPeers=Reading network peers... (timeout\: %s ms)
 duniter4j.client.network.mirror=Mirror
 duniter4j.client.network.noPeers=No peers found
 duniter4j.client.network.params.continue=Continue scanning? (Will refresh on new peer/block).
diff --git a/duniter4j-client/src/main/resources/i18n/duniter4j-client_fr_FR.properties b/duniter4j-client/src/main/resources/i18n/duniter4j-client_fr_FR.properties
index dc53bef7..374d0f59 100644
--- a/duniter4j-client/src/main/resources/i18n/duniter4j-client_fr_FR.properties
+++ b/duniter4j-client/src/main/resources/i18n/duniter4j-client_fr_FR.properties
@@ -1,11 +1,11 @@
-duniter4j.client.info.peer=Noeud Duniter \: [%s\:%s]
-duniter4j.client.info.peer.fallback=Noeud Duniter (par défaut) \: [%s\:%d]
+duniter4j.client.info.peer=Noeud Duniter {%s\:%s}
+duniter4j.client.info.peer.fallback=Noeud Duniter par défaut {%s\:%d} 
 duniter4j.client.network.action=Afficher les noeuds Duniter
 duniter4j.client.network.cesiumPlus=Cs+
 duniter4j.client.network.error.outputFieNotWritable=Fichier de sortie non inscriptible
 duniter4j.client.network.executionTime=Temps d'execution \: %s ms
-duniter4j.client.network.header=Bloc principal [%1$s] calculé à [%2$s] validé par [%3$3.2f%%] des noeuds
-duniter4j.client.network.loadingPeers=Lecture des noeuds du réseau...
+duniter4j.client.network.header=Branche principale: bloc {%1$s} calculé à %2$s (heure UTC) validé par {%3$3.2f%%} des noeuds
+duniter4j.client.network.loadingPeers=Lecture des noeuds du réseau... (Délai d'attente \: %s ms)
 duniter4j.client.network.mirror=Mirroir
 duniter4j.client.network.noPeers=Aucun noeud trouvé
 duniter4j.client.network.params.continue=Continue scanning? (Will refresh on new peer/block).
diff --git a/duniter4j-core-client/src/main/java/org/duniter/core/client/service/local/NetworkServiceImpl.java b/duniter4j-core-client/src/main/java/org/duniter/core/client/service/local/NetworkServiceImpl.java
index 8df91db7..24b5918c 100644
--- a/duniter4j-core-client/src/main/java/org/duniter/core/client/service/local/NetworkServiceImpl.java
+++ b/duniter4j-core-client/src/main/java/org/duniter/core/client/service/local/NetworkServiceImpl.java
@@ -417,8 +417,11 @@ public class NetworkServiceImpl extends BaseRemoteServiceImpl implements Network
                         lockManager.unlock(PEERS_UPDATE_LOCK_NAME);
                     }
                 }
+                else {
+                    log.debug("Could not acquire lock for reloading all peers. Skipping.");
+                }
             } catch (InterruptedException e) {
-                log.warn("Could not acquire lock for reloading all peers. Skipping.");
+                log.warn("Stopping reloading all peers: " + e.getMessage());
             }
         };
 
@@ -487,7 +490,7 @@ public class NetworkServiceImpl extends BaseRemoteServiceImpl implements Network
 
                 // If new block + wait 3s for network propagation
                 if (isNewBlock) {
-                    schedule(loadAllPeers, pool, 3000/*waiting block propagation*/);
+                    schedule(loadAllPeers, pool, 3000/*waiting 3s, for block propagation*/);
                 }
 
             } catch(IOException e) {
-- 
GitLab