From de57da088fcb1720384f043380efa88e660e7b90 Mon Sep 17 00:00:00 2001 From: Ben van Hartingsveldt Date: Fri, 3 Jan 2025 14:59:41 +0100 Subject: [PATCH] Add caching for nodes --- .gitignore | 3 +- src/main/java/com/lbry/globe/Main.java | 4 ++ src/main/java/com/lbry/globe/api/API.java | 39 +++++++++++++++++++ src/main/java/com/lbry/globe/object/Node.java | 36 +++++++++++++++++ .../java/com/lbry/globe/object/Service.java | 17 ++++++++ .../thread/BlockchainNodeFinderThread.java | 1 + .../globe/thread/DHTNodeFinderThread.java | 1 + .../globe/thread/HubNodeFinderThread.java | 2 + 8 files changed, 102 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ef2c5c8..3fa3892 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,5 @@ build/ .DS_Store ### Custom ### -geoip.json \ No newline at end of file +geoip.json +nodes.json \ No newline at end of file diff --git a/src/main/java/com/lbry/globe/Main.java b/src/main/java/com/lbry/globe/Main.java index 569d737..35be96a 100644 --- a/src/main/java/com/lbry/globe/Main.java +++ b/src/main/java/com/lbry/globe/Main.java @@ -1,5 +1,6 @@ package com.lbry.globe; +import com.lbry.globe.api.API; import com.lbry.globe.handler.HTTPHandler; import com.lbry.globe.logging.LogLevel; import com.lbry.globe.thread.BlockchainNodeFinderThread; @@ -56,6 +57,9 @@ public class Main implements Runnable{ } public static void main(String... args){ + Main.LOGGER.info("Loading nodes cache"); + Runtime.getRuntime().addShutdownHook(new Thread(API::saveNodes)); + API.loadNodes(); Main.LOGGER.info("Loading GeoIP cache"); Runtime.getRuntime().addShutdownHook(new Thread(GeoIP::saveCache)); GeoIP.loadCache(); diff --git a/src/main/java/com/lbry/globe/api/API.java b/src/main/java/com/lbry/globe/api/API.java index 29641b0..75149a1 100644 --- a/src/main/java/com/lbry/globe/api/API.java +++ b/src/main/java/com/lbry/globe/api/API.java @@ -3,17 +3,24 @@ package com.lbry.globe.api; import com.lbry.globe.object.Node; import com.lbry.globe.object.Service; +import java.io.BufferedReader; +import java.io.FileOutputStream; +import java.io.FileReader; import java.net.Inet6Address; import java.net.InetAddress; import java.util.Comparator; import java.util.Map; import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import com.lbry.globe.util.GeoIP; import org.json.JSONArray; import org.json.JSONObject; public class API{ + private static final Logger LOGGER = Logger.getLogger("API"); public static final Map NODES = new TreeMap<>(Comparator.comparing(InetAddress::getHostAddress)); public static void fillPoints(JSONArray points){ @@ -35,4 +42,36 @@ public class API{ } } + public static void loadNodes(){ + try{ + BufferedReader br = new BufferedReader(new FileReader("nodes.json")); + StringBuilder sb = new StringBuilder(); + String line; + while((line = br.readLine())!=null){ + sb.append(line); + } + JSONObject obj = new JSONObject(sb.toString()); + for(String key : obj.keySet()){ + API.NODES.put(InetAddress.getByName(key),Node.fromJSONObject(obj.getJSONObject(key))); + } + br.close(); + }catch(Exception e){ + API.LOGGER.log(Level.WARNING,"Failed loading nodes.",e); + } + } + + public static void saveNodes(){ + try{ + FileOutputStream fos = new FileOutputStream("nodes.json"); + JSONObject obj = new JSONObject(); + for(Map.Entry entry : API.NODES.entrySet()){ + obj.put(entry.getKey().getHostAddress(),entry.getValue().toJSONObject()); + } + fos.write(obj.toString().getBytes()); + fos.close(); + }catch(Exception e){ + API.LOGGER.log(Level.WARNING,"Failed saving nodes.",e); + } + } + } diff --git a/src/main/java/com/lbry/globe/object/Node.java b/src/main/java/com/lbry/globe/object/Node.java index fd6967c..2597328 100644 --- a/src/main/java/com/lbry/globe/object/Node.java +++ b/src/main/java/com/lbry/globe/object/Node.java @@ -4,6 +4,9 @@ import java.net.InetAddress; import java.util.ArrayList; import java.util.List; +import org.json.JSONArray; +import org.json.JSONObject; + public class Node{ private final InetAddress address; @@ -41,4 +44,37 @@ public class Node{ return this.services; } + public JSONObject toJSONObject(){ + JSONObject obj = new JSONObject(); + obj.put("address",this.address.toString()); + obj.put("latitude",this.latitude); + obj.put("longitude",this.longitude); + JSONArray servicesArr = new JSONArray(); + for(Service service : this.services){ + servicesArr.put(service.toJSONObject()); + } + obj.put("services",servicesArr); + return obj; + } + + public static Node fromJSONObject(JSONObject obj){ + System.out.println(obj); + Node node = new Node(Node.addressFromString(obj.getString("address")),obj.has("latitude")?obj.getDouble("latitude"):null,obj.has("longitude")?obj.getDouble("longitude"):null); + JSONArray servicesArr = obj.getJSONArray("services"); + for(int i=0;i