package the8472.bt;
import lbms.plugins.mldht.indexer.utils.RotatingBloomFilter;
import lbms.plugins.mldht.kad.utils.AddressUtils;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;
public class UselessPeerFilter {
private static long SHORT_TIMEOUT = TimeUnit.MINUTES.toMillis(10);
private static long LONG_TIMEOUT = TimeUnit.HOURS.toMillis(2);
RotatingBloomFilter shortTimeoutFilter = new RotatingBloomFilter(1000_000, 1024*1024);
RotatingBloomFilter longTimeoutFilter = new RotatingBloomFilter(1000_000, 1024*1024);
long lastLongFilterRotation;
long lastShortFilterRotation;
public UselessPeerFilter() {
long now = System.currentTimeMillis();
lastShortFilterRotation = lastLongFilterRotation = now;
}
public void insert(PullMetaDataConnection toAdd) {
if(toAdd.closeReason == null) {
throw new IllegalArgumentException("peer connection not closed yet");
}
ByteBuffer data = ByteBuffer.wrap(AddressUtils.packAddress(toAdd.remoteAddress));
synchronized (this) {
switch(toAdd.closeReason) {
case CONNECT_FAILED:
shortTimeoutFilter.insert(data);
break;
case NO_LTEP:
case NO_META_EXCHANGE:
longTimeoutFilter.insert(data);
break;
default:
return;
}
}
}
public boolean isBad(InetSocketAddress addr) {
ByteBuffer data = ByteBuffer.wrap(AddressUtils.packAddress(addr));
synchronized (this) {
return shortTimeoutFilter.contains(data) || longTimeoutFilter.contains(data) ;
}
}
public void clean() {
long now = System.currentTimeMillis();
synchronized (this) {
if(now - lastLongFilterRotation > LONG_TIMEOUT) {
longTimeoutFilter.rotate();
lastLongFilterRotation = now;
}
if(now - lastShortFilterRotation > SHORT_TIMEOUT) {
shortTimeoutFilter.rotate();
lastShortFilterRotation = now;
}
}
}
}