public boolean trim(KBucket<T> kbucket, T toAdd) { if (kbucket.getLastChanged() > _ctx.clock().now() - 5*60*1000) return false; return super.trim(kbucket, toAdd); } }
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; } }
/** * For every bucket that hasn't been updated in this long, * or isn't close to full, * generate a random key that would be a member of that bucket. * The returned keys may be searched for to "refresh" the buckets. * @return non-null, closest first */ public List<T> getExploreKeys(long age) { List<T> rv = new ArrayList<T>(_buckets.size()); long old = _context.clock().now() - age; getReadLock(); try { for (KBucket<T> b : _buckets) { int curSize = b.getKeyCount(); // Always explore the closest bucket if ((b.getRangeBegin() == 0) || (b.getLastChanged() < old || curSize < BUCKET_SIZE * 3 / 4)) rv.add(generateRandomKey(b)); } } finally { releaseReadLock(); } return rv; }