check for duplicate search UUIDs, cleanup old ones

pull/4/head
Zlatin Balevsky 2019-05-25 22:16:04 +01:00
parent dc3f4ba242
commit d3538bde39
1 changed files with 25 additions and 5 deletions

View File

@ -9,10 +9,13 @@ import net.i2p.data.Destination
@Log
public class SearchManager {
private static final int EXPIRE_TIME = 60 * 1000 * 1000
private static final int CHECK_INTERVAL = 60 * 1000
private final EventBus eventBus
private final Persona me
private final ResultsSender resultsSender
private final Map<UUID, Destination> responderAddress = new HashMap<>()
private final Map<UUID, QueryEvent> responderAddress = Collections.synchronizedMap(new HashMap<>())
SearchManager(){}
@ -20,16 +23,21 @@ public class SearchManager {
this.eventBus = eventBus
this.me = me
this.resultsSender = resultsSender
Timer timer = new Timer("query-expirer", true)
timer.schedule({cleanup()} as TimerTask, CHECK_INTERVAL, CHECK_INTERVAL)
}
void onQueryEvent(QueryEvent event) {
// TODO: duplicate UUID check
responderAddress.put(event.searchEvent.uuid, event.replyTo)
if (responderAddress.containsKey(event.searchEvent.uuid)) {
log.info("Dropping duplicate search uuid $event.searchEvent.uuid")
return
}
responderAddress.put(event.searchEvent.uuid, event)
eventBus.publish(event.searchEvent)
}
void onResultsEvent(ResultsEvent event) {
Destination target = responderAddress.get(event.uuid)
Destination target = responderAddress.get(event.uuid)?.replyTo
if (target == null)
throw new IllegalStateException("UUID unknown $event.uuid")
if (event.results.length == 0) {
@ -40,6 +48,18 @@ public class SearchManager {
}
boolean hasLocalSearch(UUID uuid) {
me.destination.equals(responderAddress.get(uuid))
me.destination.equals(responderAddress.get(uuid)?.replyTo)
}
private void cleanup() {
final long now = System.currentTimeMillis()
synchronized(responderAddress) {
for (Iterator<UUID> iter = responderAddress.keySet().iterator(); iter.hasNext();) {
UUID uuid = iter.next()
QueryEvent event = responderAddress.get(uuid)
if (event.timestamp < now - EXPIRE_TIME)
iter.remove()
}
}
}
}