/** * The bucket number (NOT the range number) that the xor of the key goes in * Caller must hold read lock * @return 0 to max-1 or -1 for us */ private int pickBucket(T key) { int range = getRange(key); if (range < 0) return -1; int rv = pickBucket(range); if (rv >= 0) { return rv; } _log.error("Key does not fit in any bucket?!\nKey : [" + DataHelper.toHexString(key.getData()) + "]" + "\nUs : " + _us + "\nDelta: [" + DataHelper.toHexString(DataHelper.xor(_us.getData(), key.getData())) + "]", new Exception("???")); _log.error(toString()); throw new IllegalStateException("pickBucket returned " + rv); //return -1; }
KBucket<T> b2 = createBucket(s2, e2); for (T key : b0.getEntries()) { if (getRange(key) < s2) b1.add(key); else
/** @since 0.9.10 */ public void testAudit() { int errors = 0; for (KBucket<Hash> b : set.getBuckets()) { for (Hash sds : b.getEntries()) { int range = set.getRange(sds); if (range < b.getRangeBegin() || range > b.getRangeEnd()) { log.error("Hash " + sds + " with range " + range + " does not belong in " + b); errors++; } } } assertTrue(errors == 0); }
/** @since 0.9.10 */ public void testGenRandom() { int errors = 0; for (KBucket<Hash> b : set.getBuckets()) { for (int j = 0; j < 4000; j++) { Hash rand = set.generateRandomKey(b); int range = set.getRange(rand); if (range < b.getRangeBegin() || range > b.getRangeEnd()) { log.error("Generate random key failed range=" + range + " for " + rand + " meant for bucket " + b); errors++; } } } assertTrue(errors == 0); }