Skip to content

Commit 447c6dc

Browse files
Copilotkasnder
andauthored
Reload TrackerList when hosts are automatically updated (#502)
* Initial plan * Add TrackerList reload when hosts are updated - Add reloadTrackerData() method to TrackerList to clear and reload tracker data - Change trackingIps from HashSet to ConcurrentHashMap.newKeySet() for thread safety - Call reloadTrackerData() from prepareHostsBlocked() after hosts are reloaded - Invalidate tracker count cache when tracker data is reloaded - Ensures TrackerList stays in sync with updated hosts from automatic downloads Co-authored-by: kasnder <5175206+kasnder@users.noreply.github.com> * Address code review feedback - Use getInstance(c) in reloadTrackerData() to ensure instance is created - Fix ActivitySettings to use reloadTrackerData() instead of loadTrackers() to properly clear old data when domain_based_blocked setting changes Co-authored-by: kasnder <5175206+kasnder@users.noreply.github.com> * Add synchronization to reloadTrackerData() - Add reloadLock to synchronize tracker data reload operations - Wrap entire reload operation in synchronized block to prevent race conditions - Ensures atomic clear and reload of tracker data Co-authored-by: kasnder <5175206+kasnder@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: kasnder <5175206+kasnder@users.noreply.github.com>
1 parent 7930ad8 commit 447c6dc

3 files changed

Lines changed: 32 additions & 3 deletions

File tree

app/src/main/java/eu/faircode/netguard/ActivitySettings.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,8 +715,7 @@ else if ("loglevel".equals(name))
715715
ServiceSinkhole.reload("changed " + name, this, false);
716716

717717
else if ("domain_based_blocked".equals(name)) {
718-
TrackerList ts = TrackerList.getInstance(this);
719-
ts.loadTrackers(this);
718+
TrackerList.reloadTrackerData(this);
720719
}
721720

722721
}

app/src/main/java/eu/faircode/netguard/ServiceSinkhole.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1799,6 +1799,9 @@ public static void prepareHostsBlocked(Context c) {
17991799
}
18001800

18011801
lock.writeLock().unlock();
1802+
1803+
// Reload TrackerList to ensure it stays in sync with updated hosts
1804+
TrackerList.reloadTrackerData(c);
18021805
}
18031806

18041807
private void prepareUidIPFilters(String dname) {

app/src/main/java/net/kollnig/missioncontrol/data/TrackerList.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,15 @@ public class TrackerList {
5858
private static final String TAG = TrackerList.class.getSimpleName();
5959
private static final List<String> ignoreDomains = Collections.singletonList("cloudfront.net, fastly.net");
6060
private static final Map<String, Tracker> hostnameToTracker = new ConcurrentHashMap<>();
61-
public static Set<String> trackingIps = new HashSet<>();
61+
public static Set<String> trackingIps = ConcurrentHashMap.newKeySet();
6262
public static String TRACKER_HOSTLIST = "TRACKER_HOSTLIST";
6363
private static final Tracker hostlistTracker = new Tracker(TRACKER_HOSTLIST, UNCATEGORISED);
6464
private static TrackerList instance;
6565
private static boolean domainBasedBlocking;
6666
private final DatabaseHelper databaseHelper;
67+
68+
// Lock for synchronizing tracker data reload operations
69+
private static final Object reloadLock = new Object();
6770

6871
// Performance: Cache tracker counts to avoid full DB scans on every refresh
6972
private Pair<Pair<Map<Integer, Integer>, Integer>, Pair<Map<Integer, Integer>, Integer>> cachedTrackerCounts;
@@ -130,6 +133,30 @@ public static Tracker findTracker(@NonNull String hostname) {
130133
return t;
131134
}
132135

136+
/**
137+
* Reload tracker data by clearing all existing data and reloading from assets.
138+
* This should be called when the hosts blocklist is updated to ensure TrackerList
139+
* stays in sync with the updated hosts.
140+
*
141+
* @param c Context
142+
*/
143+
public static void reloadTrackerData(Context c) {
144+
Log.i(TAG, "Reloading tracker data");
145+
146+
// Synchronize the entire reload operation to prevent race conditions
147+
synchronized (reloadLock) {
148+
// Clear existing data (both are thread-safe collections)
149+
hostnameToTracker.clear();
150+
trackingIps.clear();
151+
152+
// Ensure instance exists and reload trackers from assets
153+
TrackerList trackerList = getInstance(c);
154+
trackerList.loadTrackers(c);
155+
// Invalidate cached tracker counts since tracker data has changed
156+
trackerList.invalidateTrackerCountCache();
157+
}
158+
}
159+
133160
/**
134161
* Load tracker domain database
135162
*

0 commit comments

Comments
 (0)