diff --git a/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java b/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java index 34834ed..63f6744 100644 --- a/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java +++ b/gossip-base/src/main/java/org/apache/gossip/GossipSettings.java @@ -21,10 +21,7 @@ import java.util.HashMap; import java.util.Map; import org.apache.gossip.lock.LockManagerSettings; -/** - * In this object the settings used by the GossipService are held. - * - */ +/** In this object the settings used by the GossipService are held. */ public class GossipSettings { /** Time between gossip'ing in ms. Default is 1 second. */ @@ -35,58 +32,59 @@ public class GossipSettings { /** the minimum samples needed before reporting a result */ private int minimumSamples = 5; - + /** the number of samples to keep per host */ private int windowSize = 5000; - + /** the threshold for the detector */ private double convictThreshold = 10; - + private String distribution = "normal"; - + private String activeGossipClass = "org.apache.gossip.manager.SimpleActiveGossiper"; private String transportManagerClass = "org.apache.gossip.transport.udp.UdpTransportManager"; private String protocolManagerClass = "org.apache.gossip.protocol.json.JacksonProtocolManager"; - - private Map activeGossipProperties = new HashMap<>(); - + + private Map activeGossipProperties = new HashMap<>(); + private String pathToRingState = "./"; - + private boolean persistRingState = true; - + private String pathToDataState = "./"; - + private boolean persistDataState = true; - + private String pathToKeyStore = "./keys"; - + private boolean signMessages = false; // Settings related to lock manager - private LockManagerSettings lockManagerSettings = LockManagerSettings - .getLockManagerDefaultSettings(); - + private LockManagerSettings lockManagerSettings = + LockManagerSettings.getLockManagerDefaultSettings(); + private boolean bulkTransfer = false; private int bulkTransferSize = StartupSettings.DEFAULT_BULK_TRANSFER_SIZE; - - /** - * Construct GossipSettings with default settings. - */ - public GossipSettings() { - } + + /** Construct GossipSettings with default settings. */ + public GossipSettings() {} /** * Construct GossipSettings with given settings. - * - * @param gossipInterval - * The gossip interval in ms. - * @param cleanupInterval - * The cleanup interval in ms. + * + * @param gossipInterval The gossip interval in ms. + * @param cleanupInterval The cleanup interval in ms. */ - public GossipSettings(int gossipInterval, int cleanupInterval, int windowSize, int minimumSamples, - double convictThreshold, String distribution, boolean bulkTransfer) { + public GossipSettings( + int gossipInterval, + int cleanupInterval, + int windowSize, + int minimumSamples, + double convictThreshold, + String distribution, + boolean bulkTransfer) { this.gossipInterval = gossipInterval; this.cleanupInterval = cleanupInterval; this.windowSize = windowSize; @@ -98,9 +96,8 @@ public class GossipSettings { /** * Set the gossip interval. This is the time between a gossip message is send. - * - * @param gossipInterval - * The gossip interval in ms. + * + * @param gossipInterval The gossip interval in ms. */ public void setGossipTimeout(int gossipInterval) { this.gossipInterval = gossipInterval; @@ -121,7 +118,7 @@ public class GossipSettings { /** * Get the clean interval. - * + * * @return The cleanup interval. */ public int getCleanupInterval() { @@ -132,8 +129,7 @@ public class GossipSettings { * Set the cleanup interval. This is the time between the last heartbeat received from a member * and when it will be marked as dead. * - * @param cleanupInterval - * The cleanup interval in ms. + * @param cleanupInterval The cleanup interval in ms. */ public void setCleanupInterval(int cleanupInterval) { this.cleanupInterval = cleanupInterval; @@ -257,6 +253,7 @@ public class GossipSettings { /** * Set the lock settings use by the lock manager + * * @param lockManagerSettings lock settings. This object cannot be null. */ public void setLockManagerSettings(LockManagerSettings lockManagerSettings) { diff --git a/gossip-base/src/main/java/org/apache/gossip/LocalMember.java b/gossip-base/src/main/java/org/apache/gossip/LocalMember.java index cd2490c..43ce0ce 100644 --- a/gossip-base/src/main/java/org/apache/gossip/LocalMember.java +++ b/gossip-base/src/main/java/org/apache/gossip/LocalMember.java @@ -19,7 +19,6 @@ package org.apache.gossip; import java.net.URI; import java.util.Map; - import org.apache.gossip.accrual.FailureDetector; /** diff --git a/gossip-base/src/main/java/org/apache/gossip/StartupSettings.java b/gossip-base/src/main/java/org/apache/gossip/StartupSettings.java index 8c269eb..210dab2 100644 --- a/gossip-base/src/main/java/org/apache/gossip/StartupSettings.java +++ b/gossip-base/src/main/java/org/apache/gossip/StartupSettings.java @@ -32,34 +32,33 @@ import java.util.Map; import java.util.Map.Entry; import lombok.extern.slf4j.Slf4j; -/** - * This object represents the settings used when starting the gossip service. - * - */ +/** This object represents the settings used when starting the gossip service. */ @Slf4j public class StartupSettings { public static final int DEFAULT_BULK_TRANSFER_SIZE = 100; + /** Default setting values */ private static final boolean DEFAULT_BULK_TRANSFER = false; + /** The gossip settings used at startup. */ private final GossipSettings gossipSettings; + /** The list with gossip members to start with. */ private final List gossipMembers; + /** The id to use fo the service */ private String id; + private URI uri; private String cluster; /** * Constructor. - * - * @param id - * The id to be used for this service - * @param uri - * A URI object containing IP/hostname and port - * @param logLevel - * unused + * + * @param id The id to be used for this service + * @param uri A URI object containing IP/hostname and port + * @param logLevel unused */ public StartupSettings(String id, URI uri, int logLevel, String cluster) { this(id, uri, new GossipSettings(), cluster); @@ -68,10 +67,8 @@ public class StartupSettings { /** * Constructor. * - * @param id - * The id to be used for this service - * @param uri - * A URI object containing IP/hostname and port + * @param id The id to be used for this service + * @param uri A URI object containing IP/hostname and port */ public StartupSettings(String id, URI uri, GossipSettings gossipSettings, String cluster) { this.id = id; @@ -84,30 +81,27 @@ public class StartupSettings { /** * Parse the settings for the gossip service from a JSON file. * - * @param jsonFile - * The file object which refers to the JSON config file. + * @param jsonFile The file object which refers to the JSON config file. * @return The StartupSettings object with the settings from the config file. - * @throws FileNotFoundException - * Thrown when the file cannot be found. - * @throws IOException - * Thrown when reading the file gives problems. + * @throws FileNotFoundException Thrown when the file cannot be found. + * @throws IOException Thrown when reading the file gives problems. * @throws URISyntaxException */ - public static StartupSettings fromJSONFile(File jsonFile) throws - FileNotFoundException, IOException, URISyntaxException { + public static StartupSettings fromJSONFile(File jsonFile) + throws FileNotFoundException, IOException, URISyntaxException { ObjectMapper om = new ObjectMapper(); JsonNode root = om.readTree(jsonFile); JsonNode jsonObject = root.get(0); String uri = jsonObject.get("uri").textValue(); String id = jsonObject.get("id").textValue(); - Map properties = new HashMap(); + Map properties = new HashMap(); JsonNode n = jsonObject.get("properties"); Iterator> l = n.fields(); - while (l.hasNext()){ + while (l.hasNext()) { Entry i = l.next(); properties.put(i.getKey(), i.getValue().asText()); } - //TODO constants as defaults? + // TODO constants as defaults? // TODO setting keys as constants? int gossipInterval = jsonObject.get("gossip_interval").intValue(); int cleanupInterval = jsonObject.get("cleanup_interval").intValue(); @@ -116,24 +110,35 @@ public class StartupSettings { double convictThreshold = jsonObject.get("convict_threshold").asDouble(); String cluster = jsonObject.get("cluster").textValue(); String distribution = jsonObject.get("distribution").textValue(); - boolean bulkTransfer = jsonObject.has("bulk_transfer") ? - jsonObject.get("bulk_transfer").booleanValue() : - DEFAULT_BULK_TRANSFER; - int bulkTransferSize = jsonObject.has("bulk_transfer_size") ? - jsonObject.get("bulk_transfer_size").intValue() : - DEFAULT_BULK_TRANSFER_SIZE; - if (cluster == null){ + boolean bulkTransfer = + jsonObject.has("bulk_transfer") + ? jsonObject.get("bulk_transfer").booleanValue() + : DEFAULT_BULK_TRANSFER; + int bulkTransferSize = + jsonObject.has("bulk_transfer_size") + ? jsonObject.get("bulk_transfer_size").intValue() + : DEFAULT_BULK_TRANSFER_SIZE; + if (cluster == null) { throw new IllegalArgumentException("cluster was null. It is required"); } - String transportClass = jsonObject.has("transport_manager_class") ? - jsonObject.get("transport_manager_class").textValue() : - null; - String protocolClass = jsonObject.has("protocol_manager_class") ? - jsonObject.get("protocol_manager_class").textValue() : - null; + String transportClass = + jsonObject.has("transport_manager_class") + ? jsonObject.get("transport_manager_class").textValue() + : null; + String protocolClass = + jsonObject.has("protocol_manager_class") + ? jsonObject.get("protocol_manager_class").textValue() + : null; URI uri2 = new URI(uri); - GossipSettings gossipSettings = new GossipSettings(gossipInterval, cleanupInterval, windowSize, - minSamples, convictThreshold, distribution, bulkTransfer); + GossipSettings gossipSettings = + new GossipSettings( + gossipInterval, + cleanupInterval, + windowSize, + minSamples, + convictThreshold, + distribution, + bulkTransfer); gossipSettings.setBulkTransferSize(bulkTransferSize); if (transportClass != null) { gossipSettings.setTransportManagerClass(transportClass); @@ -144,15 +149,15 @@ public class StartupSettings { StartupSettings settings = new StartupSettings(id, uri2, gossipSettings, cluster); String configMembersDetails = "Config-members ["; JsonNode membersJSON = jsonObject.get("members"); - for (JsonNode child : membersJSON) { - URI uri3 = new URI(child.get("uri").textValue()); - RemoteMember member = new RemoteMember(child.get("cluster").asText(), - uri3, "", 0, new HashMap() - ); - settings.addGossipMember(member); - configMembersDetails += member.computeAddress(); - configMembersDetails += ", "; - } + for (JsonNode child : membersJSON) { + URI uri3 = new URI(child.get("uri").textValue()); + RemoteMember member = + new RemoteMember( + child.get("cluster").asText(), uri3, "", 0, new HashMap()); + settings.addGossipMember(member); + configMembersDetails += member.computeAddress(); + configMembersDetails += ", "; + } log.info(configMembersDetails + "]"); return settings; } @@ -175,7 +180,7 @@ public class StartupSettings { /** * Get the id for this service. - * + * * @return the service's id. */ public String getId() { @@ -185,8 +190,7 @@ public class StartupSettings { /** * Set the id to be used for this service. * - * @param id - * The id for this service. + * @param id The id for this service. */ public void setId(String id) { this.id = id; @@ -204,8 +208,7 @@ public class StartupSettings { /** * Add a gossip member to the list of members to start with. * - * @param member - * The member to add. + * @param member The member to add. */ public void addGossipMember(Member member) { gossipMembers.add(member); diff --git a/gossip-base/src/main/java/org/apache/gossip/accrual/FailureDetector.java b/gossip-base/src/main/java/org/apache/gossip/accrual/FailureDetector.java index 0166bae..e0bef8b 100644 --- a/gossip-base/src/main/java/org/apache/gossip/accrual/FailureDetector.java +++ b/gossip-base/src/main/java/org/apache/gossip/accrual/FailureDetector.java @@ -38,8 +38,7 @@ public class FailureDetector { } /** - * Updates the statistics based on the delta between the last - * heartbeat and supplied time + * Updates the statistics based on the delta between the last heartbeat and supplied time * * @param now the time of the heartbeat in milliseconds */ @@ -63,9 +62,13 @@ public class FailureDetector { if (distribution.equals("normal")) { double standardDeviation = descriptiveStatistics.getStandardDeviation(); standardDeviation = Math.max(standardDeviation, 0.1); - probability = new NormalDistribution(descriptiveStatistics.getMean(), standardDeviation).cumulativeProbability(delta); + probability = + new NormalDistribution(descriptiveStatistics.getMean(), standardDeviation) + .cumulativeProbability(delta); } else { - probability = new ExponentialDistribution(descriptiveStatistics.getMean()).cumulativeProbability(delta); + probability = + new ExponentialDistribution(descriptiveStatistics.getMean()) + .cumulativeProbability(delta); } final double eps = 1e-12; if (1 - probability < eps) { diff --git a/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java b/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java index 1a869bb..217e1d1 100644 --- a/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java +++ b/gossip-base/src/main/java/org/apache/gossip/crdt/CrdtModule.java @@ -37,105 +37,135 @@ import org.apache.gossip.replication.WhiteListReplicable; abstract class OrSetMixin { @JsonCreator - OrSetMixin(@JsonProperty("elements") Map> w, @JsonProperty("tombstones") Map> h) { } - @JsonProperty("elements") abstract Map> getElements(); - @JsonProperty("tombstones") abstract Map> getTombstones(); - @JsonIgnore abstract boolean isEmpty(); + OrSetMixin( + @JsonProperty("elements") Map> w, + @JsonProperty("tombstones") Map> h) {} + + @JsonProperty("elements") + abstract Map> getElements(); + + @JsonProperty("tombstones") + abstract Map> getTombstones(); + + @JsonIgnore + abstract boolean isEmpty(); } abstract class LWWSetMixin { @JsonCreator - LWWSetMixin(@JsonProperty("data") Map struct) { } - @JsonProperty("data") abstract Map getStruct(); + LWWSetMixin(@JsonProperty("data") Map struct) {} + + @JsonProperty("data") + abstract Map getStruct(); } abstract class LWWSetTimestampsMixin { @JsonCreator - LWWSetTimestampsMixin(@JsonProperty("add") long latestAdd, @JsonProperty("remove") long latestRemove) { } - @JsonProperty("add") abstract long getLatestAdd(); - @JsonProperty("remove") abstract long getLatestRemove(); + LWWSetTimestampsMixin( + @JsonProperty("add") long latestAdd, @JsonProperty("remove") long latestRemove) {} + + @JsonProperty("add") + abstract long getLatestAdd(); + + @JsonProperty("remove") + abstract long getLatestRemove(); } abstract class MaxChangeSetMixin { @JsonCreator - MaxChangeSetMixin(@JsonProperty("data") Map struct) { } - @JsonProperty("data") abstract Map getStruct(); + MaxChangeSetMixin(@JsonProperty("data") Map struct) {} + + @JsonProperty("data") + abstract Map getStruct(); } abstract class TwoPhaseSetMixin { @JsonCreator - TwoPhaseSetMixin(@JsonProperty("added") Set added, @JsonProperty("removed") Set removed) { } - @JsonProperty("added") abstract Set getAdded(); - @JsonProperty("removed") abstract Set getRemoved(); + TwoPhaseSetMixin(@JsonProperty("added") Set added, @JsonProperty("removed") Set removed) {} + + @JsonProperty("added") + abstract Set getAdded(); + + @JsonProperty("removed") + abstract Set getRemoved(); } -abstract class GrowOnlySetMixin{ +abstract class GrowOnlySetMixin { @JsonCreator - GrowOnlySetMixin(@JsonProperty("elements") Set elements){ } - @JsonProperty("elements") abstract Set getElements(); - @JsonIgnore abstract boolean isEmpty(); + GrowOnlySetMixin(@JsonProperty("elements") Set elements) {} + + @JsonProperty("elements") + abstract Set getElements(); + + @JsonIgnore + abstract boolean isEmpty(); } abstract class GrowOnlyCounterMixin { @JsonCreator - GrowOnlyCounterMixin(@JsonProperty("counters") Map counters) { } - @JsonProperty("counters") abstract Map getCounters(); + GrowOnlyCounterMixin(@JsonProperty("counters") Map counters) {} + + @JsonProperty("counters") + abstract Map getCounters(); } abstract class PNCounterMixin { @JsonCreator - PNCounterMixin(@JsonProperty("p-counters") Map up, @JsonProperty("n-counters") Map down) { } - @JsonProperty("p-counters") abstract Map getPCounters(); - @JsonProperty("n-counters") abstract Map getNCounters(); + PNCounterMixin( + @JsonProperty("p-counters") Map up, + @JsonProperty("n-counters") Map down) {} + + @JsonProperty("p-counters") + abstract Map getPCounters(); + + @JsonProperty("n-counters") + abstract Map getNCounters(); } -@JsonTypeInfo( - use = JsonTypeInfo.Id.CLASS, - include = JsonTypeInfo.As.PROPERTY, - property = "type") -abstract class ReplicableMixin { - -} +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type") +abstract class ReplicableMixin {} abstract class WhiteListReplicableMixin { @JsonCreator - WhiteListReplicableMixin(@JsonProperty("whiteListMembers") List whiteListMembers) { } - @JsonProperty("whiteListMembers") abstract List getWhiteListMembers(); + WhiteListReplicableMixin(@JsonProperty("whiteListMembers") List whiteListMembers) {} + + @JsonProperty("whiteListMembers") + abstract List getWhiteListMembers(); } abstract class BlackListReplicableMixin { @JsonCreator - BlackListReplicableMixin(@JsonProperty("blackListMembers") List blackListMembers) { } - @JsonProperty("blackListMembers") abstract List getBlackListMembers(); + BlackListReplicableMixin(@JsonProperty("blackListMembers") List blackListMembers) {} + + @JsonProperty("blackListMembers") + abstract List getBlackListMembers(); } abstract class VoteCandidateMixin { @JsonCreator VoteCandidateMixin( - @JsonProperty("candidateNodeId") String candidateNodeId, - @JsonProperty("votingKey") String votingKey, - @JsonProperty("votes") Map votes - ) { } + @JsonProperty("candidateNodeId") String candidateNodeId, + @JsonProperty("votingKey") String votingKey, + @JsonProperty("votes") Map votes) {} } abstract class VoteMixin { @JsonCreator VoteMixin( - @JsonProperty("votingNode") String votingNode, - @JsonProperty("voteValue") Boolean voteValue, - @JsonProperty("voteExchange") Boolean voteExchange, - @JsonProperty("liveMembers") List liveMembers, - @JsonProperty("deadMembers") List deadMembers - ) { } + @JsonProperty("votingNode") String votingNode, + @JsonProperty("voteValue") Boolean voteValue, + @JsonProperty("voteExchange") Boolean voteExchange, + @JsonProperty("liveMembers") List liveMembers, + @JsonProperty("deadMembers") List deadMembers) {} } -abstract class MajorityVoteMixin{ +abstract class MajorityVoteMixin { @JsonCreator - MajorityVoteMixin(@JsonProperty("voteCandidates") Map voteCandidateMap){ } + MajorityVoteMixin(@JsonProperty("voteCandidates") Map voteCandidateMap) {} } -//If anyone wants to take a stab at this. please have at it -//https://github.com/FasterXML/jackson-datatype-guava/blob/master/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java +// If anyone wants to take a stab at this. please have at it +// https://github.com/FasterXML/jackson-datatype-guava/blob/master/src/main/java/com/fasterxml/jackson/datatype/guava/ser/MultimapSerializer.java public class CrdtModule extends SimpleModule { private static final long serialVersionUID = 6134836523275023418L; @@ -161,6 +191,4 @@ public class CrdtModule extends SimpleModule { context.setMixInAnnotations(VoteCandidate.class, VoteCandidateMixin.class); context.setMixInAnnotations(Vote.class, VoteMixin.class); } - } - diff --git a/gossip-base/src/main/java/org/apache/gossip/crdt/GrowOnlyCounter.java b/gossip-base/src/main/java/org/apache/gossip/crdt/GrowOnlyCounter.java index 63f76ac..837b0df 100644 --- a/gossip-base/src/main/java/org/apache/gossip/crdt/GrowOnlyCounter.java +++ b/gossip-base/src/main/java/org/apache/gossip/crdt/GrowOnlyCounter.java @@ -23,13 +23,13 @@ import java.util.Map; import org.apache.gossip.manager.GossipManager; public class GrowOnlyCounter implements CrdtCounter { - + private final Map counters = new HashMap<>(); - + GrowOnlyCounter(Map counters) { this.counters.putAll(counters); } - + public GrowOnlyCounter(GrowOnlyCounter growOnlyCounter, Builder builder) { counters.putAll(growOnlyCounter.counters); if (counters.containsKey(builder.myId)) { @@ -39,21 +39,21 @@ public class GrowOnlyCounter implements CrdtCounter { counters.put(builder.myId, builder.counter); } } - + public GrowOnlyCounter(Builder builder) { counters.put(builder.myId, builder.counter); } - + public GrowOnlyCounter(GossipManager manager) { counters.put(manager.getMyself().getId(), 0L); } - + public GrowOnlyCounter(GrowOnlyCounter growOnlyCounter, GrowOnlyCounter other) { counters.putAll(growOnlyCounter.counters); for (Map.Entry entry : other.counters.entrySet()) { String otherKey = entry.getKey(); Long otherValue = entry.getValue(); - + if (counters.containsKey(otherKey)) { Long newValue = Math.max(counters.get(otherKey), otherValue); counters.replace(otherKey, newValue); @@ -62,12 +62,12 @@ public class GrowOnlyCounter implements CrdtCounter { } } } - + @Override public GrowOnlyCounter merge(GrowOnlyCounter other) { return new GrowOnlyCounter(this, other); } - + @Override public Long value() { Long globalCount = 0L; @@ -76,40 +76,39 @@ public class GrowOnlyCounter implements CrdtCounter { } return globalCount; } - + @Override public GrowOnlyCounter optimize() { return new GrowOnlyCounter(counters); } - + @Override public boolean equals(Object obj) { - if (getClass() != obj.getClass()) - return false; + if (getClass() != obj.getClass()) return false; GrowOnlyCounter other = (GrowOnlyCounter) obj; return value().longValue() == other.value().longValue(); } - + @Override public String toString() { return "GrowOnlyCounter [counters= " + counters + ", Value=" + value() + "]"; } - + Map getCounters() { return counters; } - + public static class Builder { - + private final String myId; - + private Long counter; - + public Builder(GossipManager gossipManager) { myId = gossipManager.getMyself().getId(); counter = 0L; } - + public GrowOnlyCounter.Builder increment(Long count) { counter += count; return this; diff --git a/gossip-base/src/main/java/org/apache/gossip/crdt/LwwSet.java b/gossip-base/src/main/java/org/apache/gossip/crdt/LwwSet.java index 190b08d..95ecf17 100644 --- a/gossip-base/src/main/java/org/apache/gossip/crdt/LwwSet.java +++ b/gossip-base/src/main/java/org/apache/gossip/crdt/LwwSet.java @@ -43,57 +43,60 @@ import org.apache.gossip.manager.SystemClock; DataTest - integration test with 2 nodes, LWWSet was serialized/deserialized, sent between nodes, merged */ -public class LwwSet implements CrdtAddRemoveSet, LwwSet> { - static private Clock clock = new SystemClock(); +public class LwwSet + implements CrdtAddRemoveSet, LwwSet> { + private static Clock clock = new SystemClock(); private final Map struct; - public LwwSet(){ + public LwwSet() { struct = new HashMap<>(); } - @SafeVarargs - public LwwSet(ElementType... elements){ + public LwwSet(ElementType... elements) { this(new HashSet<>(Arrays.asList(elements))); } - public LwwSet(Set set){ + public LwwSet(Set set) { struct = new HashMap<>(); - for (ElementType e : set){ + for (ElementType e : set) { struct.put(e, new Timestamps().updateAdd()); } } - public LwwSet(LwwSet first, LwwSet second){ - Function timestampsFor = p -> { - Timestamps firstTs = first.struct.get(p); - Timestamps secondTs = second.struct.get(p); - if (firstTs == null){ - return secondTs; - } - return firstTs.merge(secondTs); - }; - struct = Stream.concat(first.struct.keySet().stream(), second.struct.keySet().stream()) - .distinct().collect(Collectors.toMap(p -> p, timestampsFor)); + public LwwSet(LwwSet first, LwwSet second) { + Function timestampsFor = + p -> { + Timestamps firstTs = first.struct.get(p); + Timestamps secondTs = second.struct.get(p); + if (firstTs == null) { + return secondTs; + } + return firstTs.merge(secondTs); + }; + struct = + Stream.concat(first.struct.keySet().stream(), second.struct.keySet().stream()) + .distinct() + .collect(Collectors.toMap(p -> p, timestampsFor)); } // for serialization - LwwSet(Map struct){ + LwwSet(Map struct) { this.struct = struct; } - public LwwSet add(ElementType e){ + public LwwSet add(ElementType e) { return this.merge(new LwwSet<>(e)); } - Map getStruct(){ + Map getStruct() { return struct; } - public LwwSet remove(ElementType e){ + public LwwSet remove(ElementType e) { Timestamps eTimestamps = struct.get(e); - if (eTimestamps == null || !eTimestamps.isPresent()){ + if (eTimestamps == null || !eTimestamps.isPresent()) { return this; } Map changeMap = new HashMap<>(); @@ -102,12 +105,12 @@ public class LwwSet implements CrdtAddRemoveSet merge(LwwSet other){ + public LwwSet merge(LwwSet other) { return new LwwSet<>(this, other); } @Override - public Set value(){ + public Set value() { return struct.entrySet().stream() .filter(entry -> entry.getValue().isPresent()) .map(Map.Entry::getKey) @@ -115,55 +118,57 @@ public class LwwSet implements CrdtAddRemoveSet optimize(){ + public LwwSet optimize() { return this; } @Override - public boolean equals(Object obj){ - return this == obj || (obj != null && getClass() == obj.getClass() && value().equals(((LwwSet) obj).value())); + public boolean equals(Object obj) { + return this == obj + || (obj != null && getClass() == obj.getClass() && value().equals(((LwwSet) obj).value())); } static class Timestamps { private final long latestAdd; private final long latestRemove; - Timestamps(){ + Timestamps() { latestAdd = 0; latestRemove = 0; } - Timestamps(long add, long remove){ + Timestamps(long add, long remove) { latestAdd = add; latestRemove = remove; } - long getLatestAdd(){ + long getLatestAdd() { return latestAdd; } - long getLatestRemove(){ + long getLatestRemove() { return latestRemove; } // consider element present when addTime >= removeTime, so we prefer add to remove - boolean isPresent(){ + boolean isPresent() { return latestAdd >= latestRemove; } - Timestamps updateAdd(){ + Timestamps updateAdd() { return new Timestamps(clock.nanoTime(), latestRemove); } - Timestamps updateRemove(){ + Timestamps updateRemove() { return new Timestamps(latestAdd, clock.nanoTime()); } - Timestamps merge(Timestamps other){ - if (other == null){ + Timestamps merge(Timestamps other) { + if (other == null) { return this; } - return new Timestamps(Math.max(latestAdd, other.latestAdd), Math.max(latestRemove, other.latestRemove)); + return new Timestamps( + Math.max(latestAdd, other.latestAdd), Math.max(latestRemove, other.latestRemove)); } } -} \ No newline at end of file +} diff --git a/gossip-base/src/main/java/org/apache/gossip/crdt/OrSet.java b/gossip-base/src/main/java/org/apache/gossip/crdt/OrSet.java index 7bbd2a3..cdbab7d 100644 --- a/gossip-base/src/main/java/org/apache/gossip/crdt/OrSet.java +++ b/gossip-base/src/main/java/org/apache/gossip/crdt/OrSet.java @@ -23,57 +23,39 @@ import java.util.function.BiConsumer; import org.apache.gossip.crdt.OrSet.Builder.Operation; /* - * A immutable set + * A immutable set */ -public class OrSet implements CrdtAddRemoveSet, OrSet> { - +public class OrSet implements CrdtAddRemoveSet, OrSet> { + private final Map> elements = new HashMap<>(); private final Map> tombstones = new HashMap<>(); private final transient Set val; - - public OrSet(){ + + public OrSet() { val = computeValue(); } - - OrSet(Map> elements, Map> tombstones){ + + OrSet(Map> elements, Map> tombstones) { this.elements.putAll(elements); this.tombstones.putAll(tombstones); val = computeValue(); } - + @SafeVarargs - public OrSet(E ... elements){ + public OrSet(E... elements) { this(new HashSet<>(Arrays.asList(elements))); } public OrSet(Set elements) { - for (E e: elements){ + for (E e : elements) { internalAdd(e); } val = computeValue(); } - - public OrSet(Builderbuilder){ - for (Builder.OrSetElement e: builder.elements){ - if (e.operation == Operation.ADD){ - internalAdd(e.element); - } else { - internalRemove(e.element); - } - } - val = computeValue(); - } - - /** - * This constructor is the way to remove elements from an existing set - * @param set - * @param builder - */ - public OrSet(OrSet set, Builder builder){ - elements.putAll(set.elements); - tombstones.putAll(set.tombstones); - for (Builder.OrSetElement e: builder.elements){ - if (e.operation == Operation.ADD){ + + public OrSet(Builder builder) { + for (Builder.OrSetElement e : builder.elements) { + if (e.operation == Operation.ADD) { internalAdd(e.element); } else { internalRemove(e.element); @@ -82,12 +64,32 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { val = computeValue(); } - public OrSet(OrSet left, OrSet right){ - BiConsumer>, Map>> internalMerge = (items, other) -> { - for (Entry> l : other.entrySet()){ - internalSetMerge(items, l.getKey(), l.getValue()); + /** + * This constructor is the way to remove elements from an existing set + * + * @param set + * @param builder + */ + public OrSet(OrSet set, Builder builder) { + elements.putAll(set.elements); + tombstones.putAll(set.tombstones); + for (Builder.OrSetElement e : builder.elements) { + if (e.operation == Operation.ADD) { + internalAdd(e.element); + } else { + internalRemove(e.element); } - }; + } + val = computeValue(); + } + + public OrSet(OrSet left, OrSet right) { + BiConsumer>, Map>> internalMerge = + (items, other) -> { + for (Entry> l : other.entrySet()) { + internalSetMerge(items, l.getKey(), l.getValue()); + } + }; internalMerge.accept(elements, left.elements); internalMerge.accept(elements, right.elements); @@ -121,31 +123,31 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { return new OrSet<>(this, new Builder().remove(e)); } - public OrSet.Builder builder(){ + public OrSet.Builder builder() { return new OrSet.Builder<>(); } - + @Override public OrSet merge(OrSet other) { return new OrSet(this, other); } - + private void internalAdd(E element) { Set toMerge = new HashSet<>(); toMerge.add(UUID.randomUUID()); internalSetMerge(elements, element, toMerge); } - - private void internalRemove(E element){ + + private void internalRemove(E element) { internalSetMerge(tombstones, element, elements.get(element)); } /* * Computes the live values by analyzing the elements and tombstones */ - private Set computeValue(){ + private Set computeValue() { Set values = new HashSet<>(); - for (Entry> entry: elements.entrySet()){ + for (Entry> entry : elements.entrySet()) { Set deleteIds = tombstones.get(entry.getKey()); // if not all tokens for current element are in tombstones if (deleteIds == null || !deleteIds.containsAll(entry.getValue())) { @@ -154,7 +156,7 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { } return values; } - + @Override public Set value() { return val; @@ -164,7 +166,7 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { public OrSet optimize() { return this; } - + public int size() { return value().size(); } @@ -195,7 +197,6 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { public E next() { return managed.next(); } - }; } @@ -229,7 +230,7 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { @Override public String toString() { - return "OrSet [elements=" + elements + ", tombstones=" + tombstones + "]" ; + return "OrSet [elements=" + elements + ", tombstones=" + tombstones + "]"; } @Override @@ -242,19 +243,14 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { @Override public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; @SuppressWarnings("rawtypes") OrSet other = (OrSet) obj; if (elements == null) { - if (other.elements != null) - return false; - } else if (!value().equals(other.value())) - return false; + if (other.elements != null) return false; + } else if (!value().equals(other.value())) return false; return true; } @@ -267,7 +263,8 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { } public static class Builder { - private List> elements = new ArrayList<>();; + private List> elements = new ArrayList<>(); + ; public Builder add(E element) { elements.add(new OrSetElement(element, Operation.ADD)); @@ -284,8 +281,9 @@ public class OrSet implements CrdtAddRemoveSet, OrSet> { return this; } -public static enum Operation { - ADD, REMOVE + public static enum Operation { + ADD, + REMOVE } private class OrSetElement { @@ -298,5 +296,4 @@ public static enum Operation { } } } - } diff --git a/gossip-base/src/main/java/org/apache/gossip/crdt/PNCounter.java b/gossip-base/src/main/java/org/apache/gossip/crdt/PNCounter.java index 21286f6..79ffed1 100644 --- a/gossip-base/src/main/java/org/apache/gossip/crdt/PNCounter.java +++ b/gossip-base/src/main/java/org/apache/gossip/crdt/PNCounter.java @@ -74,8 +74,7 @@ public class PNCounter implements CrdtCounter { @Override public boolean equals(Object obj) { - if (getClass() != obj.getClass()) - return false; + if (getClass() != obj.getClass()) return false; PNCounter other = (PNCounter) obj; return value().longValue() == other.value().longValue(); } @@ -118,8 +117,8 @@ public class PNCounter implements CrdtCounter { } public org.apache.gossip.crdt.GrowOnlyCounter.Builder makeGrowOnlyCounterBuilder(long value) { - org.apache.gossip.crdt.GrowOnlyCounter.Builder ret = new org.apache.gossip.crdt.GrowOnlyCounter.Builder( - myManager); + org.apache.gossip.crdt.GrowOnlyCounter.Builder ret = + new org.apache.gossip.crdt.GrowOnlyCounter.Builder(myManager); ret.increment(value); return ret; } @@ -134,5 +133,4 @@ public class PNCounter implements CrdtCounter { return this; } } - } diff --git a/gossip-base/src/main/java/org/apache/gossip/event/data/DataEventManager.java b/gossip-base/src/main/java/org/apache/gossip/event/data/DataEventManager.java index 2e4e4a3..f15fd2b 100644 --- a/gossip-base/src/main/java/org/apache/gossip/event/data/DataEventManager.java +++ b/gossip-base/src/main/java/org/apache/gossip/event/data/DataEventManager.java @@ -19,7 +19,6 @@ package org.apache.gossip.event.data; import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; - import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java b/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java index 58e2a12..66b1c36 100644 --- a/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java +++ b/gossip-base/src/main/java/org/apache/gossip/lock/LockManager.java @@ -46,7 +46,6 @@ import org.apache.gossip.model.SharedDataMessage; @Slf4j public class LockManager { - // For MetricRegistry public static final String LOCK_KEY_SET_SIZE = "gossip.lock.key_set_size"; public static final String LOCK_TIME = "gossip.lock.time"; @@ -57,8 +56,10 @@ public class LockManager { private final Set lockKeys; private final Timer lockTimeMetric; - public LockManager(GossipManager gossipManager, final LockManagerSettings lockManagerSettings, - MetricRegistry metrics) { + public LockManager( + GossipManager gossipManager, + final LockManagerSettings lockManagerSettings, + MetricRegistry metrics) { this.gossipManager = gossipManager; this.lockSettings = lockManagerSettings; this.numberOfNodes = new AtomicInteger(lockSettings.getNumberOfNodes()); @@ -66,14 +67,15 @@ public class LockManager { metrics.register(LOCK_KEY_SET_SIZE, (Gauge) lockKeys::size); lockTimeMetric = metrics.timer(LOCK_TIME); // Register listener for lock keys - gossipManager.registerSharedDataSubscriber((key, oldValue, newValue) -> { - if (key.contains("lock/")) { - lockKeys.add(key); - } - }); + gossipManager.registerSharedDataSubscriber( + (key, oldValue, newValue) -> { + if (key.contains("lock/")) { + lockKeys.add(key); + } + }); voteService = Executors.newScheduledThreadPool(2); - voteService.scheduleAtFixedRate(this::updateVotes, 0, lockSettings.getVoteUpdateInterval(), - TimeUnit.MILLISECONDS); + voteService.scheduleAtFixedRate( + this::updateVotes, 0, lockSettings.getVoteUpdateInterval(), TimeUnit.MILLISECONDS); } public void acquireSharedDataLock(String key) throws VoteFailedException { @@ -89,21 +91,30 @@ public class LockManager { final Map voteCandidatesMap = majorityVoteResult.value(); final Map voteResultMap = new HashMap<>(); // Store the vote result for each vote candidate nodes - voteCandidatesMap.forEach((candidateId, voteCandidate) -> voteResultMap - .put(candidateId, isVoteSuccess(voteCandidate))); + voteCandidatesMap.forEach( + (candidateId, voteCandidate) -> + voteResultMap.put(candidateId, isVoteSuccess(voteCandidate))); long passedCandidates = voteResultMap.values().stream().filter(aBoolean -> aBoolean).count(); String myNodeId = gossipManager.getMyself().getId(); - log.debug("NodeId=" + myNodeId + ", VoteMap=" + voteResultMap + ", WinnerCount=" - + passedCandidates); + log.debug( + "NodeId=" + + myNodeId + + ", VoteMap=" + + voteResultMap + + ", WinnerCount=" + + passedCandidates); // Check for possible dead lock when no candidates were won if (passedCandidates == 0) { if (isDeadLock(voteCandidatesMap)) { deadlockDetectCount++; // Testing for deadlock is not always correct, therefore test for continues deadlocks if (deadlockDetectCount >= lockSettings.getDeadlockDetectionThreshold()) { - log.debug("Deadlock detected from node " + myNodeId + ". VoteCandidatesMap=" - + voteCandidatesMap); + log.debug( + "Deadlock detected from node " + + myNodeId + + ". VoteCandidatesMap=" + + voteCandidatesMap); preventDeadLock(voteCandidatesMap); } } else { @@ -133,12 +144,17 @@ public class LockManager { // Generate Crdt lock message for voting private SharedDataMessage generateLockMessage(String key) { - VoteCandidate voteCandidate = new VoteCandidate(gossipManager.getMyself().getId(), key, - new ConcurrentHashMap<>()); - voteCandidate.addVote(new Vote(gossipManager.getMyself().getId(), true, false, + VoteCandidate voteCandidate = + new VoteCandidate(gossipManager.getMyself().getId(), key, new ConcurrentHashMap<>()); + voteCandidate.addVote( + new Vote( + gossipManager.getMyself().getId(), + true, + false, gossipManager.getLiveMembers().stream().map(Member::getId).collect(Collectors.toList()), - gossipManager.getDeadMembers().stream().map(Member::getId) - .collect(Collectors.toList()))); + gossipManager.getDeadMembers().stream() + .map(Member::getId) + .collect(Collectors.toList()))); Map voteCandidateMap = new ConcurrentHashMap<>(); voteCandidateMap.put(voteCandidate.getCandidateNodeId(), voteCandidate); MajorityVote majorityVote = new MajorityVote(voteCandidateMap); @@ -167,7 +183,8 @@ public class LockManager { String myVoteCandidate = getVotedCandidateNodeId(myNodeId, voteCandidateMap); if (myVoteCandidate == null) { - myVoteCandidate = lockSettings.getVoteSelector().getVoteCandidateId(voteCandidateMap.keySet()); + myVoteCandidate = + lockSettings.getVoteSelector().getVoteCandidateId(voteCandidateMap.keySet()); } for (VoteCandidate voteCandidate : voteCandidateMap.values()) { if (voteCandidate.getCandidateNodeId().equals(myNodeId)) { @@ -175,11 +192,17 @@ public class LockManager { } // Vote for selected candidate boolean voteResult = voteCandidate.getCandidateNodeId().equals(myVoteCandidate); - 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()))); + 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()))); } } } @@ -203,9 +226,13 @@ public class LockManager { numberOfLiveNodes = numberOfNodes.get(); } else { // numberOfNodes is not set by the user, therefore calculate it. - Set liveNodes = voteCandidates.values().stream() - .map(voteCandidate -> voteCandidate.getVotes().values()).flatMap(Collection::stream) - .map(Vote::getLiveMembers).flatMap(List::stream).collect(Collectors.toSet()); + Set liveNodes = + voteCandidates.values().stream() + .map(voteCandidate -> voteCandidate.getVotes().values()) + .flatMap(Collection::stream) + .map(Vote::getLiveMembers) + .flatMap(List::stream) + .collect(Collectors.toSet()); numberOfLiveNodes = liveNodes.size(); } for (VoteCandidate voteCandidate : voteCandidates.values()) { @@ -222,15 +249,17 @@ public class LockManager { return; } // Set of nodes that is going to receive this nodes votes - List donateCandidateIds = voteCandidates.keySet().stream() - .filter(s -> s.compareTo(myNodeId) < 0).collect(Collectors.toList()); + List donateCandidateIds = + voteCandidates.keySet().stream() + .filter(s -> s.compareTo(myNodeId) < 0) + .collect(Collectors.toList()); if (donateCandidateIds.size() == 0) { return; } // Select a random node to donate Random randomizer = new Random(); - String selectedCandidateId = donateCandidateIds - .get(randomizer.nextInt(donateCandidateIds.size())); + String selectedCandidateId = + donateCandidateIds.get(randomizer.nextInt(donateCandidateIds.size())); VoteCandidate selectedCandidate = voteCandidates.get(selectedCandidateId); Set myVotes = new HashSet<>(myResults.getVotes().values()); @@ -246,11 +275,11 @@ public class LockManager { } } } - log.debug("Node " + myNodeId + " give up votes to node " + selectedCandidateId); + log.debug("Node " + myNodeId + " give up votes to node " + selectedCandidateId); } - private String getVotedCandidateNodeId(String nodeId, - final Map voteCandidates) { + private String getVotedCandidateNodeId( + String nodeId, final Map voteCandidates) { for (VoteCandidate voteCandidate : voteCandidates.values()) { Vote vote = voteCandidate.getVotes().get(nodeId); if (vote != null && vote.getVoteValue()) { @@ -279,15 +308,17 @@ public class LockManager { return numberOfLiveNodes > 0 && voteCount >= (numberOfLiveNodes / 2 + 1); } - private String generateLockKey(String key){ + private String generateLockKey(String key) { return "lock/" + key; } - public void shutdown(){ + public void shutdown() { voteService.shutdown(); } + /** * Get the voted node id from this node for a given key + * * @param key key of the data object * @return Voted node id */ @@ -302,10 +333,10 @@ public class LockManager { /** * Set the number of live nodes. If this value is negative, live nodes will be calculated + * * @param numberOfNodes live node count or negative to calculate. */ public void setNumberOfNodes(int numberOfNodes) { this.numberOfNodes.set(numberOfNodes); } - } diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java index 24c506e..ceb5b19 100644 --- a/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java +++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/MajorityVote.java @@ -25,9 +25,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.gossip.crdt.Crdt; -/** - * CRDT which used for distribute a votes for a given key. - */ +/** CRDT which used for distribute a votes for a given key. */ public class MajorityVote implements Crdt, MajorityVote> { private final Map voteCandidates = new ConcurrentHashMap<>(); @@ -53,11 +51,13 @@ public class MajorityVote implements Crdt, MajorityVo } // Merge votes for the same candidate for (String sameCandidateId : sameCandidatesSet) { - if (this.voteCandidates.containsKey(sameCandidateId) && other.voteCandidates - .containsKey(sameCandidateId)) { - mergedCandidates.put(sameCandidateId, - mergeCandidate(this.voteCandidates.get(sameCandidateId), - other.voteCandidates.get(sameCandidateId))); + if (this.voteCandidates.containsKey(sameCandidateId) + && other.voteCandidates.containsKey(sameCandidateId)) { + mergedCandidates.put( + sameCandidateId, + mergeCandidate( + this.voteCandidates.get(sameCandidateId), + other.voteCandidates.get(sameCandidateId))); } } @@ -65,10 +65,13 @@ public class MajorityVote implements Crdt, MajorityVo } // Merge different votes for same candidate - private VoteCandidate mergeCandidate(VoteCandidate firstCandidate, - VoteCandidate secondCandidate) { - VoteCandidate mergeResult = new VoteCandidate(firstCandidate.getCandidateNodeId(), - firstCandidate.getVotingKey(), new ConcurrentHashMap<>()); + private VoteCandidate mergeCandidate( + VoteCandidate firstCandidate, VoteCandidate secondCandidate) { + VoteCandidate mergeResult = + new VoteCandidate( + firstCandidate.getCandidateNodeId(), + firstCandidate.getVotingKey(), + new ConcurrentHashMap<>()); Set firstKeySet = firstCandidate.getVotes().keySet(); Set secondKeySet = secondCandidate.getVotes().keySet(); Set sameVoteNodeSet = getIntersection(firstKeySet, secondKeySet); @@ -76,20 +79,26 @@ public class MajorityVote implements Crdt, MajorityVo // Merge different voters by combining their votes for (String differentCandidateId : differentVoteNodeSet) { if (firstCandidate.getVotes().containsKey(differentCandidateId)) { - mergeResult.getVotes() - .put(differentCandidateId, firstCandidate.getVotes().get(differentCandidateId)); + mergeResult + .getVotes() + .put(differentCandidateId, firstCandidate.getVotes().get(differentCandidateId)); } else if (secondCandidate.getVotes().containsKey(differentCandidateId)) { - mergeResult.getVotes() - .put(differentCandidateId, secondCandidate.getVotes().get(differentCandidateId)); + mergeResult + .getVotes() + .put(differentCandidateId, secondCandidate.getVotes().get(differentCandidateId)); } } // Merge vote for same voter for (String sameVoteNodeId : sameVoteNodeSet) { - if (firstCandidate.getVotes().containsKey(sameVoteNodeId) && secondCandidate.getVotes() - .containsKey(sameVoteNodeId)) { - mergeResult.getVotes().put(sameVoteNodeId, - mergeVote(firstCandidate.getVotes().get(sameVoteNodeId), - secondCandidate.getVotes().get(sameVoteNodeId))); + if (firstCandidate.getVotes().containsKey(sameVoteNodeId) + && secondCandidate.getVotes().containsKey(sameVoteNodeId)) { + mergeResult + .getVotes() + .put( + sameVoteNodeId, + mergeVote( + firstCandidate.getVotes().get(sameVoteNodeId), + secondCandidate.getVotes().get(sameVoteNodeId))); } } @@ -131,7 +140,6 @@ public class MajorityVote implements Crdt, MajorityVo Map copy = new ConcurrentHashMap<>(); copy.putAll(voteCandidates); return Collections.unmodifiableMap(copy); - } @Override @@ -141,12 +149,9 @@ public class MajorityVote implements Crdt, MajorityVo @Override public boolean equals(Object obj) { - if (obj == null) - return false; - if (obj == this) - return true; - if (!(obj instanceof MajorityVote)) - return false; + if (obj == null) return false; + if (obj == this) return true; + if (!(obj instanceof MajorityVote)) return false; MajorityVote other = (MajorityVote) obj; return Objects.equals(voteCandidates, other.voteCandidates); } @@ -164,5 +169,4 @@ public class MajorityVote implements Crdt, MajorityVo public Map getVoteCandidates() { return new ConcurrentHashMap<>(voteCandidates); } - } diff --git a/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java b/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java index bd147a6..487f705 100644 --- a/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java +++ b/gossip-base/src/main/java/org/apache/gossip/lock/vote/Vote.java @@ -19,9 +19,7 @@ package org.apache.gossip.lock.vote; import java.util.List; -/** - * Store a voter details. - */ +/** Store a voter details. */ public class Vote { private final String votingNode; private final Boolean voteValue; // TODO: 7/16/17 weight? @@ -29,8 +27,12 @@ public class Vote { private final List deadMembers; private Boolean voteExchange; - public Vote(String votingNode, Boolean voteValue, Boolean voteExchange, List liveMembers, - List deadMembers) { + public Vote( + String votingNode, + Boolean voteValue, + Boolean voteExchange, + List liveMembers, + List deadMembers) { this.votingNode = votingNode; this.voteValue = voteValue; this.voteExchange = voteExchange; @@ -64,7 +66,13 @@ public class Vote { @Override public String toString() { - return "votingNode=" + votingNode + ", voteValue=" + voteValue + ", liveMembers=" + liveMembers - + ", deadMembers= " + deadMembers; + return "votingNode=" + + votingNode + + ", voteValue=" + + voteValue + + ", liveMembers=" + + liveMembers + + ", deadMembers= " + + deadMembers; } } diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/AbstractActiveGossiper.java b/gossip-base/src/main/java/org/apache/gossip/manager/AbstractActiveGossiper.java index 5319d20..7cb2959 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/AbstractActiveGossiper.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/AbstractActiveGossiper.java @@ -38,7 +38,8 @@ import org.apache.gossip.model.ShutdownMessage; import org.apache.gossip.udp.*; /** - * The ActiveGossipThread sends information. Pick a random partner and send the membership list to that partner + * The ActiveGossipThread sends information. Pick a random partner and send the membership list to + * that partner */ @Slf4j public abstract class AbstractActiveGossiper { @@ -51,26 +52,26 @@ public abstract class AbstractActiveGossiper { private final Random random; private final GossipSettings gossipSettings; - public AbstractActiveGossiper(GossipManager gossipManager, GossipCore gossipCore, MetricRegistry registry) { + public AbstractActiveGossiper( + GossipManager gossipManager, GossipCore gossipCore, MetricRegistry registry) { this.gossipManager = gossipManager; this.gossipCore = gossipCore; - sharedDataHistogram = registry.histogram(name(AbstractActiveGossiper.class, "sharedDataHistogram-time")); - sendPerNodeDataHistogram = registry.histogram(name(AbstractActiveGossiper.class, "sendPerNodeDataHistogram-time")); - sendMembershipHistogram = registry.histogram(name(AbstractActiveGossiper.class, "sendMembershipHistogram-time")); + sharedDataHistogram = + registry.histogram(name(AbstractActiveGossiper.class, "sharedDataHistogram-time")); + sendPerNodeDataHistogram = + registry.histogram(name(AbstractActiveGossiper.class, "sendPerNodeDataHistogram-time")); + sendMembershipHistogram = + registry.histogram(name(AbstractActiveGossiper.class, "sendMembershipHistogram-time")); random = new Random(); gossipSettings = gossipManager.getSettings(); } - public void init() { + public void init() {} - } + public void shutdown() {} - public void shutdown() { - - } - - public final void sendShutdownMessage(LocalMember me, LocalMember target){ - if (target == null){ + public final void sendShutdownMessage(LocalMember me, LocalMember target) { + if (target == null) { return; } ShutdownMessage m = new ShutdownMessage(); @@ -94,8 +95,11 @@ public abstract class AbstractActiveGossiper { /** Send shared data one entry at a time. */ private void sendSharedDataInternal(LocalMember me, LocalMember member) { - for (Entry innerEntry : gossipCore.getSharedData().entrySet()){ - if (innerEntry.getValue().getReplicable() != null && !innerEntry.getValue().getReplicable() + for (Entry innerEntry : gossipCore.getSharedData().entrySet()) { + if (innerEntry.getValue().getReplicable() != null + && !innerEntry + .getValue() + .getReplicable() .shouldReplicate(me, member, innerEntry.getValue())) { continue; } @@ -113,7 +117,10 @@ public abstract class AbstractActiveGossiper { udpMessage.setUuid(UUID.randomUUID().toString()); udpMessage.setUriFrom(me.getId()); for (Entry innerEntry : gossipCore.getSharedData().entrySet()) { - if (innerEntry.getValue().getReplicable() != null && !innerEntry.getValue().getReplicable() + if (innerEntry.getValue().getReplicable() != null + && !innerEntry + .getValue() + .getReplicable() .shouldReplicate(me, member, innerEntry.getValue())) { continue; } @@ -141,8 +148,8 @@ public abstract class AbstractActiveGossiper { copy.setReplicable(original.getReplicable()); } - public final void sendPerNodeData(LocalMember me, LocalMember member){ - if (member == null){ + public final void sendPerNodeData(LocalMember me, LocalMember member) { + if (member == null) { return; } long startTime = System.currentTimeMillis(); @@ -156,9 +163,13 @@ public abstract class AbstractActiveGossiper { /** Send per node data one entry at a time. */ private void sendPerNodeDataInternal(LocalMember me, LocalMember member) { - for (Entry> entry : gossipCore.getPerNodeData().entrySet()){ - for (Entry innerEntry : entry.getValue().entrySet()){ - if (innerEntry.getValue().getReplicable() != null && !innerEntry.getValue().getReplicable() + for (Entry> entry : + gossipCore.getPerNodeData().entrySet()) { + for (Entry innerEntry : entry.getValue().entrySet()) { + if (innerEntry.getValue().getReplicable() != null + && !innerEntry + .getValue() + .getReplicable() .shouldReplicate(me, member, innerEntry.getValue())) { continue; } @@ -169,17 +180,20 @@ public abstract class AbstractActiveGossiper { gossipCore.sendOneWay(message, member.getUri()); } } - } /** Send per node data by batching together several entries. */ private void sendPerNodeDataInBulkInternal(LocalMember me, LocalMember member) { - for (Entry> entry : gossipCore.getPerNodeData().entrySet()){ + for (Entry> entry : + gossipCore.getPerNodeData().entrySet()) { UdpPerNodeDataBulkMessage udpMessage = new UdpPerNodeDataBulkMessage(); udpMessage.setUuid(UUID.randomUUID().toString()); udpMessage.setUriFrom(me.getId()); - for (Entry innerEntry : entry.getValue().entrySet()){ - if (innerEntry.getValue().getReplicable() != null && !innerEntry.getValue().getReplicable() + for (Entry innerEntry : entry.getValue().entrySet()) { + if (innerEntry.getValue().getReplicable() != null + && !innerEntry + .getValue() + .getReplicable() .shouldReplicate(me, member, innerEntry.getValue())) { continue; } @@ -208,11 +222,9 @@ public abstract class AbstractActiveGossiper { copy.setReplicable(original.getReplicable()); } - /** - * Performs the sending of the membership list, after we have incremented our own heartbeat. - */ + /** Performs the sending of the membership list, after we have incremented our own heartbeat. */ protected void sendMembershipList(LocalMember me, LocalMember member) { - if (member == null){ + if (member == null) { return; } long startTime = System.currentTimeMillis(); @@ -225,15 +237,15 @@ public abstract class AbstractActiveGossiper { message.getMembers().add(convert(other)); } Response r = gossipCore.send(message, member.getUri()); - if (r instanceof ActiveGossipOk){ - //maybe count metrics here + if (r instanceof ActiveGossipOk) { + // maybe count metrics here } else { log.debug("Message " + message + " generated response " + r); } sendMembershipHistogram.update(System.currentTimeMillis() - startTime); } - protected final Member convert(LocalMember member){ + protected final Member convert(LocalMember member) { Member gm = new Member(); gm.setCluster(member.getClusterName()); gm.setHeartbeat(member.getHeartbeat()); @@ -244,9 +256,7 @@ public abstract class AbstractActiveGossiper { } /** - * - * @param memberList - * An immutable list + * @param memberList An immutable list * @return The chosen LocalGossipMember to gossip with. */ protected LocalMember selectPartner(List memberList) { diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/DataReaper.java b/gossip-base/src/main/java/org/apache/gossip/manager/DataReaper.java index 28c3ddc..893ea17 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/DataReaper.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/DataReaper.java @@ -37,48 +37,50 @@ public class DataReaper { private final GossipCore gossipCore; private final ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); private final Clock clock; - - public DataReaper(GossipCore gossipCore, Clock clock){ + + public DataReaper(GossipCore gossipCore, Clock clock) { this.gossipCore = gossipCore; this.clock = clock; } - - public void init(){ - Runnable reapPerNodeData = () -> { - runPerNodeOnce(); - runSharedOnce(); - }; + + public void init() { + Runnable reapPerNodeData = + () -> { + runPerNodeOnce(); + runSharedOnce(); + }; scheduledExecutor.scheduleAtFixedRate(reapPerNodeData, 0, 5, TimeUnit.SECONDS); } - - void runSharedOnce(){ - for (Entry entry : gossipCore.getSharedData().entrySet()){ - if (entry.getValue().getExpireAt() < clock.currentTimeMillis()){ + + void runSharedOnce() { + for (Entry entry : gossipCore.getSharedData().entrySet()) { + if (entry.getValue().getExpireAt() < clock.currentTimeMillis()) { gossipCore.getSharedData().remove(entry.getKey(), entry.getValue()); } } } - - void runPerNodeOnce(){ - for (Entry> node : gossipCore.getPerNodeData().entrySet()){ + + void runPerNodeOnce() { + for (Entry> node : + gossipCore.getPerNodeData().entrySet()) { reapData(node.getValue()); } } - - void reapData(ConcurrentHashMap concurrentHashMap){ - for (Entry entry : concurrentHashMap.entrySet()){ - if (entry.getValue().getExpireAt() < clock.currentTimeMillis()){ + + void reapData(ConcurrentHashMap concurrentHashMap) { + for (Entry entry : concurrentHashMap.entrySet()) { + if (entry.getValue().getExpireAt() < clock.currentTimeMillis()) { concurrentHashMap.remove(entry.getKey(), entry.getValue()); } } } - - public void close(){ + + public void close() { scheduledExecutor.shutdown(); try { scheduledExecutor.awaitTermination(1, TimeUnit.SECONDS); } catch (InterruptedException e) { - + } } } diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/DatacenterRackAwareActiveGossiper.java b/gossip-base/src/main/java/org/apache/gossip/manager/DatacenterRackAwareActiveGossiper.java index 9d45221..7b2c95f 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/DatacenterRackAwareActiveGossiper.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/DatacenterRackAwareActiveGossiper.java @@ -31,11 +31,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.gossip.LocalMember; /** - * Sends gossip traffic at different rates to other racks and data-centers. - * This implementation controls the rate at which gossip traffic is shared. - * There are two constructs Datacenter and Rack. It is assumed that bandwidth and latency is higher - * in the rack than in the the datacenter. We can adjust the rate at which we send messages to each group. - * + * Sends gossip traffic at different rates to other racks and data-centers. This implementation + * controls the rate at which gossip traffic is shared. There are two constructs Datacenter and + * Rack. It is assumed that bandwidth and latency is higher in the rack than in the the datacenter. + * We can adjust the rate at which we send messages to each group. */ @Slf4j public class DatacenterRackAwareActiveGossiper extends AbstractActiveGossiper { @@ -49,125 +48,166 @@ public class DatacenterRackAwareActiveGossiper extends AbstractActiveGossiper { private int randomDeadMemberSendIntervalMs = 250; private ScheduledExecutorService scheduledExecutorService; private ThreadPoolExecutor threadService; - - public DatacenterRackAwareActiveGossiper(GossipManager gossipManager, GossipCore gossipCore, - MetricRegistry registry) { + + public DatacenterRackAwareActiveGossiper( + GossipManager gossipManager, GossipCore gossipCore, MetricRegistry registry) { super(gossipManager, gossipCore, registry); scheduledExecutorService = Executors.newScheduledThreadPool(2); workQueue = new ArrayBlockingQueue(1024); - threadService = new ThreadPoolExecutor(1, 30, 1, TimeUnit.SECONDS, workQueue, - new ThreadPoolExecutor.DiscardOldestPolicy()); + threadService = + new ThreadPoolExecutor( + 1, 30, 1, TimeUnit.SECONDS, workQueue, new ThreadPoolExecutor.DiscardOldestPolicy()); try { - sameRackGossipIntervalMs = Integer.parseInt(gossipManager.getSettings() - .getActiveGossipProperties().get("sameRackGossipIntervalMs")); - } catch (RuntimeException ex) { } + sameRackGossipIntervalMs = + Integer.parseInt( + gossipManager + .getSettings() + .getActiveGossipProperties() + .get("sameRackGossipIntervalMs")); + } catch (RuntimeException ex) { + } try { - sameDcGossipIntervalMs = Integer.parseInt(gossipManager.getSettings() - .getActiveGossipProperties().get("sameDcGossipIntervalMs")); - } catch (RuntimeException ex) { } + sameDcGossipIntervalMs = + Integer.parseInt( + gossipManager + .getSettings() + .getActiveGossipProperties() + .get("sameDcGossipIntervalMs")); + } catch (RuntimeException ex) { + } try { - differentDatacenterGossipIntervalMs = Integer.parseInt(gossipManager.getSettings() - .getActiveGossipProperties().get("differentDatacenterGossipIntervalMs")); - } catch (RuntimeException ex) { } + differentDatacenterGossipIntervalMs = + Integer.parseInt( + gossipManager + .getSettings() + .getActiveGossipProperties() + .get("differentDatacenterGossipIntervalMs")); + } catch (RuntimeException ex) { + } try { - randomDeadMemberSendIntervalMs = Integer.parseInt(gossipManager.getSettings() - .getActiveGossipProperties().get("randomDeadMemberSendIntervalMs")); - } catch (RuntimeException ex) { } + randomDeadMemberSendIntervalMs = + Integer.parseInt( + gossipManager + .getSettings() + .getActiveGossipProperties() + .get("randomDeadMemberSendIntervalMs")); + } catch (RuntimeException ex) { + } } @Override public void init() { super.init(); - //same rack - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sendToSameRackMember()), - 0, sameRackGossipIntervalMs, TimeUnit.MILLISECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sendToSameRackMemberPerNode()), - 0, sameRackGossipIntervalMs, TimeUnit.MILLISECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sendToSameRackShared()), - 0, sameRackGossipIntervalMs, TimeUnit.MILLISECONDS); - - //same dc different rack - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sameDcDiffernetRackMember()), - 0, sameDcGossipIntervalMs, TimeUnit.MILLISECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sameDcDiffernetRackPerNode()), - 0, sameDcGossipIntervalMs, TimeUnit.MILLISECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sameDcDiffernetRackShared()), - 0, sameDcGossipIntervalMs, TimeUnit.MILLISECONDS); - - //different dc - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> differentDcMember()), - 0, differentDatacenterGossipIntervalMs, TimeUnit.MILLISECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> differentDcPerNode()), - 0, differentDatacenterGossipIntervalMs, TimeUnit.MILLISECONDS); - - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> differentDcShared()), - 0, differentDatacenterGossipIntervalMs, TimeUnit.MILLISECONDS); - - //the dead - scheduledExecutorService.scheduleAtFixedRate(() -> - threadService.execute(() -> sendToDeadMember()), - 0, randomDeadMemberSendIntervalMs, TimeUnit.MILLISECONDS); - + // same rack + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sendToSameRackMember()), + 0, + sameRackGossipIntervalMs, + TimeUnit.MILLISECONDS); + + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sendToSameRackMemberPerNode()), + 0, + sameRackGossipIntervalMs, + TimeUnit.MILLISECONDS); + + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sendToSameRackShared()), + 0, + sameRackGossipIntervalMs, + TimeUnit.MILLISECONDS); + + // same dc different rack + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sameDcDiffernetRackMember()), + 0, + sameDcGossipIntervalMs, + TimeUnit.MILLISECONDS); + + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sameDcDiffernetRackPerNode()), + 0, + sameDcGossipIntervalMs, + TimeUnit.MILLISECONDS); + + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sameDcDiffernetRackShared()), + 0, + sameDcGossipIntervalMs, + TimeUnit.MILLISECONDS); + + // different dc + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> differentDcMember()), + 0, + differentDatacenterGossipIntervalMs, + TimeUnit.MILLISECONDS); + + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> differentDcPerNode()), + 0, + differentDatacenterGossipIntervalMs, + TimeUnit.MILLISECONDS); + + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> differentDcShared()), + 0, + differentDatacenterGossipIntervalMs, + TimeUnit.MILLISECONDS); + + // the dead + scheduledExecutorService.scheduleAtFixedRate( + () -> threadService.execute(() -> sendToDeadMember()), + 0, + randomDeadMemberSendIntervalMs, + TimeUnit.MILLISECONDS); } private void sendToDeadMember() { sendMembershipList(gossipManager.getMyself(), selectPartner(gossipManager.getDeadMembers())); } - - private List differentDataCenter(){ + + private List differentDataCenter() { String myDc = gossipManager.getMyself().getProperties().get(DATACENTER); String rack = gossipManager.getMyself().getProperties().get(RACK); - if (myDc == null|| rack == null){ + if (myDc == null || rack == null) { return Collections.emptyList(); } List notMyDc = new ArrayList(10); - for (LocalMember i : gossipManager.getLiveMembers()){ - if (!myDc.equals(i.getProperties().get(DATACENTER))){ + for (LocalMember i : gossipManager.getLiveMembers()) { + if (!myDc.equals(i.getProperties().get(DATACENTER))) { notMyDc.add(i); } } return notMyDc; } - - private List sameDatacenterDifferentRack(){ + + private List sameDatacenterDifferentRack() { String myDc = gossipManager.getMyself().getProperties().get(DATACENTER); String rack = gossipManager.getMyself().getProperties().get(RACK); - if (myDc == null|| rack == null){ + if (myDc == null || rack == null) { return Collections.emptyList(); } List notMyDc = new ArrayList(10); - for (LocalMember i : gossipManager.getLiveMembers()){ - if (myDc.equals(i.getProperties().get(DATACENTER)) && !rack.equals(i.getProperties().get(RACK))){ + for (LocalMember i : gossipManager.getLiveMembers()) { + if (myDc.equals(i.getProperties().get(DATACENTER)) + && !rack.equals(i.getProperties().get(RACK))) { notMyDc.add(i); } } return notMyDc; } - - private List sameRackNodes(){ + + private List sameRackNodes() { String myDc = gossipManager.getMyself().getProperties().get(DATACENTER); String rack = gossipManager.getMyself().getProperties().get(RACK); - if (myDc == null|| rack == null){ + if (myDc == null || rack == null) { return Collections.emptyList(); } List sameDcAndRack = new ArrayList(10); - for (LocalMember i : gossipManager.getLiveMembers()){ + for (LocalMember i : gossipManager.getLiveMembers()) { if (myDc.equals(i.getProperties().get(DATACENTER)) - && rack.equals(i.getProperties().get(RACK))){ + && rack.equals(i.getProperties().get(RACK))) { sameDcAndRack.add(i); } } @@ -178,39 +218,39 @@ public class DatacenterRackAwareActiveGossiper extends AbstractActiveGossiper { LocalMember i = selectPartner(sameRackNodes()); sendMembershipList(gossipManager.getMyself(), i); } - + private void sendToSameRackMemberPerNode() { sendPerNodeData(gossipManager.getMyself(), selectPartner(sameRackNodes())); } - + private void sendToSameRackShared() { sendSharedData(gossipManager.getMyself(), selectPartner(sameRackNodes())); } - + private void differentDcMember() { sendMembershipList(gossipManager.getMyself(), selectPartner(differentDataCenter())); } - + private void differentDcPerNode() { sendPerNodeData(gossipManager.getMyself(), selectPartner(differentDataCenter())); } - + private void differentDcShared() { sendSharedData(gossipManager.getMyself(), selectPartner(differentDataCenter())); } - + private void sameDcDiffernetRackMember() { sendMembershipList(gossipManager.getMyself(), selectPartner(sameDatacenterDifferentRack())); } - + private void sameDcDiffernetRackPerNode() { sendPerNodeData(gossipManager.getMyself(), selectPartner(sameDatacenterDifferentRack())); } - + private void sameDcDiffernetRackShared() { sendSharedData(gossipManager.getMyself(), selectPartner(sameDatacenterDifferentRack())); } - + @Override public void shutdown() { super.shutdown(); @@ -228,11 +268,9 @@ public class DatacenterRackAwareActiveGossiper extends AbstractActiveGossiper { log.debug("Issue during shutdown", e); } } - - /** - * sends an optimistic shutdown message to several clusters nodes - */ - protected void sendShutdownMessage(){ + + /** sends an optimistic shutdown message to several clusters nodes */ + protected void sendShutdownMessage() { List l = gossipManager.getLiveMembers(); int sendTo = l.size() < 3 ? 1 : l.size() / 3; for (int i = 0; i < sendTo; i++) { diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/GossipCore.java b/gossip-base/src/main/java/org/apache/gossip/manager/GossipCore.java index baa8fbb..f45b814 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/GossipCore.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/GossipCore.java @@ -45,38 +45,41 @@ import org.apache.gossip.udp.Trackable; public class GossipCore implements GossipCoreConstants { private final GossipManager gossipManager; + @Getter - private final ConcurrentHashMap> perNodeData; - @Getter - private final ConcurrentHashMap sharedData; + private final ConcurrentHashMap> + perNodeData; + + @Getter private final ConcurrentHashMap sharedData; private final Meter messageSerdeException; private final Meter transmissionException; private final Meter transmissionSuccess; private final DataEventManager eventManager; - private ConcurrentHashMap requests; - public GossipCore(GossipManager manager, MetricRegistry metrics){ + private final ConcurrentHashMap requests; + + public GossipCore(GossipManager manager, MetricRegistry metrics) { this.gossipManager = manager; requests = new ConcurrentHashMap<>(); perNodeData = new ConcurrentHashMap<>(); sharedData = new ConcurrentHashMap<>(); eventManager = new DataEventManager(metrics); - metrics.register(PER_NODE_DATA_SIZE, (Gauge)() -> perNodeData.size()); - metrics.register(SHARED_DATA_SIZE, (Gauge)() -> sharedData.size()); - metrics.register(REQUEST_SIZE, (Gauge)() -> requests.size()); + metrics.register(PER_NODE_DATA_SIZE, (Gauge) perNodeData::size); + metrics.register(SHARED_DATA_SIZE, (Gauge) sharedData::size); + metrics.register(REQUEST_SIZE, (Gauge) requests::size); messageSerdeException = metrics.meter(MESSAGE_SERDE_EXCEPTION); transmissionException = metrics.meter(MESSAGE_TRANSMISSION_EXCEPTION); transmissionSuccess = metrics.meter(MESSAGE_TRANSMISSION_SUCCESS); } - - @SuppressWarnings({ "unchecked", "rawtypes" }) + + @SuppressWarnings({"unchecked", "rawtypes"}) public void addSharedData(SharedDataMessage message) { - while (true){ + while (true) { SharedDataMessage previous = sharedData.putIfAbsent(message.getKey(), message); - if (previous == null){ + if (previous == null) { eventManager.notifySharedData(message.getKey(), message.getPayload(), null); return; } - if (message.getPayload() instanceof Crdt){ + if (message.getPayload() instanceof Crdt) { SharedDataMessage merged = new SharedDataMessage(); merged.setExpireAt(message.getExpireAt()); merged.setKey(message.getKey()); @@ -85,18 +88,19 @@ public class GossipCore implements GossipCoreConstants { Crdt mergedCrdt = ((Crdt) previous.getPayload()).merge((Crdt) message.getPayload()); merged.setPayload(mergedCrdt); boolean replaced = sharedData.replace(message.getKey(), previous, merged); - if (replaced){ - if(!merged.getPayload().equals(previous.getPayload())) { - eventManager - .notifySharedData(message.getKey(), merged.getPayload(), previous.getPayload()); + if (replaced) { + if (!merged.getPayload().equals(previous.getPayload())) { + eventManager.notifySharedData( + message.getKey(), merged.getPayload(), previous.getPayload()); } return; } } else { - if (previous.getTimestamp() < message.getTimestamp()){ + if (previous.getTimestamp() < message.getTimestamp()) { boolean result = sharedData.replace(message.getKey(), previous, message); - if (result){ - eventManager.notifySharedData(message.getKey(), message.getPayload(), previous.getPayload()); + if (result) { + eventManager.notifySharedData( + message.getKey(), message.getPayload(), previous.getPayload()); return; } } else { @@ -106,29 +110,30 @@ public class GossipCore implements GossipCoreConstants { } } - public void addPerNodeData(PerNodeDataMessage message){ - ConcurrentHashMap nodeMap = new ConcurrentHashMap<>(); + public void addPerNodeData(PerNodeDataMessage message) { + ConcurrentHashMap nodeMap = new ConcurrentHashMap<>(); nodeMap.put(message.getKey(), message); nodeMap = perNodeData.putIfAbsent(message.getNodeId(), nodeMap); - if (nodeMap != null){ + if (nodeMap != null) { PerNodeDataMessage current = nodeMap.get(message.getKey()); - if (current == null){ + if (current == null) { nodeMap.putIfAbsent(message.getKey(), message); - eventManager.notifyPerNodeData(message.getNodeId(), message.getKey(), message.getPayload(), null); + eventManager.notifyPerNodeData( + message.getNodeId(), message.getKey(), message.getPayload(), null); } else { - if (current.getTimestamp() < message.getTimestamp()){ + if (current.getTimestamp() < message.getTimestamp()) { nodeMap.replace(message.getKey(), current, message); - eventManager.notifyPerNodeData(message.getNodeId(), message.getKey(), message.getPayload(), - current.getPayload()); + eventManager.notifyPerNodeData( + message.getNodeId(), message.getKey(), message.getPayload(), current.getPayload()); } } } else { - eventManager.notifyPerNodeData(message.getNodeId(), message.getKey(), message.getPayload(), null); + eventManager.notifyPerNodeData( + message.getNodeId(), message.getKey(), message.getPayload(), null); } } - public void shutdown(){ - } + public void shutdown() {} public void receive(Base base) { if (!gossipManager.getMessageHandler().invoke(this, gossipManager, base)) { @@ -137,8 +142,8 @@ public class GossipCore implements GossipCoreConstants { } /** - * Sends a blocking message. - * todo: move functionality to TransportManager layer. + * Sends a blocking message. todo: move functionality to TransportManager layer. + * * @param message * @param uri * @throws RuntimeException if data can not be serialized or in transmission error @@ -160,13 +165,13 @@ public class GossipCore implements GossipCoreConstants { } } - public Response send(Base message, URI uri){ - log.debug("Sending " + message); - log.debug("Current request queue " + requests); + public Response send(Base message, URI uri) { + log.debug("Sending " + message); + log.debug("Current request queue " + requests); final Trackable t; LatchAndBase latchAndBase = null; - if (message instanceof Trackable){ + if (message instanceof Trackable) { t = (Trackable) message; latchAndBase = new LatchAndBase(); requests.put(t.getUuid() + "/" + t.getUriFrom(), latchAndBase); @@ -174,27 +179,28 @@ public class GossipCore implements GossipCoreConstants { t = null; } sendInternal(message, uri); - if (latchAndBase == null){ + if (latchAndBase == null) { return null; } try { boolean complete = latchAndBase.latch.await(1, TimeUnit.SECONDS); - if (complete){ + if (complete) { return (Response) latchAndBase.base; - } else{ + } else { return null; } } catch (InterruptedException e) { throw new RuntimeException(e); } finally { - requests.remove(t.getUuid() + "/" + t.getUriFrom()); + requests.remove(t.getUuid() + "/" + t.getUriFrom()); } } /** - * Sends a message across the network while blocking. Catches and ignores IOException in transmission. Used - * when the protocol for the message is not to wait for a response + * Sends a message across the network while blocking. Catches and ignores IOException in + * transmission. Used when the protocol for the message is not to wait for a response + * * @param message the message to send * @param u the uri to send it to */ @@ -217,10 +223,9 @@ public class GossipCore implements GossipCoreConstants { * * @param senderMember * @param remoteList - * */ public void mergeLists(RemoteMember senderMember, List remoteList) { - if (log.isDebugEnabled()){ + if (log.isDebugEnabled()) { debugState(senderMember, remoteList); } for (LocalMember i : gossipManager.getDeadMembers()) { @@ -228,26 +233,28 @@ public class GossipCore implements GossipCoreConstants { log.debug(gossipManager.getMyself() + " contacted by dead member " + senderMember.getUri()); i.recordHeartbeat(senderMember.getHeartbeat()); i.setHeartbeat(senderMember.getHeartbeat()); - //TODO consider forcing an UP here + // TODO consider forcing an UP here } } for (Member remoteMember : remoteList) { if (remoteMember.getId().equals(gossipManager.getMyself().getId())) { continue; } - LocalMember aNewMember = new LocalMember(remoteMember.getClusterName(), - remoteMember.getUri(), - remoteMember.getId(), - remoteMember.getHeartbeat(), - remoteMember.getProperties(), - gossipManager.getSettings().getWindowSize(), - gossipManager.getSettings().getMinimumSamples(), - gossipManager.getSettings().getDistribution()); + LocalMember aNewMember = + new LocalMember( + remoteMember.getClusterName(), + remoteMember.getUri(), + remoteMember.getId(), + 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 : gossipManager.getMembers().entrySet()){ - if (localMember.getKey().getId().equals(remoteMember.getId())){ + if (result != null) { + for (Entry localMember : gossipManager.getMembers().entrySet()) { + if (localMember.getKey().getId().equals(remoteMember.getId())) { localMember.getKey().recordHeartbeat(remoteMember.getHeartbeat()); localMember.getKey().setHeartbeat(remoteMember.getHeartbeat()); localMember.getKey().setProperties(remoteMember.getProperties()); @@ -255,28 +262,37 @@ public class GossipCore implements GossipCoreConstants { } } } - if (log.isDebugEnabled()){ + if (log.isDebugEnabled()) { debugState(senderMember, remoteList); } } - private void debugState(RemoteMember senderMember, - List remoteList){ + private void debugState(RemoteMember senderMember, List remoteList) { log.warn( - "-----------------------\n" + - "Me " + gossipManager.getMyself() + "\n" + - "Sender " + senderMember + "\n" + - "RemoteList " + remoteList + "\n" + - "Live " + gossipManager.getLiveMembers()+ "\n" + - "Dead " + gossipManager.getDeadMembers()+ "\n" + - "======================="); + "-----------------------\n" + + "Me " + + gossipManager.getMyself() + + "\n" + + "Sender " + + senderMember + + "\n" + + "RemoteList " + + remoteList + + "\n" + + "Live " + + gossipManager.getLiveMembers() + + "\n" + + "Dead " + + gossipManager.getDeadMembers() + + "\n" + + "======================="); } @SuppressWarnings("rawtypes") public Crdt merge(SharedDataMessage message) { - for (;;){ + for (; ; ) { SharedDataMessage previous = sharedData.putIfAbsent(message.getKey(), message); - if (previous == null){ + if (previous == null) { return (Crdt) message.getPayload(); } SharedDataMessage copy = new SharedDataMessage(); @@ -288,35 +304,34 @@ public class GossipCore implements GossipCoreConstants { Crdt merged = ((Crdt) previous.getPayload()).merge((Crdt) message.getPayload()); copy.setPayload(merged); boolean replaced = sharedData.replace(message.getKey(), previous, copy); - if (replaced){ + if (replaced) { return merged; } } } - void registerPerNodeDataSubscriber(UpdateNodeDataEventHandler handler){ + void registerPerNodeDataSubscriber(UpdateNodeDataEventHandler handler) { eventManager.registerPerNodeDataSubscriber(handler); } - - void registerSharedDataSubscriber(UpdateSharedDataEventHandler handler){ + + void registerSharedDataSubscriber(UpdateSharedDataEventHandler handler) { eventManager.registerSharedDataSubscriber(handler); } - - void unregisterPerNodeDataSubscriber(UpdateNodeDataEventHandler handler){ + + void unregisterPerNodeDataSubscriber(UpdateNodeDataEventHandler handler) { eventManager.unregisterPerNodeDataSubscriber(handler); } - - void unregisterSharedDataSubscriber(UpdateSharedDataEventHandler handler){ + + void unregisterSharedDataSubscriber(UpdateSharedDataEventHandler handler) { eventManager.unregisterSharedDataSubscriber(handler); } - - class LatchAndBase { + + static class LatchAndBase { private final CountDownLatch latch; private volatile Base base; - LatchAndBase(){ + LatchAndBase() { latch = new CountDownLatch(1); } - } } diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java b/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java index 3e1b0f3..dadce79 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/GossipManager.java @@ -56,15 +56,16 @@ import org.apache.gossip.utils.ReflectionUtils; @Slf4j public class GossipManager { - // this mapper is used for ring and user-data persistence only. NOT messages. - public static final ObjectMapper metdataObjectMapper = new ObjectMapper() { - @Serial - private static final long serialVersionUID = 1L; - { - enableDefaultTyping(); - configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, false); - }}; + public static final ObjectMapper metdataObjectMapper = + new ObjectMapper() { + @Serial private static final long serialVersionUID = 1L; + + { + enableDefaultTyping(); + configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, false); + } + }; private final ConcurrentSkipListMap members; private final LocalMember me; @@ -83,27 +84,47 @@ public class GossipManager { private TransportManager transportManager; private ProtocolManager protocolManager; - public GossipManager(String cluster, - URI uri, String id, Map properties, GossipSettings settings, - List gossipMembers, GossipListener listener, MetricRegistry registry, - MessageHandler messageHandler) { + public GossipManager( + String cluster, + URI uri, + String id, + Map properties, + GossipSettings settings, + List gossipMembers, + GossipListener listener, + MetricRegistry registry, + MessageHandler messageHandler) { this.settings = settings; this.messageHandler = messageHandler; clock = new SystemClock(); - me = new LocalMember(cluster, uri, id, clock.nanoTime(), properties, - settings.getWindowSize(), settings.getMinimumSamples(), settings.getDistribution()); + me = + new LocalMember( + cluster, + uri, + id, + clock.nanoTime(), + properties, + settings.getWindowSize(), + settings.getMinimumSamples(), + settings.getDistribution()); gossipCore = new GossipCore(this, registry); this.lockManager = new LockManager(this, settings.getLockManagerSettings(), registry); dataReaper = new DataReaper(gossipCore, clock); members = new ConcurrentSkipListMap<>(); for (Member startupMember : gossipMembers) { if (!startupMember.equals(me)) { - LocalMember member = new LocalMember(startupMember.getClusterName(), - startupMember.getUri(), startupMember.getId(), - clock.nanoTime(), startupMember.getProperties(), settings.getWindowSize(), - settings.getMinimumSamples(), settings.getDistribution()); - //TODO should members start in down state? + LocalMember member = + new LocalMember( + startupMember.getClusterName(), + startupMember.getUri(), + startupMember.getId(), + clock.nanoTime(), + startupMember.getProperties(), + settings.getWindowSize(), + settings.getMinimumSamples(), + settings.getDistribution()); + // TODO should members start in down state? members.put(member, GossipState.DOWN); } } @@ -111,28 +132,45 @@ public class GossipManager { this.scheduledServiced = Executors.newScheduledThreadPool(1); this.registry = registry; this.ringState = new RingStatePersister(GossipManager.buildRingStatePath(this), this); - this.userDataState = new UserDataPersister( - gossipCore, - GossipManager.buildPerNodeDataPath(this), - GossipManager.buildSharedDataPath(this)); - this.memberStateRefresher = new GossipMemberStateRefresher(members, settings, listener, this::findPerNodeGossipData); + this.userDataState = + new UserDataPersister( + gossipCore, + GossipManager.buildPerNodeDataPath(this), + GossipManager.buildSharedDataPath(this)); + this.memberStateRefresher = + new GossipMemberStateRefresher(members, settings, listener, this::findPerNodeGossipData); readSavedRingState(); readSavedDataState(); } public static File buildRingStatePath(GossipManager manager) { - return new File(manager.getSettings().getPathToRingState(), "ringstate." + manager.getMyself().getClusterName() + "." - + manager.getMyself().getId() + ".json"); + return new File( + manager.getSettings().getPathToRingState(), + "ringstate." + + manager.getMyself().getClusterName() + + "." + + manager.getMyself().getId() + + ".json"); } - public static File buildSharedDataPath(GossipManager manager){ - return new File(manager.getSettings().getPathToDataState(), "shareddata." - + manager.getMyself().getClusterName() + "." + manager.getMyself().getId() + ".json"); + public static File buildSharedDataPath(GossipManager manager) { + return new File( + manager.getSettings().getPathToDataState(), + "shareddata." + + manager.getMyself().getClusterName() + + "." + + manager.getMyself().getId() + + ".json"); } public static File buildPerNodeDataPath(GossipManager manager) { - return new File(manager.getSettings().getPathToDataState(), "pernodedata." - + manager.getMyself().getClusterName() + "." + manager.getMyself().getId() + ".json"); + return new File( + manager.getSettings().getPathToDataState(), + "pernodedata." + + manager.getMyself().getClusterName() + + "." + + manager.getMyself().getId() + + ".json"); } public MessageHandler getMessageHandler() { @@ -152,22 +190,21 @@ public class GossipManager { */ public List getDeadMembers() { return Collections.unmodifiableList( - members.entrySet() - .stream() - .filter(entry -> GossipState.DOWN.equals(entry.getValue())) - .map(Entry::getKey).collect(Collectors.toList())); + members.entrySet().stream() + .filter(entry -> GossipState.DOWN.equals(entry.getValue())) + .map(Entry::getKey) + .collect(Collectors.toList())); } - + /** - * * @return a read only list of members found in the UP state */ public List getLiveMembers() { return Collections.unmodifiableList( - members.entrySet() - .stream() - .filter(entry -> GossipState.UP.equals(entry.getValue())) - .map(Entry::getKey).collect(Collectors.toList())); + members.entrySet().stream() + .filter(entry -> GossipState.UP.equals(entry.getValue())) + .map(Entry::getKey) + .collect(Collectors.toList())); } public LocalMember getMyself() { @@ -183,17 +220,17 @@ public class GossipManager { // protocol manager and transport managers are specified in settings. // construct them here via reflection. - protocolManager = ReflectionUtils.constructWithReflection( - settings.getProtocolManagerClass(), - new Class[] { GossipSettings.class, String.class, MetricRegistry.class }, - new Object[] { settings, me.getId(), this.getRegistry() } - ); + protocolManager = + ReflectionUtils.constructWithReflection( + settings.getProtocolManagerClass(), + new Class[] {GossipSettings.class, String.class, MetricRegistry.class}, + new Object[] {settings, me.getId(), this.getRegistry()}); - transportManager = ReflectionUtils.constructWithReflection( - settings.getTransportManagerClass(), - new Class[] { GossipManager.class, GossipCore.class}, - new Object[] { this, gossipCore } - ); + transportManager = + ReflectionUtils.constructWithReflection( + settings.getTransportManagerClass(), + new Class[] {GossipManager.class, GossipCore.class}, + new Object[] {this, gossipCore}); // start processing gossip messages. transportManager.startEndpoint(); @@ -213,10 +250,16 @@ public class GossipManager { 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()); + 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); } } @@ -224,7 +267,8 @@ public class GossipManager { private void readSavedDataState() { if (settings.isPersistDataState()) { - for (Entry> l : userDataState.readPerNodeFromDisk().entrySet()) { + for (Entry> l : + userDataState.readPerNodeFromDisk().entrySet()) { for (Entry j : l.getValue().entrySet()) { gossipCore.addPerNodeData(j.getValue()); } @@ -237,9 +281,7 @@ public class GossipManager { } } - /** - * Shutdown the gossip service. - */ + /** Shutdown the gossip service. */ public void shutdown() { gossipServiceRunning.set(false); lockManager.shutdown(); @@ -256,7 +298,7 @@ public class GossipManager { scheduledServiced.shutdownNow(); } - public void gossipPerNodeData(PerNodeDataMessage message){ + public void gossipPerNodeData(PerNodeDataMessage message) { Objects.nonNull(message.getKey()); Objects.nonNull(message.getTimestamp()); Objects.nonNull(message.getPayload()); @@ -264,7 +306,7 @@ public class GossipManager { gossipCore.addPerNodeData(message); } - public void gossipSharedData(SharedDataMessage message){ + public void gossipSharedData(SharedDataMessage message) { Objects.nonNull(message.getKey()); Objects.nonNull(message.getTimestamp()); Objects.nonNull(message.getPayload()); @@ -273,12 +315,12 @@ public class GossipManager { } @SuppressWarnings("rawtypes") - public Crdt findCrdt(String key){ + public Crdt findCrdt(String key) { SharedDataMessage l = gossipCore.getSharedData().get(key); - if (l == null){ + if (l == null) { return null; } - if (l.getExpireAt() < clock.currentTimeMillis()){ + if (l.getExpireAt() < clock.currentTimeMillis()) { return null; } else { return (Crdt) l.getPayload(); @@ -286,24 +328,24 @@ public class GossipManager { } @SuppressWarnings("rawtypes") - public Crdt merge(SharedDataMessage message){ + public Crdt merge(SharedDataMessage message) { Objects.nonNull(message.getKey()); Objects.nonNull(message.getTimestamp()); Objects.nonNull(message.getPayload()); message.setNodeId(me.getId()); - if (! (message.getPayload() instanceof Crdt)){ + if (!(message.getPayload() instanceof Crdt)) { throw new IllegalArgumentException("Not a subclass of CRDT " + message.getPayload()); } return gossipCore.merge(message); } - public PerNodeDataMessage findPerNodeGossipData(String nodeId, String key){ + public PerNodeDataMessage findPerNodeGossipData(String nodeId, String key) { ConcurrentHashMap j = gossipCore.getPerNodeData().get(nodeId); - if (j == null){ + if (j == null) { return null; } else { PerNodeDataMessage l = j.get(key); - if (l == null){ + if (l == null) { return null; } if (l.getExpireAt() != null && l.getExpireAt() < clock.currentTimeMillis()) { @@ -313,12 +355,12 @@ public class GossipManager { } } - public SharedDataMessage findSharedGossipData(String key){ + public SharedDataMessage findSharedGossipData(String key) { SharedDataMessage l = gossipCore.getSharedData().get(key); - if (l == null){ + if (l == null) { return null; } - if (l.getExpireAt() < clock.currentTimeMillis()){ + if (l.getExpireAt() < clock.currentTimeMillis()) { return null; } else { return l; @@ -344,34 +386,34 @@ public class GossipManager { public Clock getClock() { return clock; } - + // todo: consider making these path methods part of GossipSettings - + public MetricRegistry getRegistry() { return registry; } - + public ProtocolManager getProtocolManager() { return protocolManager; } - + public TransportManager getTransportManager() { return transportManager; } - - public void registerPerNodeDataSubscriber(UpdateNodeDataEventHandler handler){ + + public void registerPerNodeDataSubscriber(UpdateNodeDataEventHandler handler) { gossipCore.registerPerNodeDataSubscriber(handler); } - - public void registerSharedDataSubscriber(UpdateSharedDataEventHandler handler){ + + public void registerSharedDataSubscriber(UpdateSharedDataEventHandler handler) { gossipCore.registerSharedDataSubscriber(handler); } - - public void unregisterPerNodeDataSubscriber(UpdateNodeDataEventHandler handler){ + + public void unregisterPerNodeDataSubscriber(UpdateNodeDataEventHandler handler) { gossipCore.unregisterPerNodeDataSubscriber(handler); } - - public void unregisterSharedDataSubscriber(UpdateSharedDataEventHandler handler){ + + public void unregisterSharedDataSubscriber(UpdateSharedDataEventHandler handler) { gossipCore.unregisterSharedDataSubscriber(handler); } @@ -381,6 +423,7 @@ public class GossipManager { /** * Get the lock manager specified with this GossipManager. + * * @return lock manager object. */ public LockManager getLockManager() { @@ -389,10 +432,11 @@ public class GossipManager { /** * Try to acquire a lock on given shared data key. + * * @param key key of tha share data object. * @throws VoteFailedException if the locking is failed. */ - public void acquireSharedDataLock(String key) throws VoteFailedException{ + public void acquireSharedDataLock(String key) throws VoteFailedException { lockManager.acquireSharedDataLock(key); } } diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/GossipManagerBuilder.java b/gossip-base/src/main/java/org/apache/gossip/manager/GossipManagerBuilder.java index eec835a..5b66a2a 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/GossipManagerBuilder.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/GossipManagerBuilder.java @@ -18,19 +18,17 @@ package org.apache.gossip.manager; import com.codahale.metrics.MetricRegistry; -import org.apache.gossip.GossipSettings; -import org.apache.gossip.Member; -import org.apache.gossip.StartupSettings; -import org.apache.gossip.event.GossipListener; -import org.apache.gossip.event.GossipState; -import org.apache.gossip.manager.handlers.MessageHandler; -import org.apache.gossip.manager.handlers.MessageHandlerFactory; - import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.gossip.GossipSettings; +import org.apache.gossip.Member; +import org.apache.gossip.StartupSettings; +import org.apache.gossip.event.GossipListener; +import org.apache.gossip.manager.handlers.MessageHandler; +import org.apache.gossip.manager.handlers.MessageHandlerFactory; public class GossipManagerBuilder { diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/GossipMemberStateRefresher.java b/gossip-base/src/main/java/org/apache/gossip/manager/GossipMemberStateRefresher.java index b79bfd8..ef25ec9 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/GossipMemberStateRefresher.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/GossipMemberStateRefresher.java @@ -43,17 +43,20 @@ public class GossipMemberStateRefresher { private final ScheduledExecutorService scheduledExecutor; private final BlockingQueue workQueue; - public GossipMemberStateRefresher(Map members, GossipSettings settings, - GossipListener listener, - BiFunction findPerNodeGossipData) { + public GossipMemberStateRefresher( + Map members, + GossipSettings settings, + GossipListener listener, + BiFunction findPerNodeGossipData) { this.members = members; this.settings = settings; listeners.add(listener); this.findPerNodeGossipData = findPerNodeGossipData; clock = new SystemClock(); workQueue = new ArrayBlockingQueue<>(1024); - listenerExecutor = new ThreadPoolExecutor(1, 20, 1, TimeUnit.SECONDS, workQueue, - new ThreadPoolExecutor.DiscardOldestPolicy()); + listenerExecutor = + new ThreadPoolExecutor( + 1, 20, 1, TimeUnit.SECONDS, workQueue, new ThreadPoolExecutor.DiscardOldestPolicy()); scheduledExecutor = Executors.newScheduledThreadPool(1); } @@ -72,8 +75,7 @@ public class GossipMemberStateRefresher { public void runOnce() { for (Entry entry : members.entrySet()) { boolean userDown = processOptimisticShutdown(entry); - if (userDown) - continue; + if (userDown) continue; Double phiMeasure = entry.getKey().detect(clock.nanoTime()); GossipState requiredState; @@ -87,17 +89,15 @@ public class GossipMemberStateRefresher { if (entry.getValue() != requiredState) { members.put(entry.getKey(), requiredState); /* Call listeners asynchronously */ - for (GossipListener listener: listeners) + for (GossipListener listener : listeners) listenerExecutor.execute(() -> listener.gossipEvent(entry.getKey(), requiredState)); } } } public GossipState calcRequiredState(Double phiMeasure) { - if (phiMeasure > settings.getConvictThreshold()) - return GossipState.DOWN; - else - return GossipState.UP; + if (phiMeasure > settings.getConvictThreshold()) return GossipState.DOWN; + else return GossipState.UP; } public GossipState calcRequiredStateCleanupInterval(LocalMember member, GossipState state) { @@ -111,14 +111,15 @@ public class GossipMemberStateRefresher { } /** - * If we have a special key the per-node data that means that the node has sent us - * a pre-emptive shutdown message. We process this so node is seen down sooner + * If we have a special key the per-node data that means that the node has sent us a pre-emptive + * shutdown message. We process this so node is seen down sooner * * @param l member to consider * @return true if node forced down */ public boolean processOptimisticShutdown(Entry l) { - PerNodeDataMessage m = findPerNodeGossipData.apply(l.getKey().getId(), ShutdownMessage.PER_NODE_KEY); + PerNodeDataMessage m = + findPerNodeGossipData.apply(l.getKey().getId(), ShutdownMessage.PER_NODE_KEY); if (m == null) { return false; } @@ -126,7 +127,7 @@ public class GossipMemberStateRefresher { if (s.getShutdownAtNanos() > l.getKey().getHeartbeat()) { members.put(l.getKey(), GossipState.DOWN); if (l.getValue() == GossipState.UP) { - for (GossipListener listener: listeners) + for (GossipListener listener : listeners) listenerExecutor.execute(() -> listener.gossipEvent(l.getKey(), GossipState.DOWN)); } return true; @@ -153,4 +154,4 @@ public class GossipMemberStateRefresher { } listenerExecutor.shutdownNow(); } -} \ No newline at end of file +} diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/RingStatePersister.java b/gossip-base/src/main/java/org/apache/gossip/manager/RingStatePersister.java index 7cc1fdd..4666c66 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/RingStatePersister.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/RingStatePersister.java @@ -14,7 +14,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ + */ package org.apache.gossip.manager; import com.fasterxml.jackson.databind.ObjectMapper; @@ -35,21 +35,21 @@ public class RingStatePersister implements Runnable { // NOTE: this is a different instance than what gets used for message marshalling. private final ObjectMapper objectMapper; private final GossipManager manager; - - public RingStatePersister(File path, GossipManager manager){ + + public RingStatePersister(File path, GossipManager manager) { this.path = path; this.objectMapper = GossipManager.metdataObjectMapper; this.manager = manager; } - + @Override public void run() { writeToDisk(); } - + void writeToDisk() { NavigableSet i = manager.getMembers().keySet(); - try (FileOutputStream fos = new FileOutputStream(path)){ + try (FileOutputStream fos = new FileOutputStream(path)) { objectMapper.writeValue(fos, i); } catch (IOException e) { log.error("Error!", e); @@ -61,7 +61,7 @@ public class RingStatePersister implements Runnable { if (!path.exists()) { return new ArrayList<>(); } - try (FileInputStream fos = new FileInputStream(path)){ + try (FileInputStream fos = new FileInputStream(path)) { return objectMapper.readValue(fos, ArrayList.class); } catch (IOException e) { log.error("Error", e); diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/SimpleActiveGossiper.java b/gossip-base/src/main/java/org/apache/gossip/manager/SimpleActiveGossiper.java index 382aecd..2fd18cd 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/SimpleActiveGossiper.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/SimpleActiveGossiper.java @@ -17,6 +17,7 @@ */ package org.apache.gossip.manager; +import com.codahale.metrics.MetricRegistry; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; @@ -24,12 +25,9 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; - import lombok.extern.slf4j.Slf4j; import org.apache.gossip.LocalMember; -import com.codahale.metrics.MetricRegistry; - /** Base implementation gossips randomly to live nodes periodically gossips to dead ones */ @Slf4j public class SimpleActiveGossiper extends AbstractActiveGossiper { diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/UserDataPersister.java b/gossip-base/src/main/java/org/apache/gossip/manager/UserDataPersister.java index 2569747..b77a2c1 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/UserDataPersister.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/UserDataPersister.java @@ -17,14 +17,12 @@ */ package org.apache.gossip.manager; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; - -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.java.Log; import lombok.extern.slf4j.Slf4j; import org.apache.gossip.model.PerNodeDataMessage; import org.apache.gossip.model.SharedDataMessage; @@ -48,14 +46,14 @@ public class UserDataPersister implements Runnable { @SuppressWarnings("unchecked") ConcurrentHashMap> readPerNodeFromDisk() { if (!perNodePath.exists()) { - return new ConcurrentHashMap>(); + return new ConcurrentHashMap<>(); } try (FileInputStream fos = new FileInputStream(perNodePath)) { return objectMapper.readValue(fos, ConcurrentHashMap.class); } catch (IOException e) { log.error("Error!", e); } - return new ConcurrentHashMap>(); + return new ConcurrentHashMap<>(); } void writePerNodeToDisk() { diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ActiveGossipMessageHandler.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ActiveGossipMessageHandler.java index 2dfeb59..643cb81 100644 --- a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ActiveGossipMessageHandler.java +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ActiveGossipMessageHandler.java @@ -33,7 +33,7 @@ import org.apache.gossip.udp.UdpNotAMemberFault; @Slf4j public class ActiveGossipMessageHandler implements MessageHandler { - + /** * @param gossipCore context. * @param gossipManager context. @@ -53,7 +53,8 @@ public class ActiveGossipMessageHandler implements MessageHandler { log.debug("Gossip message with faulty URI", e); continue; } - RemoteMember member = new RemoteMember( + RemoteMember member = + new RemoteMember( activeGossipMessage.getMembers().get(i).getCluster(), u, activeGossipMessage.getMembers().get(i).getId(), diff --git a/gossip-base/src/main/java/org/apache/gossip/model/Base.java b/gossip-base/src/main/java/org/apache/gossip/model/Base.java index 8bd605d..38df1a6 100644 --- a/gossip-base/src/main/java/org/apache/gossip/model/Base.java +++ b/gossip-base/src/main/java/org/apache/gossip/model/Base.java @@ -26,22 +26,17 @@ import org.apache.gossip.udp.UdpNotAMemberFault; import org.apache.gossip.udp.UdpPerNodeDataBulkMessage; import org.apache.gossip.udp.UdpSharedDataBulkMessage; -@JsonTypeInfo( - use = JsonTypeInfo.Id.CLASS, - include = JsonTypeInfo.As.PROPERTY, - property = "type") +@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ - @Type(value = ActiveGossipMessage.class, name = "ActiveGossipMessage"), - @Type(value = Fault.class, name = "Fault"), - @Type(value = ActiveGossipOk.class, name = "ActiveGossipOk"), - @Type(value = UdpActiveGossipOk.class, name = "UdpActiveGossipOk"), - @Type(value = UdpActiveGossipMessage.class, name = "UdpActiveGossipMessage"), - @Type(value = UdpNotAMemberFault.class, name = "UdpNotAMemberFault"), - @Type(value = PerNodeDataMessage.class, name = "PerNodeDataMessage"), - @Type(value = UdpPerNodeDataBulkMessage.class, name = "UdpPerNodeDataMessage"), - @Type(value = SharedDataMessage.class, name = "SharedDataMessage"), - @Type(value = UdpSharedDataBulkMessage.class, name = "UdpSharedDataMessage") - }) -public class Base { - -} + @Type(value = ActiveGossipMessage.class, name = "ActiveGossipMessage"), + @Type(value = Fault.class, name = "Fault"), + @Type(value = ActiveGossipOk.class, name = "ActiveGossipOk"), + @Type(value = UdpActiveGossipOk.class, name = "UdpActiveGossipOk"), + @Type(value = UdpActiveGossipMessage.class, name = "UdpActiveGossipMessage"), + @Type(value = UdpNotAMemberFault.class, name = "UdpNotAMemberFault"), + @Type(value = PerNodeDataMessage.class, name = "PerNodeDataMessage"), + @Type(value = UdpPerNodeDataBulkMessage.class, name = "UdpPerNodeDataMessage"), + @Type(value = SharedDataMessage.class, name = "SharedDataMessage"), + @Type(value = UdpSharedDataBulkMessage.class, name = "UdpSharedDataMessage") +}) +public class Base {} diff --git a/gossip-base/src/main/java/org/apache/gossip/model/SharedDataMessage.java b/gossip-base/src/main/java/org/apache/gossip/model/SharedDataMessage.java index 55a36a3..d9d3f53 100644 --- a/gossip-base/src/main/java/org/apache/gossip/model/SharedDataMessage.java +++ b/gossip-base/src/main/java/org/apache/gossip/model/SharedDataMessage.java @@ -31,47 +31,65 @@ public class SharedDataMessage extends Base { public String getNodeId() { return nodeId; } + public void setNodeId(String nodeId) { this.nodeId = nodeId; } + public String getKey() { return key; } + public void setKey(String key) { this.key = key; } + public Object getPayload() { return payload; } + public void setPayload(Object payload) { this.payload = payload; } + public Long getTimestamp() { return timestamp; } + public void setTimestamp(Long timestamp) { this.timestamp = timestamp; } + public Long getExpireAt() { return expireAt; } + public void setExpireAt(Long expireAt) { this.expireAt = expireAt; } - + public Replicable getReplicable() { return replicable; } - + public void setReplicable(Replicable replicable) { this.replicable = replicable; } - + @Override public String toString() { - return "SharedGossipDataMessage [nodeId=" + nodeId + ", key=" + key + ", payload=" + payload - + ", timestamp=" + timestamp + ", expireAt=" + expireAt - + ", replicable=" + replicable + "]"; + return "SharedGossipDataMessage [nodeId=" + + nodeId + + ", key=" + + key + + ", payload=" + + payload + + ", timestamp=" + + timestamp + + ", expireAt=" + + expireAt + + ", replicable=" + + replicable + + "]"; } } - diff --git a/gossip-base/src/main/java/org/apache/gossip/protocol/ProtocolManager.java b/gossip-base/src/main/java/org/apache/gossip/protocol/ProtocolManager.java index a8e4e42..e6544b6 100644 --- a/gossip-base/src/main/java/org/apache/gossip/protocol/ProtocolManager.java +++ b/gossip-base/src/main/java/org/apache/gossip/protocol/ProtocolManager.java @@ -23,7 +23,9 @@ import org.apache.gossip.model.Base; /** interface for managing message marshaling. */ public interface ProtocolManager { - /** serialize a message + /** + * serialize a message + * * @param message * @return serialized message. * @throws IOException @@ -32,6 +34,7 @@ public interface ProtocolManager { /** * Reads the next message from a byte source. + * * @param buf * @return a gossip message. * @throws IOException diff --git a/gossip-base/src/main/java/org/apache/gossip/replication/BlackListReplicable.java b/gossip-base/src/main/java/org/apache/gossip/replication/BlackListReplicable.java index a43bd36..c88b604 100644 --- a/gossip-base/src/main/java/org/apache/gossip/replication/BlackListReplicable.java +++ b/gossip-base/src/main/java/org/apache/gossip/replication/BlackListReplicable.java @@ -17,11 +17,10 @@ */ package org.apache.gossip.replication; -import org.apache.gossip.LocalMember; -import org.apache.gossip.model.Base; - import java.util.ArrayList; import java.util.List; +import org.apache.gossip.LocalMember; +import org.apache.gossip.model.Base; /** * Replicable implementation which does not replicate data to given set of nodes. diff --git a/gossip-base/src/main/java/org/apache/gossip/replication/WhiteListReplicable.java b/gossip-base/src/main/java/org/apache/gossip/replication/WhiteListReplicable.java index 5d1b43d..aec82cf 100644 --- a/gossip-base/src/main/java/org/apache/gossip/replication/WhiteListReplicable.java +++ b/gossip-base/src/main/java/org/apache/gossip/replication/WhiteListReplicable.java @@ -29,9 +29,9 @@ import org.apache.gossip.model.Base; * @see Replicable */ public class WhiteListReplicable implements Replicable { - + private final List whiteListMembers; - + public WhiteListReplicable(List whiteListMembers) { if (whiteListMembers == null) { this.whiteListMembers = new ArrayList<>(); diff --git a/gossip-base/src/main/java/org/apache/gossip/transport/AbstractTransportManager.java b/gossip-base/src/main/java/org/apache/gossip/transport/AbstractTransportManager.java index 941e3b2..f416b44 100644 --- a/gossip-base/src/main/java/org/apache/gossip/transport/AbstractTransportManager.java +++ b/gossip-base/src/main/java/org/apache/gossip/transport/AbstractTransportManager.java @@ -27,9 +27,7 @@ import org.apache.gossip.manager.GossipCore; import org.apache.gossip.manager.GossipManager; import org.apache.gossip.utils.ReflectionUtils; -/** - * Manage the protcol threads (active and passive gossipers). - */ +/** Manage the protcol threads (active and passive gossipers). */ @Slf4j public abstract class AbstractTransportManager implements TransportManager { @@ -37,19 +35,16 @@ public abstract class AbstractTransportManager implements TransportManager { protected final GossipCore gossipCore; private final ExecutorService gossipThreadExecutor; private final AbstractActiveGossiper activeGossipThread; - + public AbstractTransportManager(GossipManager gossipManager, GossipCore gossipCore) { this.gossipManager = gossipManager; this.gossipCore = gossipCore; gossipThreadExecutor = Executors.newCachedThreadPool(); - activeGossipThread = ReflectionUtils.constructWithReflection( - gossipManager.getSettings().getActiveGossipClass(), - new Class[]{ - GossipManager.class, GossipCore.class, MetricRegistry.class - }, - new Object[]{ - gossipManager, gossipCore, gossipManager.getRegistry() - }); + activeGossipThread = + ReflectionUtils.constructWithReflection( + gossipManager.getSettings().getActiveGossipClass(), + new Class[] {GossipManager.class, GossipCore.class, MetricRegistry.class}, + new Object[] {gossipManager, gossipCore, gossipManager.getRegistry()}); } // shut down threads etc. diff --git a/gossip-base/src/main/java/org/apache/gossip/udp/UdpNotAMemberFault.java b/gossip-base/src/main/java/org/apache/gossip/udp/UdpNotAMemberFault.java index 551907c..e3d8181 100644 --- a/gossip-base/src/main/java/org/apache/gossip/udp/UdpNotAMemberFault.java +++ b/gossip-base/src/main/java/org/apache/gossip/udp/UdpNotAMemberFault.java @@ -23,6 +23,7 @@ public class UdpNotAMemberFault extends NotAMemberFault implements Trackable { private String uriFrom; private String uuid; + public UdpNotAMemberFault() {} public String getUriFrom() { diff --git a/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java b/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java index d967a09..3c5f922 100644 --- a/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java +++ b/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java @@ -23,7 +23,6 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.UUID; - import org.apache.gossip.manager.GossipManager; import org.apache.gossip.manager.GossipManagerBuilder; import org.junit.After; diff --git a/gossip-base/src/test/java/org/apache/gossip/MemberTest.java b/gossip-base/src/test/java/org/apache/gossip/MemberTest.java index d33ff56..4a725bf 100644 --- a/gossip-base/src/test/java/org/apache/gossip/MemberTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/MemberTest.java @@ -27,16 +27,18 @@ public class MemberTest { @Test public void testHashCodeFromGossip40() throws URISyntaxException { - Assertions.assertNotEquals(new LocalMember( - "mycluster", - new URI("udp://4.4.4.4:1000"), - "myid", - 1, - new HashMap<>(), - 10, - 5, - "exponential") - .hashCode(), new LocalMember( + Assertions.assertNotEquals( + new LocalMember( + "mycluster", + new URI("udp://4.4.4.4:1000"), + "myid", + 1, + new HashMap<>(), + 10, + 5, + "exponential") + .hashCode(), + new LocalMember( "mycluster", new URI("udp://4.4.4.5:1005"), "yourid", diff --git a/gossip-base/src/test/java/org/apache/gossip/accrual/FailureDetectorTest.java b/gossip-base/src/test/java/org/apache/gossip/accrual/FailureDetectorTest.java index 5fdc8fe..6d37b0b 100644 --- a/gossip-base/src/test/java/org/apache/gossip/accrual/FailureDetectorTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/accrual/FailureDetectorTest.java @@ -54,20 +54,24 @@ public class FailureDetectorTest { } Integer lastRecorded = values.get(values.size() - 2); - //after "step" delay we need to be considered UP + // after "step" delay we need to be considered UP Assertions.assertTrue(fd.computePhiMeasure(values.get(values.size() - 1)) < failureThreshold); - //if we check phi-measure after mean delay we get value for 0.5 probability(normal distribution) - Assertions.assertEquals(fd.computePhiMeasure(lastRecorded + Math.round(deltaSum / deltaCount)), - -Math.log10(0.5), - 0.1); + // if we check phi-measure after mean delay we get value for 0.5 probability(normal + // distribution) + Assertions.assertEquals( + fd.computePhiMeasure(lastRecorded + Math.round(deltaSum / deltaCount)), + -Math.log10(0.5), + 0.1); } @Test public void checkMinimumSamples() { int minimumSamples = 5; FailureDetector fd = new FailureDetector(minimumSamples, 1000, "normal"); - for (int i = 0; i < minimumSamples + 1; i++) { // +1 because we don't place first heartbeat into structure + for (int i = 0; + i < minimumSamples + 1; + i++) { // +1 because we don't place first heartbeat into structure Assertions.assertNull(fd.computePhiMeasure(100)); fd.recordHeartbeat(i); } @@ -77,28 +81,30 @@ public class FailureDetectorTest { @Test public void checkMonotonicDead() { final FailureDetector fd = new FailureDetector(5, 1000, "normal"); - TriConsumer checkAlive = (begin, end, step) -> { - List times = generateTimeList(begin, end, step); - for (Integer time : times) { + TriConsumer checkAlive = + (begin, end, step) -> { + List times = generateTimeList(begin, end, step); + for (Integer time : times) { Double current = fd.computePhiMeasure(time); if (current != null) { - Assertions.assertTrue(current < failureThreshold); + Assertions.assertTrue(current < failureThreshold); } fd.recordHeartbeat(time); - } - }; + } + }; - TriConsumer checkDeadMonotonic = (begin, end, step) -> { - List times = generateTimeList(begin, end, step); - Double prev = null; - for (Integer time : times) { + TriConsumer checkDeadMonotonic = + (begin, end, step) -> { + List times = generateTimeList(begin, end, step); + Double prev = null; + for (Integer time : times) { Double current = fd.computePhiMeasure(time); if (current != null && prev != null) { - Assertions.assertTrue(current >= prev); + Assertions.assertTrue(current >= prev); } prev = current; - } - }; + } + }; checkAlive.accept(0, 20000, 100); checkDeadMonotonic.accept(20000, 20500, 5); diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/AddRemoveStringSetTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/AddRemoveStringSetTest.java index 4cc8b44..33f7ce7 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/AddRemoveStringSetTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/AddRemoveStringSetTest.java @@ -17,15 +17,14 @@ */ package org.apache.gossip.crdt; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; /* Abstract test suit to test CrdtSets with Add and Remove operations. diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlyCounterTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlyCounterTest.java index 7189468..63ac441 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlyCounterTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlyCounterTest.java @@ -23,29 +23,29 @@ import org.junit.Assert; import org.junit.Test; public class GrowOnlyCounterTest { - + @Test public void mergeTest() { - + Map node1Counter = new HashMap<>(); node1Counter.put("1", 3L); Map node2Counter = new HashMap<>(); node2Counter.put("2", 1L); Map node3Counter = new HashMap<>(); node3Counter.put("3", 2L); - + GrowOnlyCounter gCounter1 = new GrowOnlyCounter(node1Counter); GrowOnlyCounter gCounter2 = new GrowOnlyCounter(node2Counter); GrowOnlyCounter gCounter3 = new GrowOnlyCounter(node3Counter); - + // After node 2 receive from node 1 gCounter2 = gCounter2.merge(gCounter1); Assert.assertEquals(4, (long) gCounter2.value()); - + // After node 3 receive from node 1 gCounter3 = gCounter3.merge(gCounter1); Assert.assertEquals(5, (long) gCounter3.value()); - + // After node 3 receive from node 2 gCounter3 = gCounter3.merge(gCounter2); Assert.assertEquals(6, (long) gCounter3.value()); diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlySetTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlySetTest.java index b39356e..3f696d6 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlySetTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/GrowOnlySetTest.java @@ -19,7 +19,6 @@ package org.apache.gossip.crdt; import java.util.Arrays; import java.util.concurrent.ConcurrentHashMap; - import org.junit.Assert; import org.junit.Test; diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/LwwSetTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/LwwSetTest.java index cf2372f..fc8d386 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/LwwSetTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/LwwSetTest.java @@ -17,15 +17,14 @@ */ package org.apache.gossip.crdt; -import org.apache.gossip.manager.Clock; -import org.apache.gossip.manager.SystemClock; -import org.junit.Assert; -import org.junit.Test; - import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.apache.gossip.manager.Clock; +import org.apache.gossip.manager.SystemClock; +import org.junit.Assert; +import org.junit.Test; public class LwwSetTest extends AddRemoveStringSetTest> { private static Clock clock = new SystemClock(); diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/MaxChangeSetTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/MaxChangeSetTest.java index d2a9ce6..f8e282d 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/MaxChangeSetTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/MaxChangeSetTest.java @@ -25,16 +25,16 @@ import org.junit.Assert; import org.junit.Test; public class MaxChangeSetTest extends AddRemoveStringSetTest> { - MaxChangeSet construct(Set set){ + MaxChangeSet construct(Set set) { return new MaxChangeSet<>(set); } - MaxChangeSet construct(){ + MaxChangeSet construct() { return new MaxChangeSet<>(); } @Test - public void valueTest(){ + public void valueTest() { Map struct = new HashMap<>(); struct.put('a', 0); struct.put('b', 1); @@ -47,7 +47,7 @@ public class MaxChangeSetTest extends AddRemoveStringSetTest set1 = new MaxChangeSet().add(1); // Set with one operation on 1 MaxChangeSet set2 = new MaxChangeSet().add(1).remove(1); // two operations Assert.assertEquals(set1.merge(set2), new MaxChangeSet()); // empty set wins diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/OrSetTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/OrSetTest.java index be7f605..85a1f7b 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/OrSetTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/OrSetTest.java @@ -25,22 +25,22 @@ import org.junit.Assert; import org.junit.Test; public class OrSetTest extends AddRemoveStringSetTest> { - OrSet construct(){ + OrSet construct() { return new OrSet<>(); } - OrSet construct(Set set){ + OrSet construct(Set set) { return new OrSet<>(set); } @Test - public void atest(){ + public void atest() { OrSet i = new OrSet<>(new OrSet.Builder().add(4).add(5).add(6).remove(5)); Assert.assertArrayEquals(Arrays.asList(4, 6).toArray(), i.value().toArray()); } @Test - public void mergeTest(){ + public void mergeTest() { OrSet i = new OrSet<>(new OrSet.Builder().add(4).add(5).add(6).remove(5)); Assert.assertArrayEquals(Arrays.asList(4, 6).toArray(), i.value().toArray()); OrSet j = new OrSet<>(new OrSet.Builder().add(9).add(4).add(5).remove(6)); @@ -49,11 +49,11 @@ public class OrSetTest extends AddRemoveStringSetTest> { } @Test - public void mergeTest2(){ + public void mergeTest2() { OrSet i = new OrSet<>(new OrSet.Builder().add(5).add(4).remove(4).add(6)); Assert.assertEquals(new OrSet<>(5, 6), i); SortedSet tree = new TreeSet<>(); - for (Integer in : i.value()){ + for (Integer in : i.value()) { tree.add(in); } TreeSet compare = new TreeSet<>(); @@ -63,32 +63,32 @@ public class OrSetTest extends AddRemoveStringSetTest> { } @Test - public void mergeTest4(){ - Assert.assertArrayEquals(new Integer[]{}, - new OrSet<>(new OrSet.Builder().add(1).remove(1)).toArray()); + public void mergeTest4() { + Assert.assertArrayEquals( + new Integer[] {}, new OrSet<>(new OrSet.Builder().add(1).remove(1)).toArray()); } @Test - public void mergeTest3(){ + public void mergeTest3() { OrSet i = new OrSet<>(1); OrSet j = new OrSet<>(2); OrSet k = new OrSet<>(i.merge(j), new OrSet.Builder().remove(1)); - Assert.assertArrayEquals(new Integer[]{2}, i.merge(j).merge(k).toArray()); - Assert.assertArrayEquals(new Integer[]{2}, j.merge(i).merge(k).toArray()); - Assert.assertArrayEquals(new Integer[]{2}, k.merge(i).merge(j).toArray()); - Assert.assertArrayEquals(new Integer[]{2}, k.merge(j).merge(i).toArray()); + Assert.assertArrayEquals(new Integer[] {2}, i.merge(j).merge(k).toArray()); + Assert.assertArrayEquals(new Integer[] {2}, j.merge(i).merge(k).toArray()); + Assert.assertArrayEquals(new Integer[] {2}, k.merge(i).merge(j).toArray()); + Assert.assertArrayEquals(new Integer[] {2}, k.merge(j).merge(i).toArray()); Assert.assertEquals(j, i.merge(j.merge(k))); } @Test - public void mergeTest9(){ + public void mergeTest9() { OrSet i = new OrSet<>(19); OrSet j = i.merge(i); Assert.assertEquals(i.value(), j.value()); } @Test - public void mergeTestSame(){ + public void mergeTestSame() { OrSet i = new OrSet<>(19); OrSet j = new OrSet<>(19); OrSet k = i.merge(j); @@ -98,4 +98,4 @@ public class OrSetTest extends AddRemoveStringSetTest> { Assert.assertEquals(2, y.getElements().get(19).size()); Assert.assertEquals(new OrSet().value(), y.value()); } -} \ No newline at end of file +} diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/PNCounterTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/PNCounterTest.java index 1ce0bb8..9369cb8 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/PNCounterTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/PNCounterTest.java @@ -22,7 +22,6 @@ import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; - import org.apache.gossip.LocalMember; import org.apache.gossip.manager.GossipManager; import org.junit.Assert; diff --git a/gossip-base/src/test/java/org/apache/gossip/crdt/TwoPhaseSetTest.java b/gossip-base/src/test/java/org/apache/gossip/crdt/TwoPhaseSetTest.java index 8ac5d0b..0d91a34 100644 --- a/gossip-base/src/test/java/org/apache/gossip/crdt/TwoPhaseSetTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/crdt/TwoPhaseSetTest.java @@ -17,13 +17,12 @@ */ package org.apache.gossip.crdt; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - import java.util.HashSet; import java.util.Set; import java.util.function.BiConsumer; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; public class TwoPhaseSetTest { diff --git a/gossip-base/src/test/java/org/apache/gossip/event/data/DataEventManagerTest.java b/gossip-base/src/test/java/org/apache/gossip/event/data/DataEventManagerTest.java index e75bcf7..2b24508 100644 --- a/gossip-base/src/test/java/org/apache/gossip/event/data/DataEventManagerTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/event/data/DataEventManagerTest.java @@ -18,13 +18,12 @@ package org.apache.gossip.event.data; import com.codahale.metrics.MetricRegistry; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - public class DataEventManagerTest { private static Semaphore semaphore; diff --git a/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java b/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java index e7b1bb6..43e0a85 100644 --- a/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/lock/vote/MajorityVoteTest.java @@ -17,12 +17,11 @@ */ package org.apache.gossip.lock.vote; -import org.junit.Assert; -import org.junit.Test; - import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import org.junit.Assert; +import org.junit.Test; public class MajorityVoteTest { diff --git a/gossip-base/src/test/java/org/apache/gossip/manager/DataReaperTest.java b/gossip-base/src/test/java/org/apache/gossip/manager/DataReaperTest.java index 157f603..a27258a 100644 --- a/gossip-base/src/test/java/org/apache/gossip/manager/DataReaperTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/manager/DataReaperTest.java @@ -18,16 +18,14 @@ package org.apache.gossip.manager; import com.codahale.metrics.MetricRegistry; +import io.teknek.tunit.TUnit; import java.net.URI; - import org.apache.gossip.GossipSettings; import org.apache.gossip.model.PerNodeDataMessage; import org.apache.gossip.model.SharedDataMessage; import org.junit.Assert; import org.junit.Test; -import io.teknek.tunit.TUnit; - public class DataReaperTest { private final MetricRegistry registry = new MetricRegistry(); diff --git a/gossip-base/src/test/java/org/apache/gossip/manager/UserDataPersistenceTest.java b/gossip-base/src/test/java/org/apache/gossip/manager/UserDataPersistenceTest.java index 6aa1e15..e38e202 100644 --- a/gossip-base/src/test/java/org/apache/gossip/manager/UserDataPersistenceTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/manager/UserDataPersistenceTest.java @@ -22,7 +22,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; import java.util.concurrent.ConcurrentHashMap; - import org.apache.gossip.GossipSettings; import org.apache.gossip.model.PerNodeDataMessage; import org.apache.gossip.model.SharedDataMessage; diff --git a/gossip-base/src/test/java/org/apache/gossip/manager/handlers/MessageHandlerTest.java b/gossip-base/src/test/java/org/apache/gossip/manager/handlers/MessageHandlerTest.java index 344ca3b..2cb132d 100644 --- a/gossip-base/src/test/java/org/apache/gossip/manager/handlers/MessageHandlerTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/manager/handlers/MessageHandlerTest.java @@ -28,7 +28,8 @@ import org.junit.Test; public class MessageHandlerTest { @Test public void testSimpleHandler() { - MessageHandler mi = new TypedMessageHandlerWrapper(FakeMessage.class, new DummyMessageHandler()); + MessageHandler mi = + new TypedMessageHandlerWrapper(FakeMessage.class, new DummyMessageHandler()); Assert.assertTrue(mi.invoke(null, null, new FakeMessage())); Assert.assertFalse(mi.invoke(null, null, new ActiveGossipMessage())); } @@ -72,7 +73,8 @@ public class MessageHandlerTest { @Test public void testMessageHandlerCombiner() { // Empty combiner - false result - MessageHandler mi = MessageHandlerFactory.concurrentHandler((gossipCore, gossipManager, base) -> false); + MessageHandler mi = + MessageHandlerFactory.concurrentHandler((gossipCore, gossipManager, base) -> false); Assert.assertFalse(mi.invoke(null, null, new Base())); DummyMessageHandler h = new DummyMessageHandler(); @@ -86,7 +88,9 @@ public class MessageHandlerTest { Assert.assertEquals(2, h.counter); // Increase size in runtime. Should be 3 calls: 2+3 = 5 - mi = MessageHandlerFactory.concurrentHandler(mi, new TypedMessageHandlerWrapper(FakeMessage.class, h)); + mi = + MessageHandlerFactory.concurrentHandler( + mi, new TypedMessageHandlerWrapper(FakeMessage.class, h)); Assert.assertTrue(mi.invoke(null, null, new FakeMessage())); Assert.assertEquals(5, h.counter); } diff --git a/gossip-base/src/test/java/org/apache/gossip/protocol/UnitTestProtocolManager.java b/gossip-base/src/test/java/org/apache/gossip/protocol/UnitTestProtocolManager.java index cb99e39..26f46df 100644 --- a/gossip-base/src/test/java/org/apache/gossip/protocol/UnitTestProtocolManager.java +++ b/gossip-base/src/test/java/org/apache/gossip/protocol/UnitTestProtocolManager.java @@ -29,21 +29,23 @@ import org.apache.gossip.model.Base; // doesn't serialize anything besides longs. Uses a static lookup table to read and write objects. public class UnitTestProtocolManager implements ProtocolManager { - - // so it can be shared across gossipers. this works as long as each object has a different memory address. + + // so it can be shared across gossipers. this works as long as each object has a different memory + // address. private static final Map lookup = new ConcurrentHashMap<>(); private final Meter meter; - + public UnitTestProtocolManager(GossipSettings settings, String id, MetricRegistry registry) { - meter = settings.isSignMessages() ? - registry.meter(PassiveGossipConstants.SIGNED_MESSAGE) : - registry.meter(PassiveGossipConstants.UNSIGNED_MESSAGE); + meter = + settings.isSignMessages() + ? registry.meter(PassiveGossipConstants.SIGNED_MESSAGE) + : registry.meter(PassiveGossipConstants.UNSIGNED_MESSAGE); } - + private static byte[] longToBytes(long val) { byte[] b = new byte[8]; b[7] = (byte) (val); - b[6] = (byte) (val >>> 8); + b[6] = (byte) (val >>> 8); b[5] = (byte) (val >>> 16); b[4] = (byte) (val >>> 24); b[3] = (byte) (val >>> 32); @@ -54,16 +56,16 @@ public class UnitTestProtocolManager implements ProtocolManager { } static long bytesToLong(byte[] b) { - return ((b[7] & 0xFFL)) + - ((b[6] & 0xFFL) << 8) + - ((b[5] & 0xFFL) << 16) + - ((b[4] & 0xFFL) << 24) + - ((b[3] & 0xFFL) << 32) + - ((b[2] & 0xFFL) << 40) + - ((b[1] & 0xFFL) << 48) + - (((long) b[0]) << 56); + return ((b[7] & 0xFFL)) + + ((b[6] & 0xFFL) << 8) + + ((b[5] & 0xFFL) << 16) + + ((b[4] & 0xFFL) << 24) + + ((b[3] & 0xFFL) << 32) + + ((b[2] & 0xFFL) << 40) + + ((b[1] & 0xFFL) << 48) + + (((long) b[0]) << 56); } - + @Override public byte[] write(Base message) throws IOException { long hashCode = System.identityHashCode(message); diff --git a/gossip-base/src/test/java/org/apache/gossip/replication/DataReplicationTest.java b/gossip-base/src/test/java/org/apache/gossip/replication/DataReplicationTest.java index be00613..f97b99d 100644 --- a/gossip-base/src/test/java/org/apache/gossip/replication/DataReplicationTest.java +++ b/gossip-base/src/test/java/org/apache/gossip/replication/DataReplicationTest.java @@ -30,9 +30,9 @@ import org.junit.Assert; import org.junit.Test; public class DataReplicationTest { - - private static SharedDataMessage getSharedNodeData(String key, String value, - Replicable replicable) { + + private static SharedDataMessage getSharedNodeData( + String key, String value, Replicable replicable) { SharedDataMessage g = new SharedDataMessage(); g.setExpireAt(Long.MAX_VALUE); g.setKey(key); @@ -41,114 +41,118 @@ public class DataReplicationTest { g.setReplicable(replicable); return g; } - - private static LocalMember getLocalMember(URI uri, String id){ + + private static LocalMember getLocalMember(URI uri, String id) { return new LocalMember("cluster1", uri, id, 0, null, 1, 0, ""); } - - private static LocalMember getLocalMemberDc(URI uri, String id, String dataCenter, String rack){ + + private static LocalMember getLocalMemberDc(URI uri, String id, String dataCenter, String rack) { Map props = new HashMap<>(); props.put(DatacenterRackAwareActiveGossiper.DATACENTER, dataCenter); props.put(DatacenterRackAwareActiveGossiper.RACK, rack); return new LocalMember("cluster1", uri, id, 0, props, 1, 0, ""); } - + @Test public void dataReplicateAllTest() throws URISyntaxException { - SharedDataMessage message = getSharedNodeData("public","public", new AllReplicable<>()); - LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8001"),"1"); - LocalMember member = getLocalMember(new URI("udp://127.0.0.1:8002"),"2"); + SharedDataMessage message = getSharedNodeData("public", "public", new AllReplicable<>()); + LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8001"), "1"); + LocalMember member = getLocalMember(new URI("udp://127.0.0.1:8002"), "2"); Assert.assertEquals(true, message.getReplicable().shouldReplicate(me, member, message)); } - + @Test public void dataReplicateNoneTest() throws URISyntaxException { - SharedDataMessage message = getSharedNodeData("private","private", new NotReplicable<>()); - LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8001"),"1"); - LocalMember member = getLocalMember(new URI("udp://127.0.0.1:8002"),"2"); + SharedDataMessage message = getSharedNodeData("private", "private", new NotReplicable<>()); + LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8001"), "1"); + LocalMember member = getLocalMember(new URI("udp://127.0.0.1:8002"), "2"); Assert.assertEquals(false, message.getReplicable().shouldReplicate(me, member, message)); } - + @Test public void dataReplicateWhiteListTest() throws URISyntaxException { List memberList = new ArrayList<>(); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"),"1")); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"),"2")); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8003"),"3")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"), "1")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"), "2")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8003"), "3")); // add node 1 and 2 to the white list List whiteList = new ArrayList<>(); whiteList.add(memberList.get(0)); whiteList.add(memberList.get(1)); - SharedDataMessage message = getSharedNodeData("whiteList", "Only allow some nodes", - new WhiteListReplicable<>(whiteList)); - LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8004"),"4"); + SharedDataMessage message = + getSharedNodeData( + "whiteList", "Only allow some nodes", new WhiteListReplicable<>(whiteList)); + LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8004"), "4"); // data should replicate to node 1 and 2 but not 3 - Assert.assertEquals(true, - message.getReplicable().shouldReplicate(me, memberList.get(0), message)); - Assert.assertEquals(true, - message.getReplicable().shouldReplicate(me, memberList.get(1), message)); - Assert.assertEquals(false, - message.getReplicable().shouldReplicate(me, memberList.get(2), message)); + Assert.assertEquals( + true, message.getReplicable().shouldReplicate(me, memberList.get(0), message)); + Assert.assertEquals( + true, message.getReplicable().shouldReplicate(me, memberList.get(1), message)); + Assert.assertEquals( + false, message.getReplicable().shouldReplicate(me, memberList.get(2), message)); } - + @Test public void dataReplicateWhiteListNullTest() throws URISyntaxException { List memberList = new ArrayList<>(); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"),"1")); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"),"2")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"), "1")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"), "2")); - SharedDataMessage message = getSharedNodeData("whiteList", "Only allow some nodes", - new WhiteListReplicable<>(null)); + SharedDataMessage message = + getSharedNodeData("whiteList", "Only allow some nodes", new WhiteListReplicable<>(null)); // data should not replicate if no whitelist specified - Assert.assertEquals(false, - message.getReplicable().shouldReplicate(memberList.get(0), memberList.get(1), message)); - Assert.assertEquals(false, - message.getReplicable().shouldReplicate(memberList.get(1), memberList.get(0), message)); - + Assert.assertEquals( + false, + message.getReplicable().shouldReplicate(memberList.get(0), memberList.get(1), message)); + Assert.assertEquals( + false, + message.getReplicable().shouldReplicate(memberList.get(1), memberList.get(0), message)); } - + @Test public void dataReplicateBlackListTest() throws URISyntaxException { List memberList = new ArrayList<>(); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"),"1")); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"),"2")); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8003"),"3")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"), "1")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"), "2")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8003"), "3")); // add node 1 and 2 to the black list List blackList = new ArrayList<>(); blackList.add(memberList.get(0)); blackList.add(memberList.get(1)); - SharedDataMessage message = getSharedNodeData("blackList", "Disallow some nodes", - new BlackListReplicable<>(blackList)); - LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8004"),"4"); + SharedDataMessage message = + getSharedNodeData("blackList", "Disallow some nodes", new BlackListReplicable<>(blackList)); + LocalMember me = getLocalMember(new URI("udp://127.0.0.1:8004"), "4"); // data should not replicate to node 1 and 2 - Assert.assertEquals(false, - message.getReplicable().shouldReplicate(me, memberList.get(0), message)); - Assert.assertEquals(false, - message.getReplicable().shouldReplicate(me, memberList.get(1), message)); - Assert.assertEquals(true, - message.getReplicable().shouldReplicate(me, memberList.get(2), message)); + Assert.assertEquals( + false, message.getReplicable().shouldReplicate(me, memberList.get(0), message)); + Assert.assertEquals( + false, message.getReplicable().shouldReplicate(me, memberList.get(1), message)); + Assert.assertEquals( + true, message.getReplicable().shouldReplicate(me, memberList.get(2), message)); } @Test public void dataReplicateBlackListNullTest() throws URISyntaxException { List memberList = new ArrayList<>(); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"),"1")); - memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"),"2")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8001"), "1")); + memberList.add(getLocalMember(new URI("udp://127.0.0.1:8002"), "2")); - SharedDataMessage message = getSharedNodeData("blackList", "Disallow some nodes", - new BlackListReplicable<>(null)); + SharedDataMessage message = + getSharedNodeData("blackList", "Disallow some nodes", new BlackListReplicable<>(null)); // data should replicate if no blacklist specified - Assert.assertEquals(true, - message.getReplicable().shouldReplicate(memberList.get(0), memberList.get(1), message)); - Assert.assertEquals(true, - message.getReplicable().shouldReplicate(memberList.get(1), memberList.get(0), message)); + Assert.assertEquals( + true, + message.getReplicable().shouldReplicate(memberList.get(0), memberList.get(1), message)); + Assert.assertEquals( + true, + message.getReplicable().shouldReplicate(memberList.get(1), memberList.get(0), message)); } @Test @@ -157,28 +161,41 @@ public class DataReplicationTest { List memberListDc1 = new ArrayList<>(); List memberListDc2 = new ArrayList<>(); - memberListDc1 - .add(getLocalMemberDc(new URI("udp://10.0.0.1:8000"), "1", "DataCenter1", "Rack1")); - memberListDc1 - .add(getLocalMemberDc(new URI("udp://10.0.0.2:8000"), "2", "DataCenter1", "Rack2")); - memberListDc2 - .add(getLocalMemberDc(new URI("udp://10.0.1.1:8000"), "11", "DataCenter2", "Rack1")); - memberListDc2 - .add(getLocalMemberDc(new URI("udp://10.0.1.2:8000"), "12", "DataCenter2", "Rack2")); + memberListDc1.add( + getLocalMemberDc(new URI("udp://10.0.0.1:8000"), "1", "DataCenter1", "Rack1")); + memberListDc1.add( + getLocalMemberDc(new URI("udp://10.0.0.2:8000"), "2", "DataCenter1", "Rack2")); + memberListDc2.add( + getLocalMemberDc(new URI("udp://10.0.1.1:8000"), "11", "DataCenter2", "Rack1")); + memberListDc2.add( + getLocalMemberDc(new URI("udp://10.0.1.2:8000"), "12", "DataCenter2", "Rack2")); - SharedDataMessage message = getSharedNodeData("datacenter1", "I am in data center 1 rack 1", - new DataCenterReplicable<>()); + SharedDataMessage message = + getSharedNodeData( + "datacenter1", "I am in data center 1 rack 1", new DataCenterReplicable<>()); // data should replicate in data center 1 - Assert.assertEquals(true, message.getReplicable() + Assert.assertEquals( + true, + message + .getReplicable() .shouldReplicate(memberListDc1.get(0), memberListDc1.get(1), message)); - Assert.assertEquals(true, message.getReplicable() + Assert.assertEquals( + true, + message + .getReplicable() .shouldReplicate(memberListDc2.get(0), memberListDc2.get(1), message)); // data should not replicate to data center 2 - Assert.assertEquals(false, message.getReplicable() + Assert.assertEquals( + false, + message + .getReplicable() .shouldReplicate(memberListDc1.get(0), memberListDc2.get(0), message)); - Assert.assertEquals(false, message.getReplicable() + Assert.assertEquals( + false, + message + .getReplicable() .shouldReplicate(memberListDc1.get(1), memberListDc2.get(1), message)); } @@ -186,21 +203,22 @@ public class DataReplicationTest { public void dataReplicateDataCenterUnknownDataCenterTest() throws URISyntaxException { List memberListDc1 = new ArrayList<>(); - memberListDc1 - .add(getLocalMemberDc(new URI("udp://10.0.0.1:8000"), "1", "DataCenter1", "Rack1")); + memberListDc1.add( + getLocalMemberDc(new URI("udp://10.0.0.1:8000"), "1", "DataCenter1", "Rack1")); Map properties = new HashMap<>(); - LocalMember unknownDc = new LocalMember("cluster1", new URI("udp://10.0.1.2:8000"), "12", 0, - properties, 1, 0, ""); + LocalMember unknownDc = + new LocalMember("cluster1", new URI("udp://10.0.1.2:8000"), "12", 0, properties, 1, 0, ""); - SharedDataMessage message = getSharedNodeData("datacenter1","I am in data center 1 rack 1", new DataCenterReplicable<>()); + SharedDataMessage message = + getSharedNodeData( + "datacenter1", "I am in data center 1 rack 1", new DataCenterReplicable<>()); // data should not replicate from dc1 to unknown node - Assert.assertEquals(false, message.getReplicable() - .shouldReplicate(memberListDc1.get(0), unknownDc, message)); + Assert.assertEquals( + false, message.getReplicable().shouldReplicate(memberListDc1.get(0), unknownDc, message)); // data can replicate from unknown node to dc - Assert.assertEquals(true, message.getReplicable() - .shouldReplicate(unknownDc, memberListDc1.get(0), message)); - + Assert.assertEquals( + true, message.getReplicable().shouldReplicate(unknownDc, memberListDc1.get(0), message)); } } diff --git a/gossip-base/src/test/java/org/apache/gossip/transport/UnitTestTransportManager.java b/gossip-base/src/test/java/org/apache/gossip/transport/UnitTestTransportManager.java index 85e2bc3..93e18fe 100644 --- a/gossip-base/src/test/java/org/apache/gossip/transport/UnitTestTransportManager.java +++ b/gossip-base/src/test/java/org/apache/gossip/transport/UnitTestTransportManager.java @@ -18,15 +18,14 @@ package org.apache.gossip.transport; -import org.apache.gossip.manager.GossipCore; -import org.apache.gossip.manager.GossipManager; - import java.io.IOException; import java.net.URI; import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; /** Only use in unit tests! */ public class UnitTestTransportManager extends AbstractTransportManager { diff --git a/gossip-examples/src/main/java/org/apache/gossip/examples/RunStandardExamples.java b/gossip-examples/src/main/java/org/apache/gossip/examples/RunStandardExamples.java index cb4fe5d..a14be99 100644 --- a/gossip-examples/src/main/java/org/apache/gossip/examples/RunStandardExamples.java +++ b/gossip-examples/src/main/java/org/apache/gossip/examples/RunStandardExamples.java @@ -21,10 +21,6 @@ import java.io.IOException; public class RunStandardExamples { - private static boolean WILL_READ = true; - - private static boolean WILL_NOT_READ = false; - public static void main(String[] args) { if ((args.length < 1) || args[0].equals("-h") || args[0].equals("--help") || args.length < 2) { System.out.print(usage()); @@ -37,16 +33,18 @@ public class RunStandardExamples { System.out.print(usage()); return; } - runExaple(example, channel); + runExample(example, channel); } catch (Exception e) { System.out.print(usage()); } } - private static void runExaple(int exampleNumber, int channel) throws IOException { - String[] args = stanardArgs(channel, new String[4]); + private static void runExample(int exampleNumber, int channel) throws IOException { + String[] args = standardArgs(channel, new String[4]); + boolean WILL_READ = true; if (exampleNumber == 1) { StandAloneNode example = new StandAloneNode(args); + boolean WILL_NOT_READ = false; example.exec(WILL_NOT_READ); } else if (exampleNumber == 2) { StandAloneNodeCrdtOrSet example = new StandAloneNodeCrdtOrSet(args); @@ -61,7 +59,7 @@ public class RunStandardExamples { } } - private static String[] stanardArgs(int channel, String[] args) { + private static String[] standardArgs(int channel, String[] args) { // see README.md for examples args[0] = "udp://localhost:1000" + channel; args[1] = "" + channel; @@ -71,7 +69,7 @@ public class RunStandardExamples { } private static String[] extendedArgs(int channel, String[] args) { - args = stanardArgs(channel, args); + standardArgs(channel, args); // see README.md for examples if (channel == 0) { args[4] = "1"; diff --git a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneDatacenterAndRack.java b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneDatacenterAndRack.java index 5c2b6a7..af26930 100644 --- a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneDatacenterAndRack.java +++ b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneDatacenterAndRack.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.net.URI; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.gossip.GossipSettings; @@ -37,7 +38,7 @@ public class StandAloneDatacenterAndRack extends StandAloneExampleBase { initGossipManager(args); } - public static void main(String[] args) throws InterruptedException, IOException { + public static void main(String[] args) throws IOException { StandAloneDatacenterAndRack example = new StandAloneDatacenterAndRack(args); boolean willRead = true; example.exec(willRead); @@ -61,8 +62,7 @@ public class StandAloneDatacenterAndRack extends StandAloneExampleBase { .uri(URI.create(args[0])) .id(args[1]) .gossipSettings(s) - .gossipMembers( - Arrays.asList(new RemoteMember("mycluster", URI.create(args[2]), args[3]))) + .gossipMembers(List.of(new RemoteMember("mycluster", URI.create(args[2]), args[3]))) .properties(props) .build(); manager.init(); diff --git a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneExampleBase.java b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneExampleBase.java index 1fe2b19..5621ec2 100644 --- a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneExampleBase.java +++ b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneExampleBase.java @@ -23,7 +23,6 @@ import java.io.InputStreamReader; import java.net.URI; import java.util.Collections; import java.util.List; - import org.apache.gossip.GossipSettings; import org.apache.gossip.LocalMember; import org.apache.gossip.RemoteMember; diff --git a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNode.java b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNode.java index 35b1946..5ada7b5 100644 --- a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNode.java +++ b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNode.java @@ -22,20 +22,17 @@ import org.apache.gossip.manager.GossipManager; public class StandAloneNode extends StandAloneExampleBase { - private static boolean WILL_READ = false; - StandAloneNode(String[] args) { args = super.checkArgsForClearFlag(args); super.initGossipManager(args); } - public static void main(String[] args) throws InterruptedException, IOException { + public static void main(String[] args) throws IOException { StandAloneNode example = new StandAloneNode(args); + boolean WILL_READ = false; example.exec(WILL_READ); } @Override - void printValues(GossipManager gossipService) { - } - + void printValues(GossipManager gossipService) {} } diff --git a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNodeCrdtOrSet.java b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNodeCrdtOrSet.java index 8d7c06b..f03f222 100644 --- a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNodeCrdtOrSet.java +++ b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAloneNodeCrdtOrSet.java @@ -18,7 +18,6 @@ package org.apache.gossip.examples; import java.io.IOException; - import org.apache.gossip.crdt.GrowOnlyCounter; import org.apache.gossip.crdt.OrSet; import org.apache.gossip.manager.GossipManager; @@ -35,7 +34,7 @@ public class StandAloneNodeCrdtOrSet extends StandAloneExampleBase { super.initGossipManager(args); } - public static void main(String[] args) throws InterruptedException, IOException { + public static void main(String[] args) throws IOException { StandAloneNodeCrdtOrSet example = new StandAloneNodeCrdtOrSet(args); boolean willRead = true; example.exec(willRead); @@ -53,7 +52,7 @@ public class StandAloneNodeCrdtOrSet extends StandAloneExampleBase { private static void gcount(String val, GossipManager gossipManager) { GrowOnlyCounter c = (GrowOnlyCounter) gossipManager.findCrdt(INDEX_KEY_FOR_COUNTER); - Long l = Long.valueOf(val); + long l = Long.parseLong(val); if (c == null) { c = new GrowOnlyCounter(new GrowOnlyCounter.Builder(gossipManager).increment((l))); } else { @@ -73,7 +72,7 @@ public class StandAloneNodeCrdtOrSet extends StandAloneExampleBase { SharedDataMessage m = new SharedDataMessage(); m.setExpireAt(Long.MAX_VALUE); m.setKey(INDEX_KEY_FOR_SET); - m.setPayload(new OrSet(s, new OrSet.Builder().remove(val))); + m.setPayload(new OrSet<>(s, new OrSet.Builder().remove(val))); m.setTimestamp(System.currentTimeMillis()); gossipService.merge(m); } @@ -82,7 +81,7 @@ public class StandAloneNodeCrdtOrSet extends StandAloneExampleBase { SharedDataMessage m = new SharedDataMessage(); m.setExpireAt(Long.MAX_VALUE); m.setKey(INDEX_KEY_FOR_SET); - m.setPayload(new OrSet(val)); + m.setPayload(new OrSet<>(val)); m.setTimestamp(System.currentTimeMillis()); gossipService.merge(m); } @@ -118,7 +117,7 @@ public class StandAloneNodeCrdtOrSet extends StandAloneExampleBase { valid = false; } } else if (op == 'l') { - if ((val == INDEX_KEY_FOR_SET) || (val == INDEX_KEY_FOR_COUNTER)) { + if ((val.equals(INDEX_KEY_FOR_SET)) || (val.equals(INDEX_KEY_FOR_COUNTER))) { listen(val, getGossipManager()); } else { valid = false; diff --git a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAlonePNCounter.java b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAlonePNCounter.java index 444a9a5..da30901 100644 --- a/gossip-examples/src/main/java/org/apache/gossip/examples/StandAlonePNCounter.java +++ b/gossip-examples/src/main/java/org/apache/gossip/examples/StandAlonePNCounter.java @@ -18,7 +18,6 @@ package org.apache.gossip.examples; import java.io.IOException; - import org.apache.gossip.crdt.PNCounter; import org.apache.gossip.manager.GossipManager; import org.apache.gossip.model.SharedDataMessage; @@ -30,7 +29,7 @@ public class StandAlonePNCounter extends StandAloneExampleBase { super.initGossipManager(args); } - public static void main(String[] args) throws InterruptedException, IOException { + public static void main(String[] args) throws IOException { StandAlonePNCounter example = new StandAlonePNCounter(args); boolean willRead = true; example.exec(willRead); @@ -61,7 +60,7 @@ public class StandAlonePNCounter extends StandAloneExampleBase { if (valid) { if (op == 'i') { increment(l, getGossipManager()); - } else if (op == 'd') { + } else { decrement(l, getGossipManager()); } } diff --git a/gossip-itest/src/test/java/org/apache/gossip/DataTest.java b/gossip-itest/src/test/java/org/apache/gossip/DataTest.java index 3a12390..3a41163 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/DataTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/DataTest.java @@ -52,7 +52,8 @@ public class DataTest { private final String pnCounterKey = "crdtpn"; @BeforeClass - public static void initializeMembers() throws InterruptedException, UnknownHostException, URISyntaxException{ + public static void initializeMembers() + throws InterruptedException, UnknownHostException, URISyntaxException { final int clusterMembers = 2; GossipSettings settings = new GossipSettings(); @@ -60,107 +61,122 @@ public class DataTest { settings.setPersistDataState(false); String cluster = UUID.randomUUID().toString(); List startupMembers = new ArrayList<>(); - for (int i = 0; i < clusterMembers; ++i){ + for (int i = 0; i < clusterMembers; ++i) { int id = i + 1; URI uri = new URI("udp://" + "127.0.0.1" + ":" + (50000 + id)); startupMembers.add(new RemoteMember(cluster, uri, id + "")); } - for (Member member : startupMembers){ - GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster(cluster).uri(member.getUri()) - .id(member.getId()).gossipMembers(startupMembers).gossipSettings(settings).build(); + for (Member member : startupMembers) { + GossipManager gossipService = + GossipManagerBuilder.newBuilder() + .cluster(cluster) + .uri(member.getUri()) + .id(member.getId()) + .gossipMembers(startupMembers) + .gossipSettings(settings) + .build(); clients.add(gossipService); gossipService.init(); } } @AfterClass - public static void shutdownMembers(){ - for (final GossipManager client : clients){ + public static void shutdownMembers() { + for (final GossipManager client : clients) { client.shutdown(); } } @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); + 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( + () -> { + 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"); + TUnit.assertThat( + () -> { + SharedDataMessage x = clients.get(1).findSharedGossipData("a"); + if (x == null) return ""; + else return x.getPayload(); + }) + .afterWaitingAtMost(10, TimeUnit.SECONDS) + .isEqualTo("c"); } - Set setFromList(String... elements){ + Set setFromList(String... elements) { return new HashSet<>(Arrays.asList(elements)); } - void crdtSetTest(String key, Function, CrdtAddRemoveSet, ?>> construct){ - //populate + void crdtSetTest( + String key, Function, CrdtAddRemoveSet, ?>> construct) { + // populate clients.get(0).merge(generateSharedMsg(key, construct.apply(setFromList("1", "2")))); clients.get(1).merge(generateSharedMsg(key, construct.apply(setFromList("3", "4")))); assertMergedCrdt(key, construct.apply(setFromList("1", "2", "3", "4")).value()); - //drop element + // drop element @SuppressWarnings("unchecked") - CrdtAddRemoveSet set = (CrdtAddRemoveSet) clients.get(0).findCrdt(key); + CrdtAddRemoveSet set = + (CrdtAddRemoveSet) clients.get(0).findCrdt(key); clients.get(0).merge(generateSharedMsg(key, set.remove("3"))); - //assert deletion + // assert deletion assertMergedCrdt(key, construct.apply(setFromList("1", "2", "4")).value()); } @Test - public void OrSetTest(){ + public void OrSetTest() { crdtSetTest("cror", OrSet::new); } @Test - public void LWWSetTest(){ + public void LWWSetTest() { crdtSetTest("crlww", LwwSet::new); } @Test - public void MaxChangeSetTest(){ + public void MaxChangeSetTest() { crdtSetTest("crmcs", MaxChangeSet::new); } @Test - public void TwoPhaseSetTest(){ + public void TwoPhaseSetTest() { crdtSetTest("crtps", TwoPhaseSet::new); } @Test - public void GrowOnlyCounterTest(){ - Consumer assertCountUpdated = count -> { - for (GossipManager client : clients){ - TUnit.assertThat(() -> client.findCrdt(gCounterKey)) - .afterWaitingAtMost(10, TimeUnit.SECONDS) - .isEqualTo(new GrowOnlyCounter(new GrowOnlyCounter.Builder(client).increment(count))); - } - }; - //generate different increment + public void GrowOnlyCounterTest() { + Consumer assertCountUpdated = + count -> { + for (GossipManager client : clients) { + TUnit.assertThat(() -> client.findCrdt(gCounterKey)) + .afterWaitingAtMost(10, TimeUnit.SECONDS) + .isEqualTo( + new GrowOnlyCounter(new GrowOnlyCounter.Builder(client).increment(count))); + } + }; + // generate different increment Object payload = new GrowOnlyCounter(new GrowOnlyCounter.Builder(clients.get(0)).increment(1L)); clients.get(0).merge(generateSharedMsg(gCounterKey, payload)); payload = new GrowOnlyCounter(new GrowOnlyCounter.Builder(clients.get(1)).increment(2L)); @@ -168,30 +184,39 @@ public class DataTest { assertCountUpdated.accept((long) 3); - //update one + // update one GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(1).findCrdt(gCounterKey); - GrowOnlyCounter gc2 = new GrowOnlyCounter(gc, - new GrowOnlyCounter.Builder(clients.get(1)).increment(4L)); + GrowOnlyCounter gc2 = + new GrowOnlyCounter(gc, new GrowOnlyCounter.Builder(clients.get(1)).increment(4L)); clients.get(1).merge(generateSharedMsg(gCounterKey, gc2)); assertCountUpdated.accept((long) 7); } @Test - public void PNCounterTest(){ - Consumer> counterUpdate = list -> { - int clientIndex = 0; - for (int delta : list){ - PNCounter c = (PNCounter) clients.get(clientIndex).findCrdt(pnCounterKey); - c = new PNCounter(c, new PNCounter.Builder(clients.get(clientIndex)).increment(((long) delta))); - clients.get(clientIndex).merge(generateSharedMsg(pnCounterKey, c)); - clientIndex = (clientIndex + 1) % clients.size(); - } - }; + public void PNCounterTest() { + Consumer> counterUpdate = + list -> { + int clientIndex = 0; + for (int delta : list) { + PNCounter c = (PNCounter) clients.get(clientIndex).findCrdt(pnCounterKey); + c = + new PNCounter( + c, new PNCounter.Builder(clients.get(clientIndex)).increment(((long) delta))); + clients.get(clientIndex).merge(generateSharedMsg(pnCounterKey, c)); + clientIndex = (clientIndex + 1) % clients.size(); + } + }; // given PNCounter - clients.get(0).merge(generateSharedMsg(pnCounterKey, new PNCounter(new PNCounter.Builder(clients.get(0))))); - clients.get(1).merge(generateSharedMsg(pnCounterKey, new PNCounter(new PNCounter.Builder(clients.get(1))))); + clients + .get(0) + .merge( + generateSharedMsg(pnCounterKey, new PNCounter(new PNCounter.Builder(clients.get(0))))); + clients + .get(1) + .merge( + generateSharedMsg(pnCounterKey, new PNCounter(new PNCounter.Builder(clients.get(1))))); assertMergedCrdt(pnCounterKey, (long) 0); @@ -203,28 +228,29 @@ public class DataTest { Long[] expectedResults = {5L, 7L, 9L, 3L}; - for (int i = 0; i < updateLists.size(); i++){ + for (int i = 0; i < updateLists.size(); i++) { counterUpdate.accept(updateLists.get(i)); assertMergedCrdt(pnCounterKey, expectedResults[i]); } } @Test - public void GrowOnlySetTest(){ + public void GrowOnlySetTest() { clients.get(0).merge(generateSharedMsg("cr", new GrowOnlySet<>(Arrays.asList("1")))); clients.get(1).merge(generateSharedMsg("cr", new GrowOnlySet<>(Arrays.asList("2")))); assertMergedCrdt("cr", new GrowOnlySet<>(Arrays.asList("1", "2")).value()); } - private void assertMergedCrdt(String key, Object expected){ - for (GossipManager client : clients){ + private void assertMergedCrdt(String key, Object expected) { + for (GossipManager client : clients) { TUnit.assertThat(() -> client.findCrdt(key).value()) - .afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(expected); + .afterWaitingAtMost(10, TimeUnit.SECONDS) + .isEqualTo(expected); } } - private PerNodeDataMessage generatePerNodeMsg(String key, Object payload){ + private PerNodeDataMessage generatePerNodeMsg(String key, Object payload) { PerNodeDataMessage g = new PerNodeDataMessage(); g.setExpireAt(Long.MAX_VALUE); g.setKey(key); @@ -233,7 +259,7 @@ public class DataTest { return g; } - private SharedDataMessage generateSharedMsg(String key, Object payload){ + private SharedDataMessage generateSharedMsg(String key, Object payload) { SharedDataMessage d = new SharedDataMessage(); d.setKey(key); d.setPayload(payload); @@ -241,4 +267,4 @@ public class DataTest { d.setTimestamp(System.currentTimeMillis()); return d; } -} \ No newline at end of file +} diff --git a/gossip-itest/src/test/java/org/apache/gossip/IdAndPropertyTest.java b/gossip-itest/src/test/java/org/apache/gossip/IdAndPropertyTest.java index e2455d1..6bedc0a 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/IdAndPropertyTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/IdAndPropertyTest.java @@ -17,6 +17,7 @@ */ package org.apache.gossip; +import io.teknek.tunit.TUnit; import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; @@ -26,14 +27,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; - import org.apache.gossip.manager.DatacenterRackAwareActiveGossiper; import org.apache.gossip.manager.GossipManager; import org.apache.gossip.manager.GossipManagerBuilder; import org.junit.jupiter.api.Test; -import io.teknek.tunit.TUnit; - public class IdAndPropertyTest extends AbstractIntegrationBase { @Test diff --git a/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataEventTest.java b/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataEventTest.java index 7ccf733..2867bcc 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataEventTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataEventTest.java @@ -18,6 +18,12 @@ package org.apache.gossip; import io.teknek.tunit.TUnit; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.*; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; import org.apache.gossip.manager.GossipManager; import org.apache.gossip.manager.GossipManagerBuilder; import org.apache.gossip.model.PerNodeDataMessage; @@ -26,13 +32,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.UnknownHostException; -import java.util.*; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - @RunWith(Parameterized.class) public class PerNodeDataEventTest extends AbstractIntegrationBase { diff --git a/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataReplicationControlTest.java b/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataReplicationControlTest.java index 003d87f..45f1088 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataReplicationControlTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/PerNodeDataReplicationControlTest.java @@ -18,6 +18,11 @@ package org.apache.gossip; import io.teknek.tunit.TUnit; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.*; +import java.util.concurrent.TimeUnit; import org.apache.gossip.manager.DatacenterRackAwareActiveGossiper; import org.apache.gossip.manager.GossipManager; import org.apache.gossip.manager.GossipManagerBuilder; @@ -25,12 +30,6 @@ import org.apache.gossip.model.PerNodeDataMessage; import org.apache.gossip.replication.*; import org.junit.Test; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.UnknownHostException; -import java.util.*; -import java.util.concurrent.TimeUnit; - public class PerNodeDataReplicationControlTest extends AbstractIntegrationBase { @Test diff --git a/gossip-itest/src/test/java/org/apache/gossip/SharedDataEventTest.java b/gossip-itest/src/test/java/org/apache/gossip/SharedDataEventTest.java index b4a0ac3..68f40fe 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/SharedDataEventTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/SharedDataEventTest.java @@ -35,7 +35,7 @@ import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class SharedDataEventTest extends AbstractIntegrationBase { - + private String receivedKey = ""; private Object receivingNodeDataNewValue = ""; private Object receivingNodeDataOldValue = ""; @@ -51,14 +51,12 @@ public class SharedDataEventTest extends AbstractIntegrationBase { @Parameterized.Parameters(name = "{index} bulkTransfer={1}") public static Collection data() { - return Arrays.asList(new Object[][]{ - {50000, false}, {55000, true} - }); + return Arrays.asList(new Object[][] {{50000, false}, {55000, true}}); } - + @Test public void sharedDataEventTest() - throws InterruptedException, UnknownHostException, URISyntaxException { + throws InterruptedException, UnknownHostException, URISyntaxException { GossipSettings settings = new GossipSettings(); settings.setPersistRingState(false); settings.setPersistDataState(false); @@ -74,41 +72,52 @@ public class SharedDataEventTest extends AbstractIntegrationBase { final int clusterMembers = 2; for (int i = 1; i < clusterMembers + 1; ++i) { URI uri = new URI("udp://" + "127.0.0.1" + ":" + (base + i)); - GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster(cluster).uri(uri) - .id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build(); + GossipManager gossipService = + GossipManagerBuilder.newBuilder() + .cluster(cluster) + .uri(uri) + .id(i + "") + .gossipMembers(startupMembers) + .gossipSettings(settings) + .build(); clients.add(gossipService); gossipService.init(); register(gossipService); } - + // check whether the members are discovered - TUnit.assertThat(() -> { - int total = 0; - for (int i = 0; i < clusterMembers; ++i) { - total += clients.get(i).getLiveMembers().size(); - } - return total; - }).afterWaitingAtMost(20, TimeUnit.SECONDS).isEqualTo(2); - + TUnit.assertThat( + () -> { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + }) + .afterWaitingAtMost(20, TimeUnit.SECONDS) + .isEqualTo(2); + // Adding new data to Node 1 clients.get(0).gossipSharedData(sharedNodeData("category", "distributed")); - + // Node 2 is interested in data changes for the key "organization" and "category" - clients.get(1).registerSharedDataSubscriber((key, oldValue, newValue) -> { - if (!key.equals("organization") && !key.equals("category")) - return; - receivedKey = key; - receivingNodeDataOldValue = oldValue; - receivingNodeDataNewValue = newValue; - lock.release(); - }); - + clients + .get(1) + .registerSharedDataSubscriber( + (key, oldValue, newValue) -> { + if (!key.equals("organization") && !key.equals("category")) return; + receivedKey = key; + receivingNodeDataOldValue = oldValue; + receivingNodeDataNewValue = newValue; + lock.release(); + }); + // Node 2 first time gets shared data lock.tryAcquire(10, TimeUnit.SECONDS); Assert.assertEquals("category", receivedKey); Assert.assertEquals(null, receivingNodeDataOldValue); Assert.assertEquals("distributed", receivingNodeDataNewValue); - + // Node 1 adds new per node data clients.get(0).gossipSharedData(sharedNodeData("organization", "apache")); // Node 2 adds new shared data @@ -116,21 +125,20 @@ public class SharedDataEventTest extends AbstractIntegrationBase { Assert.assertEquals("organization", receivedKey); Assert.assertEquals(null, receivingNodeDataOldValue); Assert.assertEquals("apache", receivingNodeDataNewValue); - + // Node 1 updates its value clients.get(0).gossipSharedData(sharedNodeData("organization", "apache-gossip")); - + // Node 2 updates existing value lock.tryAcquire(10, TimeUnit.SECONDS); Assert.assertEquals("organization", receivedKey); Assert.assertEquals("apache", receivingNodeDataOldValue); Assert.assertEquals("apache-gossip", receivingNodeDataNewValue); - } - + @Test public void CrdtDataChangeEventTest() - throws InterruptedException, UnknownHostException, URISyntaxException { + throws InterruptedException, UnknownHostException, URISyntaxException { GossipSettings settings = new GossipSettings(); settings.setPersistRingState(false); settings.setPersistDataState(false); @@ -145,29 +153,41 @@ public class SharedDataEventTest extends AbstractIntegrationBase { final int clusterMembers = 3; for (int i = 1; i < clusterMembers + 1; ++i) { URI uri = new URI("udp://" + "127.0.0.1" + ":" + (base + i)); - GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster(cluster).uri(uri) - .id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build(); + GossipManager gossipService = + GossipManagerBuilder.newBuilder() + .cluster(cluster) + .uri(uri) + .id(i + "") + .gossipMembers(startupMembers) + .gossipSettings(settings) + .build(); clients.add(gossipService); gossipService.init(); register(gossipService); } - + // check whether the members are discovered - TUnit.assertThat(() -> { - int total = 0; - for (int i = 0; i < clusterMembers; ++i) { - total += clients.get(i).getLiveMembers().size(); - } - return total; - }).afterWaitingAtMost(20, TimeUnit.SECONDS).isEqualTo(2); - - clients.get(1).registerSharedDataSubscriber((key, oldValue, newValue) -> { - receivedKey = key; - receivingNodeDataOldValue = oldValue; - receivingNodeDataNewValue = newValue; - lock.release(); - }); - + TUnit.assertThat( + () -> { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + }) + .afterWaitingAtMost(20, TimeUnit.SECONDS) + .isEqualTo(2); + + clients + .get(1) + .registerSharedDataSubscriber( + (key, oldValue, newValue) -> { + receivedKey = key; + receivingNodeDataOldValue = oldValue; + receivingNodeDataNewValue = newValue; + lock.release(); + }); + // Add initial gCounter to Node 1 SharedDataMessage d = new SharedDataMessage(); d.setKey(gCounterKey); @@ -175,37 +195,39 @@ public class SharedDataEventTest extends AbstractIntegrationBase { d.setExpireAt(Long.MAX_VALUE); d.setTimestamp(System.currentTimeMillis()); clients.get(0).merge(d); - + // Check if initial Crdt received lock.tryAcquire(10, TimeUnit.SECONDS); Assert.assertEquals("gCounter", receivedKey); Assert.assertEquals(null, receivingNodeDataOldValue); Assert.assertTrue(receivingNodeDataNewValue instanceof GrowOnlyCounter); Assert.assertEquals(1, ((GrowOnlyCounter) receivingNodeDataNewValue).value().longValue()); - + // check whether Node 3 received the gCounter - TUnit.assertThat(() -> { - GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(2).findCrdt(gCounterKey); - if (gc == null) { - return ""; - } else { - return gc; - } - }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo( - new GrowOnlyCounter(new GrowOnlyCounter.Builder(clients.get(0)).increment(1L))); - + TUnit.assertThat( + () -> { + GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(2).findCrdt(gCounterKey); + if (gc == null) { + return ""; + } else { + return gc; + } + }) + .afterWaitingAtMost(10, TimeUnit.SECONDS) + .isEqualTo(new GrowOnlyCounter(new GrowOnlyCounter.Builder(clients.get(0)).increment(1L))); + // Node 3 Updates the gCounter by 4 GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(2).findCrdt(gCounterKey); - GrowOnlyCounter gcNew = new GrowOnlyCounter(gc, - new GrowOnlyCounter.Builder(clients.get(2)).increment(4L)); - + GrowOnlyCounter gcNew = + new GrowOnlyCounter(gc, new GrowOnlyCounter.Builder(clients.get(2)).increment(4L)); + d = new SharedDataMessage(); d.setKey(gCounterKey); d.setPayload(gcNew); d.setExpireAt(Long.MAX_VALUE); d.setTimestamp(System.currentTimeMillis()); clients.get(2).merge(d); - + // Check if Node 3's Crdt update is received in Node 2 event handler lock.tryAcquire(10, TimeUnit.SECONDS); Assert.assertEquals("gCounter", receivedKey); @@ -213,9 +235,8 @@ public class SharedDataEventTest extends AbstractIntegrationBase { Assert.assertEquals(1, ((GrowOnlyCounter) receivingNodeDataOldValue).value().longValue()); Assert.assertTrue(receivingNodeDataNewValue instanceof GrowOnlyCounter); Assert.assertEquals(5, ((GrowOnlyCounter) receivingNodeDataNewValue).value().longValue()); - } - + private SharedDataMessage sharedNodeData(String key, String value) { SharedDataMessage g = new SharedDataMessage(); g.setExpireAt(Long.MAX_VALUE); @@ -224,5 +245,4 @@ public class SharedDataEventTest extends AbstractIntegrationBase { g.setTimestamp(System.currentTimeMillis()); return g; } - } diff --git a/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java b/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java index 6081ee4..48c2a29 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/SharedDataLockTest.java @@ -17,13 +17,6 @@ */ package org.apache.gossip; -import org.apache.gossip.lock.exceptions.VoteFailedException; -import org.apache.gossip.manager.GossipManager; -import org.apache.gossip.manager.GossipManagerBuilder; -import org.apache.gossip.model.SharedDataMessage; -import org.junit.Assert; -import org.junit.Test; - import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; @@ -31,6 +24,12 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; +import org.apache.gossip.lock.exceptions.VoteFailedException; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.manager.GossipManagerBuilder; +import org.apache.gossip.model.SharedDataMessage; +import org.junit.Assert; +import org.junit.Test; public class SharedDataLockTest extends AbstractIntegrationBase { diff --git a/gossip-itest/src/test/java/org/apache/gossip/SharedDataReplicationControlTest.java b/gossip-itest/src/test/java/org/apache/gossip/SharedDataReplicationControlTest.java index a3ec1d1..a2deb86 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/SharedDataReplicationControlTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/SharedDataReplicationControlTest.java @@ -44,8 +44,7 @@ import java.util.concurrent.TimeUnit; public class SharedDataReplicationControlTest extends AbstractIntegrationBase { @Test - public void sharedDataReplicationTest() - throws URISyntaxException { + public void sharedDataReplicationTest() throws URISyntaxException { generateStandardNodes(3); // check whether the members are discovered diff --git a/gossip-itest/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java b/gossip-itest/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java index 34a87ac..8610481 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java @@ -38,8 +38,7 @@ public class ShutdownDeadtimeTest { // harm), and the // sleep that happens after startup. @Test - public void DeadNodesDoNotComeAliveAgain() - throws InterruptedException, URISyntaxException { + public void DeadNodesDoNotComeAliveAgain() throws InterruptedException, URISyntaxException { GossipSettings settings = new GossipSettings(100, 10000, 1000, 1, 10.0, "normal", false); settings.setPersistRingState(false); settings.setPersistDataState(false); @@ -68,13 +67,13 @@ public class ShutdownDeadtimeTest { Thread.sleep(1000); } TUnit.assertThat( - () -> { - int total = 0; - for (int i = 0; i < clusterMembers; ++i) { - total += clients.get(i).getLiveMembers().size(); - } - return total; - }) + () -> { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + }) .afterWaitingAtMost(40, TimeUnit.SECONDS) .isEqualTo(20); @@ -86,25 +85,25 @@ public class ShutdownDeadtimeTest { final String shutdownId = clients.get(randomClientId).getMyself().getId(); clients.get(randomClientId).shutdown(); TUnit.assertThat( - () -> { - int total = 0; - for (int i = 0; i < clusterMembers; ++i) { - total += clients.get(i).getLiveMembers().size(); - } - return total; - }) + () -> { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + }) .afterWaitingAtMost(40, TimeUnit.SECONDS) .isEqualTo(16); clients.remove(randomClientId); TUnit.assertThat( - () -> { - int total = 0; - for (int i = 0; i < clusterMembers - 1; ++i) { - total += clients.get(i).getDeadMembers().size(); - } - return total; - }) + () -> { + int total = 0; + for (int i = 0; i < clusterMembers - 1; ++i) { + total += clients.get(i).getDeadMembers().size(); + } + return total; + }) .afterWaitingAtMost(50, TimeUnit.SECONDS) .isEqualTo(4); @@ -123,13 +122,13 @@ public class ShutdownDeadtimeTest { // verify that the client is alive again for every node TUnit.assertThat( - () -> { - int total = 0; - for (int i = 0; i < clusterMembers; ++i) { - total += clients.get(i).getLiveMembers().size(); - } - return total; - }) + () -> { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + }) .afterWaitingAtMost(60, TimeUnit.SECONDS) .isEqualTo(20); diff --git a/gossip-itest/src/test/java/org/apache/gossip/SignedMessageTest.java b/gossip-itest/src/test/java/org/apache/gossip/SignedMessageTest.java index a3b3e7c..58b62f7 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/SignedMessageTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/SignedMessageTest.java @@ -17,6 +17,7 @@ */ package org.apache.gossip; +import io.teknek.tunit.TUnit; import java.io.File; import java.io.IOException; import java.net.URI; @@ -28,7 +29,6 @@ import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.concurrent.TimeUnit; - import org.apache.gossip.manager.GossipManager; import org.apache.gossip.manager.GossipManagerBuilder; import org.apache.gossip.manager.PassiveGossipConstants; @@ -36,8 +36,6 @@ import org.apache.gossip.secure.KeyTool; import org.junit.Assert; import org.junit.Test; -import io.teknek.tunit.TUnit; - public class SignedMessageTest extends AbstractIntegrationBase { private GossipSettings gossiperThatSigns() { diff --git a/gossip-itest/src/test/java/org/apache/gossip/StartupSettingsTest.java b/gossip-itest/src/test/java/org/apache/gossip/StartupSettingsTest.java index 3eb1851..e2ef245 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/StartupSettingsTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/StartupSettingsTest.java @@ -17,18 +17,16 @@ */ package org.apache.gossip; -import lombok.extern.slf4j.Slf4j; -import org.apache.gossip.manager.GossipManager; -import org.apache.gossip.manager.GossipManagerBuilder; - -import org.junit.jupiter.api.Test; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.UUID; +import lombok.extern.slf4j.Slf4j; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.manager.GossipManagerBuilder; +import org.junit.jupiter.api.Test; /** Tests support of using {@code StartupSettings} and thereby reading setup config from file. */ @Slf4j diff --git a/gossip-itest/src/test/java/org/apache/gossip/TenNodeThreeSeedTest.java b/gossip-itest/src/test/java/org/apache/gossip/TenNodeThreeSeedTest.java index d9f5fa8..84e18b6 100644 --- a/gossip-itest/src/test/java/org/apache/gossip/TenNodeThreeSeedTest.java +++ b/gossip-itest/src/test/java/org/apache/gossip/TenNodeThreeSeedTest.java @@ -18,7 +18,6 @@ package org.apache.gossip; import io.teknek.tunit.TUnit; - import java.net.URI; import java.net.URISyntaxException; import java.net.UnknownHostException; diff --git a/gossip-protocol-jackson/src/main/java/org/apache/gossip/protocol/json/JacksonProtocolManager.java b/gossip-protocol-jackson/src/main/java/org/apache/gossip/protocol/json/JacksonProtocolManager.java index f3dd3f7..5c4f4f8 100644 --- a/gossip-protocol-jackson/src/main/java/org/apache/gossip/protocol/json/JacksonProtocolManager.java +++ b/gossip-protocol-jackson/src/main/java/org/apache/gossip/protocol/json/JacksonProtocolManager.java @@ -21,13 +21,6 @@ import com.codahale.metrics.Meter; import com.codahale.metrics.MetricRegistry; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.gossip.GossipSettings; -import org.apache.gossip.crdt.CrdtModule; -import org.apache.gossip.manager.PassiveGossipConstants; -import org.apache.gossip.model.Base; -import org.apache.gossip.model.SignedPayload; -import org.apache.gossip.protocol.ProtocolManager; - import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -40,6 +33,12 @@ import java.security.Signature; import java.security.SignatureException; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; +import org.apache.gossip.GossipSettings; +import org.apache.gossip.crdt.CrdtModule; +import org.apache.gossip.manager.PassiveGossipConstants; +import org.apache.gossip.model.Base; +import org.apache.gossip.model.SignedPayload; +import org.apache.gossip.protocol.ProtocolManager; // this class is constructed by reflection in GossipManager. public class JacksonProtocolManager implements ProtocolManager { diff --git a/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/JacksonTest.java b/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/JacksonTest.java index e37df32..e318463 100644 --- a/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/JacksonTest.java +++ b/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/JacksonTest.java @@ -18,6 +18,8 @@ package org.apache.gossip.protocol.json; +import static org.junit.jupiter.api.Assertions.*; + import com.codahale.metrics.MetricRegistry; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; @@ -38,8 +40,6 @@ import org.apache.gossip.protocol.ProtocolManager; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - public class JacksonTest { private static GossipSettings simpleSettings(GossipSettings settings) { diff --git a/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/TestMessage.java b/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/TestMessage.java index 5d14268..1ed415b 100644 --- a/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/TestMessage.java +++ b/gossip-protocol-jackson/src/test/java/org/apache/gossip/protocol/json/TestMessage.java @@ -17,15 +17,13 @@ */ package org.apache.gossip.protocol.json; -import lombok.Data; -import lombok.Getter; -import org.apache.gossip.model.Base; -import org.apache.gossip.udp.Trackable; - import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import lombok.Data; +import org.apache.gossip.model.Base; +import org.apache.gossip.udp.Trackable; /* * Here is a test class for serialization. I've tried to include a lot of things in it including nested classes. diff --git a/gossip-transport-udp/src/main/java/org/apache/gossip/transport/udp/UdpTransportManager.java b/gossip-transport-udp/src/main/java/org/apache/gossip/transport/udp/UdpTransportManager.java index 306ffb1..969e930 100644 --- a/gossip-transport-udp/src/main/java/org/apache/gossip/transport/udp/UdpTransportManager.java +++ b/gossip-transport-udp/src/main/java/org/apache/gossip/transport/udp/UdpTransportManager.java @@ -17,12 +17,6 @@ */ package org.apache.gossip.transport.udp; -import lombok.extern.slf4j.Slf4j; -import org.apache.gossip.manager.GossipCore; -import org.apache.gossip.manager.GossipManager; -import org.apache.gossip.model.Base; -import org.apache.gossip.transport.AbstractTransportManager; - import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; @@ -32,6 +26,11 @@ import java.net.SocketAddress; import java.net.SocketException; import java.net.URI; import java.util.concurrent.atomic.AtomicBoolean; +import lombok.extern.slf4j.Slf4j; +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; +import org.apache.gossip.transport.AbstractTransportManager; /** * This class is constructed by reflection in GossipManager. It manages transport (byte read/write)