From d25a1f3fa00aebf093ac46d5f74b72a73f232fba Mon Sep 17 00:00:00 2001 From: "Nelson R. Perez" Date: Fri, 12 Oct 2018 18:36:11 -0500 Subject: [PATCH 1/2] Reduced the connection timeout from the default of 10 seconds to 2 seconds --- .../cy/agorise/graphenej/api/android/NetworkService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java b/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java index 06f791c..bd9a372 100644 --- a/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java +++ b/graphenej/src/main/java/cy/agorise/graphenej/api/android/NetworkService.java @@ -2,6 +2,7 @@ package cy.agorise.graphenej.api.android; import android.app.Service; import android.content.Intent; +import java.util.concurrent.TimeUnit; import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -168,7 +169,10 @@ public class NetworkService extends Service { * Actually establishes a connection from this Service to one of the full nodes. */ public void connect(){ - OkHttpClient client = new OkHttpClient(); + OkHttpClient client = new OkHttpClient + .Builder() + .connectTimeout(2, TimeUnit.SECONDS) + .build(); mSelectedNode = nodeProvider.getBestNode(); Log.v(TAG,"connect.url: "+ mSelectedNode.getUrl()); Request request = new Request.Builder().url(mSelectedNode.getUrl()).build(); From 36420e7f56679500dc871109e0cb30af48f9c4fc Mon Sep 17 00:00:00 2001 From: "Nelson R. Perez" Date: Mon, 15 Oct 2018 18:35:26 -0500 Subject: [PATCH 2/2] Trying to fix a NullPointerException by checking the refeence and enclosing the whole chunk of code into a syncronized block --- .../network/NodeLatencyVerifier.java | 64 ++++++++++--------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java b/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java index 6e3d29c..0b97301 100644 --- a/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java +++ b/graphenej/src/main/java/cy/agorise/graphenej/network/NodeLatencyVerifier.java @@ -35,8 +35,6 @@ public class NodeLatencyVerifier { private HashMap nodeURLMap = new HashMap<>(); -// private WebSocket webSocket; - // Map used to store the first timestamp required for a RTT (Round Trip Time) measurement. // If: // RTT = t2 - t1 @@ -104,11 +102,10 @@ public class NodeLatencyVerifier { } String normalURL = fullNode.getUrl().replace("wss://", "https://"); - if(!nodeURLMap.containsKey(fullNode.getUrl().replace("wss://", "https://"))){ - HttpUrl key = HttpUrl.parse(normalURL); + HttpUrl key = HttpUrl.parse(normalURL); + if(!nodeURLMap.containsKey(key)){ nodeURLMap.put(key, fullNode); } - client.newWebSocket(request, mWebSocketListener); } mHandler.postDelayed(this, verificationPeriod); @@ -135,38 +132,43 @@ public class NodeLatencyVerifier { * Method used to handle the node's first response. The idea here is to obtain * the RTT (Round Trip Time) measurement and publish it using the PublishSubject. * - * @param webSocket Websocket instance + * @param webSocket WebSocket instance * @param response Response instance */ private void handleResponse(WebSocket webSocket, Response response){ - // Obtaining the HttpUrl instance that was previously used as a key - HttpUrl url = webSocket.request().url(); - if(nodeURLMap.containsKey(url)){ - FullNode fullNode = nodeURLMap.get(url); - long delay; + synchronized (this){ + // Obtaining the HttpUrl instance that was previously used as a key + HttpUrl url = webSocket.request().url(); + if(nodeURLMap.containsKey(url)){ + FullNode fullNode = nodeURLMap.get(url); + long delay; - if(response == null) { - // There is no internet connection, or the node is unreachable. We are just - // putting an artificial delay. - delay = Long.MAX_VALUE; - } else { - long after = System.currentTimeMillis(); - long before = timestamps.get(fullNode); - delay = after - before; - } - - fullNode.addLatencyValue(delay); - subject.onNext(fullNode); - }else{ - // We cannot properly handle a response to a request whose - // URL was not registered at the nodeURLMap. This is because without this, - // we cannot know to which node this response corresponds. This should not happen. - Log.e(TAG,"nodeURLMap does not contain url: "+url); - for(HttpUrl key : nodeURLMap.keySet()){ - Log.e(TAG,"> "+key); + if(response == null) { + // There is no internet connection, or the node is unreachable. We are just + // putting an artificial delay. + delay = Long.MAX_VALUE; + } else { + long after = System.currentTimeMillis(); + long before = timestamps.get(fullNode); + delay = after - before; + } + if(fullNode != null){ + fullNode.addLatencyValue(delay); + subject.onNext(fullNode); + }else{ + Log.w(TAG,"Could not extract FullNode instance from the map"); + } + }else{ + // We cannot properly handle a response to a request whose + // URL was not registered at the nodeURLMap. This is because without this, + // we cannot know to which node this response corresponds. This should not happen. + Log.e(TAG,"nodeURLMap does not contain url: "+url); + for(HttpUrl key : nodeURLMap.keySet()){ + Log.e(TAG,"> "+key); + } } + webSocket.close(NetworkService.NORMAL_CLOSURE_STATUS, null); } - webSocket.close(NetworkService.NORMAL_CLOSURE_STATUS, null); } };