Timestamps updateRemove(){ return new Timestamps(latestAdd, clock.nanoTime()); }
void reapData(ConcurrentHashMap<String, PerNodeDataMessage> concurrentHashMap){ for (Entry<String, PerNodeDataMessage> entry : concurrentHashMap.entrySet()){ if (entry.getValue().getExpireAt() < clock.currentTimeMillis()){ concurrentHashMap.remove(entry.getKey(), entry.getValue()); } } }
Timestamps updateAdd(){ return new Timestamps(clock.nanoTime(), latestRemove); }
void runSharedOnce(){ for (Entry<String, SharedDataMessage> entry : gossipCore.getSharedData().entrySet()){ if (entry.getValue().getExpireAt() < clock.currentTimeMillis()){ gossipCore.getSharedData().remove(entry.getKey(), entry.getValue()); } } }
public GossipState calcRequiredStateCleanupInterval(LocalMember member, GossipState state) { long now = clock.nanoTime(); long nowInMillis = TimeUnit.MILLISECONDS.convert(now, TimeUnit.NANOSECONDS); if (nowInMillis - settings.getCleanupInterval() > member.getHeartbeat()) { return GossipState.DOWN; } else { return state; } }
public SharedDataMessage findSharedGossipData(String key){ SharedDataMessage l = gossipCore.getSharedData().get(key); if (l == null){ return null; } if (l.getExpireAt() < clock.currentTimeMillis()){ return null; } else { return l; } }
public void runOnce() { for (Entry<LocalMember, GossipState> entry : members.entrySet()) { boolean userDown = processOptimisticShutdown(entry); if (userDown) continue; Double phiMeasure = entry.getKey().detect(clock.nanoTime()); GossipState requiredState; if (phiMeasure != null) { requiredState = calcRequiredState(phiMeasure); } else { requiredState = calcRequiredStateCleanupInterval(entry.getKey(), entry.getValue()); } if (entry.getValue() != requiredState) { members.put(entry.getKey(), requiredState); /* Call listeners asynchronously */ for (GossipListener listener: listeners) listenerExecutor.execute(() -> listener.gossipEvent(entry.getKey(), requiredState)); } } }
@SuppressWarnings("rawtypes") public Crdt findCrdt(String key){ SharedDataMessage l = gossipCore.getSharedData().get(key); if (l == null){ return null; } if (l.getExpireAt() < clock.currentTimeMillis()){ return null; } else { return (Crdt) l.getPayload(); } }
public final void sendShutdownMessage(LocalMember me, LocalMember target){ if (target == null){ return; } ShutdownMessage m = new ShutdownMessage(); m.setNodeId(me.getId()); m.setShutdownAtNanos(gossipManager.getClock().nanoTime()); gossipCore.sendOneWay(m, target.getUri()); }
public PerNodeDataMessage findPerNodeGossipData(String nodeId, String key){ ConcurrentHashMap<String, PerNodeDataMessage> j = gossipCore.getPerNodeData().get(nodeId); if (j == null){ return null; } else { PerNodeDataMessage l = j.get(key); if (l == null){ return null; } if (l.getExpireAt() != null && l.getExpireAt() < clock.currentTimeMillis()) { return null; } return l; } }
private void readSavedRingState() { if (settings.isPersistRingState()) { for (LocalMember l : ringState.readFromDisk()) { LocalMember member = new LocalMember(l.getClusterName(), l.getUri(), l.getId(), clock.nanoTime(), l.getProperties(), settings.getWindowSize(), settings.getMinimumSamples(), settings.getDistribution()); members.putIfAbsent(member, GossipState.DOWN); } } }
me = new LocalMember(cluster, uri, id, clock.nanoTime(), properties, settings.getWindowSize(), settings.getMinimumSamples(), settings.getDistribution()); gossipCore = new GossipCore(this, registry); LocalMember member = new LocalMember(startupMember.getClusterName(), startupMember.getUri(), startupMember.getId(), clock.nanoTime(), startupMember.getProperties(), settings.getWindowSize(), settings.getMinimumSamples(), settings.getDistribution());
@Test public void fakeTimeMergeTest(){ // try to create LWWSet with time from future (simulate other process with its own clock) and validate result // check remove from the future Map<Integer, LwwSet.Timestamps> map = new HashMap<>(); map.put(25, new LwwSet.Timestamps(clock.nanoTime(), Long.MAX_VALUE)); LwwSet<Integer> lww = new LwwSet<>(map); Assert.assertEquals(lww, new LwwSet<Integer>()); //create new LWWSet with element 25, and merge with other LWW which has remove in future Assert.assertEquals(new LwwSet<>(25).merge(lww), new LwwSet<Integer>()); // add in future map.put(25, new LwwSet.Timestamps(Long.MAX_VALUE, 0)); lww = new LwwSet<>(map); lww = lww.remove(25); Assert.assertEquals(lww, new LwwSet<>(25)); // 25 is still here } }