@Override public NodeLocator createLocator(List<MemcachedNode> nodes) { switch (locator) { case ARRAY_MOD: return new ArrayModNodeLocator(nodes, getHashAlg()); case CONSISTENT: return new KetamaNodeLocator( nodes, getHashAlg(), new DefaultKetamaNodeLocatorConfiguration() { @Override public int getNodeRepetitions() { return repetitions; } } ); default: throw new IllegalStateException("Unhandled locator type: " + locator); } }
public void testDistribution() KetamaNodeLocator locator = new KetamaNodeLocator( ImmutableList.of( dummyNode("druid-cache.0001", 11211), final String k = DigestUtils.sha1Hex("abc" + i) + ":" + DigestUtils.sha1Hex("xyz" + i); long t0 = System.nanoTime(); MemcachedNode node = locator.getPrimary(k); t += System.nanoTime() - t0; if (counter.containsKey(node)) {
public NodeLocator getReadonlyCopy() { TreeMap<Long, MemcachedNode> smn = new TreeMap<Long, MemcachedNode>(getKetamaNodes()); Collection<MemcachedNode> an = new ArrayList<MemcachedNode>(allNodes.size()); // Rewrite the values a copy of the map. for (Map.Entry<Long, MemcachedNode> me : smn.entrySet()) { me.setValue(new MemcachedNodeROImpl(me.getValue())); } // Copy the allNodes collection. for (MemcachedNode n : allNodes) { an.add(new MemcachedNodeROImpl(n)); } return new KetamaNodeLocator(smn, an, hashAlg, config); }
public MemcachedNode getPrimary(final String k) { MemcachedNode rv = getNodeForKey(hashAlg.hash(k)); assert rv != null : "Found no node for key " + k; return rv; }
long getMaxKey() { return getKetamaNodes().lastKey(); }
@Override public void updateLocator(List<MemcachedNode> nodes) { allNodes = nodes; setKetamaNodes(nodes); }
int pointerPerServer = (int)((Math.floor((float)(percent * (float)config.getNodeRepetitions() / 4 * (float)nodeCount + 0.0000000001))) * 4); for (int i = 0; i < pointerPerServer / 4; i++) { for(long position : ketamaNodePositionsAtIteration(node, i)) { newNodeMap.put(position, node); getLogger().debug("Adding node %s with weight %s in position %d", node, thisWeight, position); for(long position : ketamaNodePositionsAtIteration(node, i)) { newNodeMap.put(position, node); getLogger().debug("Adding node %s in position %d", node, position);
/** * Setup the KetamaNodeLocator with the list of nodes it should use. * * @param nodes a List of MemcachedNodes for this KetamaNodeLocator to use in * its continuum */ protected void setKetamaNodes(List<MemcachedNode> nodes) { TreeMap<Long, MemcachedNode> newNodeMap = new TreeMap<Long, MemcachedNode>(); int numReps = config.getNodeRepetitions(); for (MemcachedNode node : nodes) { for (int i = 0; i < numReps / 4; i++) { byte[] digest = DefaultHashAlgorithm.computeMd5(config.getKeyForNode(node, i)); for (int h = 0; h < 4; h++) { Long k = ((long) (digest[3 + h * 4] & 0xFF) << 24) | ((long) (digest[2 + h * 4] & 0xFF) << 16) | ((long) (digest[1 + h * 4] & 0xFF) << 8) | (digest[h * 4] & 0xFF); newNodeMap.put(k, node); getLogger().debug("Adding node %s in position %d", node, k); } } } assert newNodeMap.size() == numReps * nodes.size(); ketamaNodes = newNodeMap; } }
public NodeLocator getReadonlyCopy() { TreeMap<Long, MemcachedNode> smn = new TreeMap<Long, MemcachedNode>(getKetamaNodes()); Collection<MemcachedNode> an = new ArrayList<MemcachedNode>(allNodes.size()); // Rewrite the values a copy of the map. for (Map.Entry<Long, MemcachedNode> me : smn.entrySet()) { smn.put(me.getKey(), new MemcachedNodeROImpl(me.getValue())); } // Copy the allNodes collection. for (MemcachedNode n : allNodes) { an.add(new MemcachedNodeROImpl(n)); } return new KetamaNodeLocator(smn, an, hashAlg, weights, config); }
public MemcachedNode getPrimary(final String k) { MemcachedNode rv = getNodeForKey(hashAlg.hash(k)); assert rv != null : "Found no node for key " + k; return rv; }
long getMaxKey() { return getKetamaNodes().lastKey(); }
@Override public void updateLocator(List<MemcachedNode> nodes) { allNodes = nodes; setKetamaNodes(nodes); allNodes = nodes; }
int pointerPerServer = (int)((Math.floor((float)(percent * (float)config.getNodeRepetitions() / 4 * (float)nodeCount + 0.0000000001))) * 4); for (int i = 0; i < pointerPerServer / 4; i++) { for(long position : ketamaNodePositionsAtIteration(node, i)) { newNodeMap.put(position, node); getLogger().debug("Adding node %s with weight %s in position %d", node, thisWeight, position); for(long position : ketamaNodePositionsAtIteration(node, i)) { newNodeMap.put(position, node); getLogger().debug("Adding node %s in position %d", node, position);
| (digest[h*4]&0xFF); newNodeMap.put(k, node); getLogger().debug("Adding node %s in position %d", node, k);
@Override public NodeLocator createLocator(List<MemcachedNode> nodes) { return new KetamaNodeLocator(nodes, getHashAlg()); } }
public NodeLocator getReadonlyCopy() { TreeMap<Long, MemcachedNode> smn = new TreeMap<Long, MemcachedNode>(getKetamaNodes()); Collection<MemcachedNode> an = new ArrayList<MemcachedNode>(allNodes.size()); // Rewrite the values a copy of the map. for (Map.Entry<Long, MemcachedNode> me : smn.entrySet()) { me.setValue(new MemcachedNodeROImpl(me.getValue())); } // Copy the allNodes collection. for (MemcachedNode n : allNodes) { an.add(new MemcachedNodeROImpl(n)); } return new KetamaNodeLocator(smn, an, hashAlg, config); }
public MemcachedNode getPrimary(final String k) { MemcachedNode rv=getNodeForKey(hashAlg.hash(k)); assert rv != null : "Found no node for key " + k; return rv; }
long getMaxKey() { return getKetamaNodes().lastKey(); }
@Override public void updateLocator(List<MemcachedNode> nodes) { setKetamaNodes(nodes); }
| (digest[h * 4] & 0xFF); newNodeMap.put(k, node); getLogger().debug("Adding node %s in position %d", node, k);