private void updateVotes() { for (String lockKey : lockKeys) { SharedDataMessage message = gossipManager.findSharedGossipData(lockKey); if (message == null || !(message.getPayload() instanceof MajorityVote)) { continue; String myNodeId = gossipManager.getMyself().getId(); voteCandidate.addVote(new Vote(gossipManager.getMyself().getId(), voteResult, false, gossipManager.getLiveMembers().stream().map(Member::getId) .collect(Collectors.toList()), gossipManager.getDeadMembers().stream().map(Member::getId) .collect(Collectors.toList())));
void exec(boolean willRead) throws IOException { gossipService.init(); startMonitorLoop(gossipService); if (willRead) { startBlockingReadLoop(); } }
private static void listen(String val, GossipManager gossipManager) { gossipManager.registerSharedDataSubscriber((key, oldValue, newValue) -> { if (key.equals(val)) { System.out.println( "Event Handler fired for key = '" + key + "'! " + oldValue + " " + newValue); } }); }
private void debugState(RemoteMember senderMember, List<Member> remoteList){ LOGGER.warn( "-----------------------\n" + "Me " + gossipManager.getMyself() + "\n" + "Sender " + senderMember + "\n" + "RemoteList " + remoteList + "\n" + "Live " + gossipManager.getLiveMembers()+ "\n" + "Dead " + gossipManager.getDeadMembers()+ "\n" + "======================="); }
/** * sends an optimistic shutdown message to several clusters nodes */ protected void sendShutdownMessage(){ List<LocalMember> l = gossipManager.getLiveMembers(); int sendTo = l.size() < 3 ? 1 : l.size() / 3; for (int i = 0; i < sendTo; i++) { threadService.execute(() -> sendShutdownMessage(gossipManager.getMyself(), selectPartner(l))); } } }
public static File buildRingStatePath(GossipManager manager) { return new File(manager.getSettings().getPathToRingState(), "ringstate." + manager.getMyself().getClusterName() + "." + manager.getMyself().getId() + ".json"); }
gossipService.init(); gossipService.gossipPerNodeData(getToothpick()); gossipService.gossipSharedData(getAnotherToothpick()); gossipService.getUserDataState().writePerNodeToDisk(); gossipService.getUserDataState().writeSharedToDisk(); ConcurrentHashMap<String, ConcurrentHashMap<String, PerNodeDataMessage>> l = gossipService.getUserDataState().readPerNodeFromDisk(); Assert.assertEquals("red", ((AToothpick) l.get(nodeId).get("a").getPayload()).getColor()); gossipService.getUserDataState().readSharedDataFromDisk(); Assert.assertEquals("blue", ((AToothpick) l.get("a").getPayload()).getColor()); gossipService.shutdown(); gossipService.init(); Assert.assertEquals("red", ((AToothpick) gossipService.findPerNodeGossipData(nodeId, "a").getPayload()).getColor()); Assert.assertEquals("blue", ((AToothpick) gossipService.findSharedGossipData("a").getPayload()).getColor()); File f = GossipManager.buildSharedDataPath(gossipService); File g = GossipManager.buildPerNodeDataPath(gossipService); gossipService.shutdown(); f.delete(); g.delete();
.id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build(); clients.add(gossipService); gossipService.init(); register(gossipService); int total = 0; for (int i = 0; i < clusterMembers; ++i) { total += clients.get(i).getLiveMembers().size(); clients.get(1).registerSharedDataSubscriber((key, oldValue, newValue) -> { receivedKey = key; receivingNodeDataOldValue = oldValue; d.setExpireAt(Long.MAX_VALUE); d.setTimestamp(System.currentTimeMillis()); clients.get(0).merge(d); GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(2).findCrdt(gCounterKey); if (gc == null) { return ""; GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(2).findCrdt(gCounterKey); GrowOnlyCounter gcNew = new GrowOnlyCounter(gc, new GrowOnlyCounter.Builder(clients.get(2)).increment(4L)); d.setExpireAt(Long.MAX_VALUE); d.setTimestamp(System.currentTimeMillis()); clients.get(2).merge(d);
public Builder(GossipManager gossipManager) { myId = gossipManager.getMyself().getId(); counter = 0L; }
@Test public void simpleDataTest(){ TUnit.assertThat(() -> { int total = 0; for (GossipManager client : clients){ total += client.getLiveMembers().size(); } return total; }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(2); clients.get(0).gossipPerNodeData(generatePerNodeMsg("a", "b")); clients.get(0).gossipSharedData(generateSharedMsg("a", "c")); TUnit.assertThat(() -> { PerNodeDataMessage x = clients.get(1).findPerNodeGossipData(1 + "", "a"); if (x == null) return ""; else return x.getPayload(); }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo("b"); TUnit.assertThat(() -> { SharedDataMessage x = clients.get(1).findSharedGossipData("a"); if (x == null) return ""; else return x.getPayload(); }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo("c"); }
int total = 0; for (GossipManager node : nodes) { total += node.getLiveMembers().size(); nodes.get(0).gossipSharedData(sharedNodeData("public", "I am visible to all", new AllReplicable<>())); nodes.get(0).gossipSharedData(sharedNodeData("private", "I am private", new NotReplicable<>())); whiteList.add(nodes.get(1).getMyself()); nodes.get(0).gossipSharedData(sharedNodeData("wl", "white list", new WhiteListReplicable<>(whiteList))); blackList.add(nodes.get(1).getMyself()); nodes.get(0).gossipSharedData(sharedNodeData("bl", "black list", new BlackListReplicable<>(blackList))); SharedDataMessage message = nodes.get(1).findSharedGossipData("public"); if(message == null){ return ""; SharedDataMessage message = nodes.get(2).findSharedGossipData("public"); if(message == null){ return ""; SharedDataMessage message = nodes.get(1).findSharedGossipData("wl");
debugState(senderMember, remoteList); for (LocalMember i : gossipManager.getDeadMembers()) { if (i.getId().equals(senderMember.getId())) { LOGGER.debug(gossipManager.getMyself() + " contacted by dead member " + senderMember.getUri()); i.recordHeartbeat(senderMember.getHeartbeat()); i.setHeartbeat(senderMember.getHeartbeat()); if (remoteMember.getId().equals(gossipManager.getMyself().getId())) { continue; remoteMember.getHeartbeat(), remoteMember.getProperties(), gossipManager.getSettings().getWindowSize(), gossipManager.getSettings().getMinimumSamples(), gossipManager.getSettings().getDistribution()); aNewMember.recordHeartbeat(remoteMember.getHeartbeat()); Object result = gossipManager.getMembers().putIfAbsent(aNewMember, GossipState.UP); if (result != null){ for (Entry<LocalMember, GossipState> localMember : gossipManager.getMembers().entrySet()){ if (localMember.getKey().getId().equals(remoteMember.getId())){ localMember.getKey().recordHeartbeat(remoteMember.getHeartbeat());
.id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build(); clients.add(gossipService); gossipService.init(); register(gossipService); int total = 0; for (int i = 0; i < clusterMembers; ++i) { total += clients.get(i).getLiveMembers().size(); clients.get(0).gossipSharedData(sharedNodeData("category", "distributed")); clients.get(1).registerSharedDataSubscriber((key, oldValue, newValue) -> { if (!key.equals("organization") && !key.equals("category")) return; clients.get(0).gossipSharedData(sharedNodeData("organization", "apache")); clients.get(0).gossipSharedData(sharedNodeData("organization", "apache-gossip"));
@Override public void init() { super.init(); scheduledExecutorService.scheduleAtFixedRate(() -> { threadService.execute(() -> { sendToALiveMember(); }); }, 0, gossipManager.getSettings().getGossipInterval(), TimeUnit.MILLISECONDS); scheduledExecutorService.scheduleAtFixedRate(() -> { sendToDeadMember(); }, 0, gossipManager.getSettings().getGossipInterval(), TimeUnit.MILLISECONDS); scheduledExecutorService.scheduleAtFixedRate( () -> sendPerNodeData(gossipManager.getMyself(), selectPartner(gossipManager.getLiveMembers())), 0, gossipManager.getSettings().getGossipInterval(), TimeUnit.MILLISECONDS); scheduledExecutorService.scheduleAtFixedRate( () -> sendSharedData(gossipManager.getMyself(), selectPartner(gossipManager.getLiveMembers())), 0, gossipManager.getSettings().getGossipInterval(), TimeUnit.MILLISECONDS); }
int total = 0; for (GossipManager node : nodes) { total += node.getLiveMembers().size(); nodes.get(0).gossipPerNodeData(getPerNodeData("public", "I am visible to all", new AllReplicable<>())); nodes.get(0).gossipPerNodeData(getPerNodeData("private", "I am private", new NotReplicable<>())); whiteList.add(nodes.get(1).getMyself()); nodes.get(0).gossipPerNodeData(getPerNodeData("wl", "white list", new WhiteListReplicable<>(whiteList))); blackList.add(nodes.get(1).getMyself()); nodes.get(0).gossipPerNodeData(getPerNodeData("bl", "black list", new BlackListReplicable<>(blackList))); PerNodeDataMessage message = nodes.get(1).findPerNodeGossipData("1", "public"); if(message == null){ return ""; PerNodeDataMessage message = nodes.get(2).findPerNodeGossipData("1", "public"); if(message == null){ return ""; PerNodeDataMessage message = nodes.get(1).findPerNodeGossipData("1", "wl");
private static void removeData(String val, GossipManager gossipService) { @SuppressWarnings("unchecked") OrSet<String> s = (OrSet<String>) gossipService.findCrdt(INDEX_KEY_FOR_SET); SharedDataMessage m = new SharedDataMessage(); m.setExpireAt(Long.MAX_VALUE); m.setKey(INDEX_KEY_FOR_SET); m.setPayload(new OrSet<String>(s, new OrSet.Builder<String>().remove(val))); m.setTimestamp(System.currentTimeMillis()); gossipService.merge(m); }
public void acquireSharedDataLock(String key) throws VoteFailedException { final Timer.Context context = lockTimeMetric.time(); gossipManager.merge(generateLockMessage(key)); int deadlockDetectCount = 0; while (true) { SharedDataMessage message = gossipManager.findSharedGossipData(generateLockKey(key)); if (message == null || !(message.getPayload() instanceof MajorityVote)) { continue; String myNodeId = gossipManager.getMyself().getId(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("NodeId=" + myNodeId + ", VoteMap=" + voteResultMap + ", WinnerCount="
@Test public void testReaperOneShot() { GossipSettings settings = new GossipSettings(); settings.setPersistRingState(false); settings.setPersistDataState(false); settings.setTransportManagerClass("org.apache.gossip.transport.UnitTestTransportManager"); settings.setProtocolManagerClass("org.apache.gossip.protocol.UnitTestProtocolManager"); GossipManager gm = GossipManagerBuilder.newBuilder().cluster("abc").gossipSettings(settings) .id(myId).uri(URI.create("udp://localhost:6000")).registry(registry).build(); gm.init(); gm.gossipPerNodeData(perNodeDatum(key, value)); gm.gossipSharedData(sharedDatum(key, value)); assertDataIsAtCorrectValue(gm); gm.getDataReaper().runPerNodeOnce(); gm.getDataReaper().runSharedOnce(); assertDataIsRemoved(gm); gm.shutdown(); }
.id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build(); clients.add(gossipService); gossipService.init(); register(gossipService); int total = 0; for (int i = 0; i < clusterMembers; ++i) { total += clients.get(i).getLiveMembers().size(); clients.get(0).gossipPerNodeData(getPerNodeData("category", "distributed")); clients.get(1).registerPerNodeDataSubscriber((nodeId, key, oldValue, newValue) -> { if (!key.equals("organization") && !key.equals("category")) return; receivingNodeId = nodeId; clients.get(0).gossipPerNodeData(getPerNodeData("organization", "apache")); clients.get(0).gossipPerNodeData(getPerNodeData("organization", "apache-gossip"));
private void sendToDeadMember() { sendMembershipList(gossipManager.getMyself(), selectPartner(gossipManager.getDeadMembers())); }