mirror of https://github.com/zlatinb/muwire
check for duplicate search UUIDs, cleanup old ones
parent
dc3f4ba242
commit
d3538bde39
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue