package org.klomp.snark.dht; import java.util.Set; import net.i2p.I2PAppContext; import net.i2p.kademlia.KBucket; import net.i2p.kademlia.KBucketTrimmer; /** * Removes an element older than 15 minutes, but only if the bucket hasn't changed in 5 minutes. * @since 0.9.2 */ class KBTrimmer implements KBucketTrimmer<NID> { private final I2PAppContext _ctx; private final int _max; private static final long MIN_BUCKET_AGE = 5*60*1000; private static final long MAX_NODE_AGE = 15*60*1000; public KBTrimmer(I2PAppContext ctx, int max) { _ctx = ctx; _max = max; } public boolean trim(KBucket<NID> kbucket, NID toAdd) { long now = _ctx.clock().now(); if (kbucket.getLastChanged() > now - MIN_BUCKET_AGE) return false; Set<NID> entries = kbucket.getEntries(); for (NID nid : entries) { if (nid.lastSeen() < now - MAX_NODE_AGE) { if (kbucket.remove(nid)) return true; } } return entries.size() < _max; } }