diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java index 9af726a48552dc07b1fce7cc930ba0a45b153dd4..cbeedac7eb86b9b963f32c589ae090667e2469f8 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/FileFilterDefinitionElement.java @@ -1,5 +1,6 @@ package net.i2p.i2ptunnel.access; +import java.util.HashMap; import java.util.Map; import java.io.File; @@ -18,6 +19,7 @@ import net.i2p.data.Hash; class FileFilterDefinitionElement extends FilterDefinitionElement { private final File file; + private final Map<Hash, DestTracker> lastLoaded = new HashMap<>(); private volatile long lastLoading; /** @@ -31,18 +33,36 @@ class FileFilterDefinitionElement extends FilterDefinitionElement { @Override public void update(Map<Hash, DestTracker> map) throws IOException { - if (!(file.exists() && file.isFile() && file.lastModified() > lastLoading)) + if (!(file.exists() && file.isFile())) return; + if (file.lastModified() <= lastLoading) { + synchronized (lastLoaded) { + for (Map.Entry<Hash, DestTracker> entry : lastLoaded.entrySet()) { + if (!map.containsKey(entry.getKey())) + map.put(entry.getKey(),entry.getValue()); + } + } + return; + } + lastLoading = System.currentTimeMillis(); - BufferedReader reader = null; + synchronized (lastLoaded) { + lastLoaded.clear(); + } + + BufferedReader reader = null; try { - reader = new BufferedReader(new FileReader(file)); + reader = new BufferedReader(new FileReader(file)); String b32; while((b32 = reader.readLine()) != null) { Hash hash = fromBase32(b32); if (map.containsKey(hash)) continue; - map.put(hash, new DestTracker(hash, threshold)); + DestTracker newTracker = new DestTracker(hash, threshold); + map.put(hash, newTracker); + synchronized (lastLoaded) { + lastLoaded.put(hash, newTracker); + } } } catch (InvalidDefinitionException bad32) { throw new IOException("invalid access list entry", bad32);