GOSSIP-59 OrSet implementation

This commit is contained in:
Edward Capriolo
2017-02-22 23:35:14 -05:00
parent b71be5e16a
commit 026b8bb488
9 changed files with 551 additions and 22 deletions

View File

@ -119,14 +119,15 @@ public class GossipCore implements GossipCoreConstants {
sharedData.putIfAbsent(message.getKey(), message);
} else {
if (message.getPayload() instanceof Crdt){
SharedGossipDataMessage m = sharedData.get(message.getKey());
SharedGossipDataMessage curretnt = sharedData.get(message.getKey());
SharedGossipDataMessage merged = new SharedGossipDataMessage();
merged.setExpireAt(message.getExpireAt());
merged.setKey(m.getKey());
merged.setKey(curretnt.getKey());
merged.setNodeId(message.getNodeId());
merged.setTimestamp(message.getTimestamp());
merged.setPayload( ((Crdt) message.getPayload()).merge((Crdt)m.getPayload()));
sharedData.put(m.getKey(), merged);
Crdt mergedCrdt = ((Crdt) message.getPayload()).merge((Crdt)curretnt.getPayload());
merged.setPayload( mergedCrdt );
sharedData.put(curretnt.getKey(), merged);
} else {
if (previous.getTimestamp() < message.getTimestamp()) {
sharedData.replace(message.getKey(), previous, message);
@ -370,9 +371,10 @@ public class GossipCore implements GossipCoreConstants {
copy.setExpireAt(message.getExpireAt());
copy.setKey(message.getKey());
copy.setNodeId(message.getNodeId());
copy.setTimestamp(message.getTimestamp());
@SuppressWarnings("unchecked")
Crdt merged = ((Crdt) ret.getPayload()).merge((Crdt) message.getPayload());
message.setPayload(merged);
copy.setPayload(merged);
boolean replaced = sharedData.replace(message.getKey(), ret, copy);
if (replaced){
return merged;

View File

@ -18,9 +18,11 @@
package org.apache.gossip.manager.random;
import com.codahale.metrics.MetricRegistry;
import com.fasterxml.jackson.core.JsonGenerator.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.gossip.GossipMember;
import org.apache.gossip.GossipSettings;
import org.apache.gossip.crdt.CrdtModule;
import org.apache.gossip.event.GossipListener;
import org.apache.gossip.manager.GossipManager;
import org.apache.gossip.manager.handlers.DefaultMessageInvoker;
@ -126,6 +128,8 @@ public class RandomGossipManager extends GossipManager {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping();
objectMapper.registerModule(new CrdtModule());
objectMapper.configure(Feature.WRITE_NUMBERS_AS_STRINGS, false);
}
if (messageInvoker == null) {
messageInvoker = new DefaultMessageInvoker();