/** * Returned list is a copy of the bucket list, closest first, * with the actual buckets (not a copy). * * Primarily for testing. You shouldn't ever need to get all the buckets. * Use getClosest() or getAll() instead to get the keys. * * @return non-null */ List<KBucket<T>> getBuckets() { getReadLock(); try { return new ArrayList<KBucket<T>>(_buckets); } finally { releaseReadLock(); } }
/** * @return a copy in a new set */ public Set<T> getAll() { Set<T> all = new HashSet<T>(256); getReadLock(); try { for (KBucket<T> b : _buckets) { all.addAll(b.getEntries()); } } finally { releaseReadLock(); } return all; }
@Override public String toString() { StringBuilder buf = new StringBuilder(1024); buf.append("<div class=\"debug_container buckets\">"); buf.append("<hr><b>Bucket set rooted on:</b> ").append(_us.toString()) .append(" K=").append(BUCKET_SIZE) .append(" B=").append(B_VALUE) .append(" with ").append(size()) .append(" keys in ").append(_buckets.size()).append(" buckets:<br>\n"); getReadLock(); try { int len = _buckets.size(); for (int i = 0; i < len; i++) { KBucket<T> b = _buckets.get(i); buf.append("<b>Bucket ").append(i).append("/").append(len).append(":</b> "); buf.append(b.toString()).append("<br>\n"); } } finally { releaseReadLock(); } buf.append("</div>"); return buf.toString(); } }
public void getAll(SelectionCollector<T> collector) { getReadLock(); try { for (KBucket<T> b : _buckets) { b.getEntries(collector); } } finally { releaseReadLock(); } }
/** * The current number of entries. */ public int size() { int rv = 0; getReadLock(); try { for (KBucket<T> b : _buckets) { rv += b.getKeyCount(); } } finally { releaseReadLock(); } return rv; }
List<T> rv = new ArrayList<T>(max); int count = 0; getReadLock(); try {
/** @since 0.8.8 */ public void clear() { getReadLock(); try { for (KBucket<T> b : _buckets) { b.clear(); } } finally { releaseReadLock(); } _rangeCalc.clear(); }
public boolean remove(T entry) { KBucket<T> kbucket; getReadLock(); try { kbucket = getBucket(entry); } finally { releaseReadLock(); } if (kbucket == null) // us return false; boolean removed = kbucket.remove(entry); return removed; }
List<T> rv = new ArrayList<T>(max); int count = 0; getReadLock(); try { int start = pickBucket(key);
/** * 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; }
getReadLock(); try { bucket = getBucket(peer);