Timestamps updateRemove(){ return new Timestamps(latestAdd, clock.nanoTime()); }
Timestamps updateAdd(){ return new Timestamps(clock.nanoTime(), latestRemove); }
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 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)); } } }
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()); }
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 } }