http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageHandler.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageHandler.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageHandler.java new file mode 100644 index 0000000..4b5d49d --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageHandler.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; + +public interface MessageHandler { + void invoke(GossipCore gossipCore, GossipManager gossipManager, Base base); +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvoker.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvoker.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvoker.java new file mode 100644 index 0000000..70be408 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvoker.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; + +public interface MessageInvoker { + /** + * + * @param gossipCore + * @param gossipManager + * @param base + * @return true if the invoker processed the message type + */ + boolean invoke(GossipCore gossipCore, GossipManager gossipManager, Base base); +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvokerCombiner.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvokerCombiner.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvokerCombiner.java new file mode 100644 index 0000000..5faf6a5 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/MessageInvokerCombiner.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +public class MessageInvokerCombiner implements MessageInvoker { + private final List<MessageInvoker> invokers = new CopyOnWriteArrayList<>(); + + public MessageInvokerCombiner() { + } + + public boolean invoke(GossipCore gossipCore, GossipManager gossipManager, Base base) { + return invokers.stream().filter((mi) -> mi.invoke(gossipCore, gossipManager, base)).count() > 0; + } + + public void clear() { + invokers.clear(); + } + + public void add(MessageInvoker mi) { + if (mi == null) { + throw new NullPointerException(); + } + invokers.add(mi); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/PerNodeDataMessageHandler.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/PerNodeDataMessageHandler.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/PerNodeDataMessageHandler.java new file mode 100644 index 0000000..b3a785e --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/PerNodeDataMessageHandler.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; +import org.apache.gossip.udp.UdpPerNodeDataMessage; + +public class PerNodeDataMessageHandler implements MessageHandler { + @Override + public void invoke(GossipCore gossipCore, GossipManager gossipManager, Base base) { + UdpPerNodeDataMessage message = (UdpPerNodeDataMessage) base; + gossipCore.addPerNodeData(message); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ResponseHandler.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ResponseHandler.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ResponseHandler.java new file mode 100644 index 0000000..2f33b01 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ResponseHandler.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; +import org.apache.gossip.udp.Trackable; + +public class ResponseHandler implements MessageHandler { + @Override + public void invoke(GossipCore gossipCore, GossipManager gossipManager, Base base) { + if (base instanceof Trackable) { + Trackable t = (Trackable) base; + gossipCore.handleResponse(t.getUuid() + "/" + t.getUriFrom(), (Base) t); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SharedDataMessageHandler.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SharedDataMessageHandler.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SharedDataMessageHandler.java new file mode 100644 index 0000000..89ca4a0 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SharedDataMessageHandler.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; +import org.apache.gossip.udp.UdpSharedDataMessage; + +public class SharedDataMessageHandler implements MessageHandler{ + @Override + public void invoke(GossipCore gossipCore, GossipManager gossipManager, Base base) { + UdpSharedDataMessage message = (UdpSharedDataMessage) base; + gossipCore.addSharedData(message); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ShutdownMessageHandler.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ShutdownMessageHandler.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ShutdownMessageHandler.java new file mode 100644 index 0000000..a40c7a1 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/ShutdownMessageHandler.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; +import org.apache.gossip.model.PerNodeDataMessage; +import org.apache.gossip.model.ShutdownMessage; + +public class ShutdownMessageHandler implements MessageHandler { + @Override + public void invoke(GossipCore gossipCore, GossipManager gossipManager, Base base) { + ShutdownMessage s = (ShutdownMessage) base; + PerNodeDataMessage m = new PerNodeDataMessage(); + m.setKey(ShutdownMessage.PER_NODE_KEY); + m.setNodeId(s.getNodeId()); + m.setPayload(base); + m.setTimestamp(System.currentTimeMillis()); + m.setExpireAt(System.currentTimeMillis() + 30L * 1000L); + gossipCore.addPerNodeData(m); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SimpleMessageInvoker.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SimpleMessageInvoker.java b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SimpleMessageInvoker.java new file mode 100644 index 0000000..0f410d2 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/handlers/SimpleMessageInvoker.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.handlers; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.model.Base; + +public class SimpleMessageInvoker implements MessageInvoker { + final private Class<?> messageClass; + final private MessageHandler messageHandler; + + public SimpleMessageInvoker(Class<?> messageClass, MessageHandler messageHandler) { + if (messageClass == null || messageHandler == null) { + throw new NullPointerException(); + } + this.messageClass = messageClass; + this.messageHandler = messageHandler; + } + + @Override + public boolean invoke(GossipCore gossipCore, GossipManager gossipManager, Base base) { + if (messageClass.isAssignableFrom(base.getClass())) { + messageHandler.invoke(gossipCore, gossipManager, base); + return true; + } else { + return false; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java b/gossip-base/src/main/java/org/apache/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java new file mode 100644 index 0000000..dff5056 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/manager/impl/OnlyProcessReceivedPassiveGossipThread.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.impl; + +import org.apache.gossip.manager.GossipCore; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.manager.PassiveGossipThread; +import org.apache.log4j.Logger; + +public class OnlyProcessReceivedPassiveGossipThread extends PassiveGossipThread { + + public static final Logger LOGGER = Logger.getLogger(OnlyProcessReceivedPassiveGossipThread.class); + + public OnlyProcessReceivedPassiveGossipThread(GossipManager gossipManager, GossipCore gossipCore) { + super(gossipManager, gossipCore); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipMessage.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipMessage.java b/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipMessage.java new file mode 100644 index 0000000..a3c45b8 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipMessage.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +import java.util.ArrayList; +import java.util.List; + +public class ActiveGossipMessage extends Base { + + private List<Member> members = new ArrayList<>(); + + public ActiveGossipMessage(){ + + } + + public List<Member> getMembers() { + return members; + } + + public void setMembers(List<Member> members) { + this.members = members; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipOk.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipOk.java b/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipOk.java new file mode 100644 index 0000000..b54bf9a --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/ActiveGossipOk.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class ActiveGossipOk extends Response { + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/Base.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..1b66310 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/Base.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +import org.apache.gossip.udp.UdpActiveGossipMessage; +import org.apache.gossip.udp.UdpActiveGossipOk; +import org.apache.gossip.udp.UdpPerNodeDataMessage; +import org.apache.gossip.udp.UdpNotAMemberFault; +import org.apache.gossip.udp.UdpSharedDataMessage; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonSubTypes.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 = UdpPerNodeDataMessage.class, name = "UdpPerNodeDataMessage"), + @Type(value = SharedDataMessage.class, name = "SharedDataMessage"), + @Type(value = UdpSharedDataMessage.class, name = "UdpSharedDataMessage") + }) +public class Base { + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/Fault.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/Fault.java b/gossip-base/src/main/java/org/apache/gossip/model/Fault.java new file mode 100644 index 0000000..3ba2508 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/Fault.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public abstract class Fault extends Response { + + private String exception; + + public Fault(){} + + public String getException() { + return exception; + } + + public void setException(String exception) { + this.exception = exception; + } + + @Override + public String toString() { + return "Fault [exception=" + exception + "]"; + } + +} + http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/Member.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/Member.java b/gossip-base/src/main/java/org/apache/gossip/model/Member.java new file mode 100644 index 0000000..d86aad8 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/Member.java @@ -0,0 +1,87 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +import java.util.Map; + +public class Member { + + private String cluster; + private String uri; + private String id; + private Long heartbeat; + private Map<String,String> properties; + + public Member(){ + + } + + public Member(String cluster, String uri, String id, Long heartbeat){ + this.cluster = cluster; + this.uri = uri; + this.id = id; + this.heartbeat = heartbeat; + } + + public String getCluster() { + return cluster; + } + + public void setCluster(String cluster) { + this.cluster = cluster; + } + + public String getUri() { + return uri; + } + + public void setUri(String uri) { + this.uri = uri; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Long getHeartbeat() { + return heartbeat; + } + + public void setHeartbeat(Long heartbeat) { + this.heartbeat = heartbeat; + } + + public Map<String, String> getProperties() { + return properties; + } + + public void setProperties(Map<String, String> properties) { + this.properties = properties; + } + + @Override + public String toString() { + return "Member [cluster=" + cluster + ", uri=" + uri + ", id=" + id + ", heartbeat=" + + heartbeat + ", properties=" + properties + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/Message.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/Message.java b/gossip-base/src/main/java/org/apache/gossip/model/Message.java new file mode 100644 index 0000000..f6ed813 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/Message.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class Message extends Base { + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/NotAMemberFault.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/NotAMemberFault.java b/gossip-base/src/main/java/org/apache/gossip/model/NotAMemberFault.java new file mode 100644 index 0000000..21ffb07 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/NotAMemberFault.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class NotAMemberFault extends Fault { + + public NotAMemberFault(){ + + } + + public NotAMemberFault(String message){ + this.setException(message); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/PerNodeDataMessage.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/PerNodeDataMessage.java b/gossip-base/src/main/java/org/apache/gossip/model/PerNodeDataMessage.java new file mode 100644 index 0000000..2d1cdef --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/PerNodeDataMessage.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class PerNodeDataMessage extends Base { + + private String nodeId; + private String key; + private Object payload; + private Long timestamp; + private Long expireAt; + + 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; + } + @Override + public String toString() { + return "GossipDataMessage [nodeId=" + nodeId + ", key=" + key + ", payload=" + payload + + ", timestamp=" + timestamp + ", expireAt=" + expireAt + "]"; + } + + + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/Response.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/Response.java b/gossip-base/src/main/java/org/apache/gossip/model/Response.java new file mode 100644 index 0000000..b3eef77 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/Response.java @@ -0,0 +1,22 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public abstract class Response extends Base { + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/SharedDataMessage.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..e423be8 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/SharedDataMessage.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class SharedDataMessage extends Base { + + private String nodeId; + private String key; + private Object payload; + private Long timestamp; + private Long expireAt; + + 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; + } + @Override + public String toString() { + return "SharedGossipDataMessage [nodeId=" + nodeId + ", key=" + key + ", payload=" + payload + + ", timestamp=" + timestamp + ", expireAt=" + expireAt + "]"; + } +} + http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/ShutdownMessage.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/ShutdownMessage.java b/gossip-base/src/main/java/org/apache/gossip/model/ShutdownMessage.java new file mode 100644 index 0000000..4bca508 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/ShutdownMessage.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class ShutdownMessage extends Message { + + public static final String PER_NODE_KEY = "gossipcore.shutdowmessage"; + private long shutdownAtNanos; + private String nodeId; + + public ShutdownMessage(){ + + } + + public String getNodeId() { + return nodeId; + } + + public void setNodeId(String nodeId) { + this.nodeId = nodeId; + } + + public long getShutdownAtNanos() { + return shutdownAtNanos; + } + + public void setShutdownAtNanos(long shutdownAtNanos) { + this.shutdownAtNanos = shutdownAtNanos; + } + + @Override + public String toString() { + return "ShutdownMessage [shutdownAtNanos=" + shutdownAtNanos + ", nodeId=" + nodeId + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/model/SignedPayload.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/model/SignedPayload.java b/gossip-base/src/main/java/org/apache/gossip/model/SignedPayload.java new file mode 100644 index 0000000..9ffbcf1 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/model/SignedPayload.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.model; + +public class SignedPayload extends Base{ + private byte [] data; + private byte [] signature; + public byte[] getData() { + return data; + } + public void setData(byte[] data) { + this.data = data; + } + public byte[] getSignature() { + return signature; + } + public void setSignature(byte[] signature) { + this.signature = signature; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/secure/KeyTool.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/secure/KeyTool.java b/gossip-base/src/main/java/org/apache/gossip/secure/KeyTool.java new file mode 100644 index 0000000..69f4e72 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/secure/KeyTool.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.secure; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.SecureRandom; + +public class KeyTool { + + public static void generatePubandPrivateKeyFiles(String path, String id) + throws NoSuchAlgorithmException, NoSuchProviderException, IOException{ + SecureRandom r = new SecureRandom(); + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN"); + keyGen.initialize(1024, r); + KeyPair pair = keyGen.generateKeyPair(); + PrivateKey priv = pair.getPrivate(); + PublicKey pub = pair.getPublic(); + { + FileOutputStream sigfos = new FileOutputStream(new File(path, id)); + sigfos.write(priv.getEncoded()); + sigfos.close(); + } + { + FileOutputStream sigfos = new FileOutputStream(new File(path, id + ".pub")); + sigfos.write(pub.getEncoded()); + sigfos.close(); + } + } + + public static void main (String [] args) throws + NoSuchAlgorithmException, NoSuchProviderException, IOException{ + generatePubandPrivateKeyFiles(args[0], args[1]); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/udp/Trackable.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/udp/Trackable.java b/gossip-base/src/main/java/org/apache/gossip/udp/Trackable.java new file mode 100644 index 0000000..9ecc7f2 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/udp/Trackable.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.udp; + +public interface Trackable { + + String getUriFrom(); + + void setUriFrom(String uriFrom); + + String getUuid(); + + void setUuid(String uuid); + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipMessage.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipMessage.java b/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipMessage.java new file mode 100644 index 0000000..b6e8101 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipMessage.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.udp; + +import org.apache.gossip.model.ActiveGossipMessage; + +public class UdpActiveGossipMessage extends ActiveGossipMessage implements Trackable { + + private String uriFrom; + private String uuid; + + public String getUriFrom() { + return uriFrom; + } + + public void setUriFrom(String uriFrom) { + this.uriFrom = uriFrom; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "UdpActiveGossipMessage [uriFrom=" + uriFrom + ", uuid=" + uuid + ", getMembers()=" + + getMembers() + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipOk.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipOk.java b/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipOk.java new file mode 100644 index 0000000..b70bb69 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/udp/UdpActiveGossipOk.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.udp; + +import org.apache.gossip.model.ActiveGossipOk; + +public class UdpActiveGossipOk extends ActiveGossipOk implements Trackable { + + + private String uriFrom; + private String uuid; + + public String getUriFrom() { + return uriFrom; + } + + public void setUriFrom(String uriFrom) { + this.uriFrom = uriFrom; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/udp/UdpNotAMemberFault.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..7afcb87 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/udp/UdpNotAMemberFault.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.udp; + +import org.apache.gossip.model.NotAMemberFault; + +public class UdpNotAMemberFault extends NotAMemberFault implements Trackable{ + + public UdpNotAMemberFault(){ + + } + private String uriFrom; + private String uuid; + + public String getUriFrom() { + return uriFrom; + } + + public void setUriFrom(String uriFrom) { + this.uriFrom = uriFrom; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/udp/UdpPerNodeDataMessage.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/udp/UdpPerNodeDataMessage.java b/gossip-base/src/main/java/org/apache/gossip/udp/UdpPerNodeDataMessage.java new file mode 100644 index 0000000..6eb170a --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/udp/UdpPerNodeDataMessage.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.udp; + +import org.apache.gossip.model.PerNodeDataMessage; + +public class UdpPerNodeDataMessage extends PerNodeDataMessage implements Trackable { + + private String uriFrom; + private String uuid; + + public String getUriFrom() { + return uriFrom; + } + + public void setUriFrom(String uriFrom) { + this.uriFrom = uriFrom; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "UdpGossipDataMessage [uriFrom=" + uriFrom + ", uuid=" + uuid + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/java/org/apache/gossip/udp/UdpSharedDataMessage.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/java/org/apache/gossip/udp/UdpSharedDataMessage.java b/gossip-base/src/main/java/org/apache/gossip/udp/UdpSharedDataMessage.java new file mode 100644 index 0000000..1658503 --- /dev/null +++ b/gossip-base/src/main/java/org/apache/gossip/udp/UdpSharedDataMessage.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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.udp; + +import org.apache.gossip.model.SharedDataMessage; + +public class UdpSharedDataMessage extends SharedDataMessage implements Trackable { + + private String uriFrom; + private String uuid; + + public String getUriFrom() { + return uriFrom; + } + + public void setUriFrom(String uriFrom) { + this.uriFrom = uriFrom; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "UdpSharedGossipDataMessage [uriFrom=" + uriFrom + ", uuid=" + uuid + ", getNodeId()=" + + getNodeId() + ", getKey()=" + getKey() + ", getPayload()=" + getPayload() + + ", getTimestamp()=" + getTimestamp() + ", getExpireAt()=" + getExpireAt() + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/main/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/gossip-base/src/main/resources/log4j.properties b/gossip-base/src/main/resources/log4j.properties new file mode 100644 index 0000000..e2a60e1 --- /dev/null +++ b/gossip-base/src/main/resources/log4j.properties @@ -0,0 +1,20 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# 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. + +log4j.rootLogger=INFO,stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%5p %d{HH:mm:ss,SSS} %m%n + +log4j.logger.io.teknek=DEBUG +log4j.logger.com.google.code.gossip=INFO http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java b/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java new file mode 100644 index 0000000..896157f --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/AbstractIntegrationBase.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.gossip.manager.GossipManager; +import org.junit.After; +import org.junit.Before; + +public abstract class AbstractIntegrationBase { + + List <GossipManager> nodes = new ArrayList<GossipManager>(); + + public void register(GossipManager manager){ + nodes.add(manager); + } + + @Before + public void before(){ + nodes = new ArrayList<GossipManager>(); + } + + @After + public void after(){ + for (GossipManager node: nodes){ + if (node !=null){ + node.shutdown(); + } + } + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/DataTest.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/DataTest.java b/gossip-base/src/test/java/org/apache/gossip/DataTest.java new file mode 100644 index 0000000..f0c2186 --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/DataTest.java @@ -0,0 +1,238 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +import org.apache.gossip.crdt.GrowOnlyCounter; +import org.apache.gossip.crdt.GrowOnlySet; +import org.apache.gossip.crdt.OrSet; +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.manager.GossipManagerBuilder; +import org.apache.gossip.model.PerNodeDataMessage; +import org.apache.gossip.model.SharedDataMessage; +import org.junit.Test; + +import io.teknek.tunit.TUnit; + +public class DataTest extends AbstractIntegrationBase { + + private String orSetKey = "cror"; + private String gCounterKey = "crdtgc"; + + @Test + public void dataTest() throws InterruptedException, UnknownHostException, URISyntaxException{ + GossipSettings settings = new GossipSettings(); + settings.setPersistRingState(false); + settings.setPersistDataState(false); + String cluster = UUID.randomUUID().toString(); + int seedNodes = 1; + List<Member> startupMembers = new ArrayList<>(); + for (int i = 1; i < seedNodes+1; ++i) { + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (50000 + i)); + startupMembers.add(new RemoteMember(cluster, uri, i + "")); + } + final List<GossipManager> clients = new ArrayList<>(); + final int clusterMembers = 2; + for (int i = 1; i < clusterMembers + 1; ++i) { + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (50000 + i)); + GossipManager gossipService = GossipManagerBuilder.newBuilder().cluster(cluster).uri(uri) + .id(i + "").gossipMembers(startupMembers).gossipSettings(settings).build(); + clients.add(gossipService); + gossipService.init(); + register(gossipService); + } + 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(0).gossipPerNodeData(msg()); + clients.get(0).gossipSharedData(sharedMsg()); + + TUnit.assertThat(()-> { + PerNodeDataMessage x = clients.get(1).findPerNodeGossipData(1 + "", "a"); + if (x == null) + return ""; + else + return x.getPayload(); + }).afterWaitingAtMost(20, TimeUnit.SECONDS).isEqualTo("b"); + + TUnit.assertThat(() -> { + SharedDataMessage x = clients.get(1).findSharedGossipData("a"); + if (x == null) + return ""; + else + return x.getPayload(); + }).afterWaitingAtMost(20, TimeUnit.SECONDS).isEqualTo("c"); + + + givenDifferentDatumsInSet(clients); + assertThatListIsMerged(clients); + + givenOrs(clients); + assertThatOrSetIsMerged(clients); + dropIt(clients); + assertThatOrSetDelIsMerged(clients); + + + // test g counter + givenDifferentIncrement(clients); + assertThatCountIsUpdated(clients, 3); + givenIncreaseOther(clients); + assertThatCountIsUpdated(clients, 7); + + for (int i = 0; i < clusterMembers; ++i) { + clients.get(i).shutdown(); + } + } + + private void givenDifferentIncrement(final List<GossipManager> clients) { + { + SharedDataMessage d = new SharedDataMessage(); + d.setKey(gCounterKey); + d.setPayload(new GrowOnlyCounter(new GrowOnlyCounter.Builder(clients.get(0)).increment(1L))); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + clients.get(0).merge(d); + } + { + SharedDataMessage d = new SharedDataMessage(); + d.setKey(gCounterKey); + d.setPayload(new GrowOnlyCounter(new GrowOnlyCounter.Builder(clients.get(1)).increment(2L))); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + clients.get(1).merge(d); + } + } + + private void givenIncreaseOther(final List<GossipManager> clients) { + GrowOnlyCounter gc = (GrowOnlyCounter) clients.get(1).findCrdt(gCounterKey); + GrowOnlyCounter gc2 = new GrowOnlyCounter(gc, + new GrowOnlyCounter.Builder(clients.get(1)).increment(4L)); + + SharedDataMessage d = new SharedDataMessage(); + d.setKey(gCounterKey); + d.setPayload(gc2); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + clients.get(1).merge(d); + } + + private void givenOrs(List<GossipManager> clients) { + { + SharedDataMessage d = new SharedDataMessage(); + d.setKey(orSetKey); + d.setPayload(new OrSet<String>("1", "2")); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + clients.get(0).merge(d); + } + { + SharedDataMessage d = new SharedDataMessage(); + d.setKey(orSetKey); + d.setPayload(new OrSet<String>("3", "4")); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + clients.get(1).merge(d); + } + } + + private void dropIt(List<GossipManager> clients) { + @SuppressWarnings("unchecked") + OrSet<String> o = (OrSet<String>) clients.get(0).findCrdt(orSetKey); + OrSet<String> o2 = new OrSet<String>(o, new OrSet.Builder<String>().remove("3")); + SharedDataMessage d = new SharedDataMessage(); + d.setKey(orSetKey); + d.setPayload(o2); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + clients.get(0).merge(d); + } + + private void assertThatOrSetIsMerged(final List<GossipManager> clients){ + TUnit.assertThat(() -> { + return clients.get(0).findCrdt(orSetKey).value(); + }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(new OrSet<String>("1", "2", "3", "4").value()); + TUnit.assertThat(() -> { + return clients.get(1).findCrdt(orSetKey).value(); + }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(new OrSet<String>("1", "2", "3", "4").value()); + } + + private void assertThatOrSetDelIsMerged(final List<GossipManager> clients){ + TUnit.assertThat(() -> { + return clients.get(0).findCrdt(orSetKey); + }).afterWaitingAtMost(10, TimeUnit.SECONDS).equals(new OrSet<String>("1", "2", "4")); + } + + private void givenDifferentDatumsInSet(final List<GossipManager> clients){ + clients.get(0).merge(CrdtMessage("1")); + clients.get(1).merge(CrdtMessage("2")); + } + + + private void assertThatCountIsUpdated(final List<GossipManager> clients, long finalCount) { + TUnit.assertThat(() -> { + return clients.get(0).findCrdt(gCounterKey); + }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(new GrowOnlyCounter( + new GrowOnlyCounter.Builder(clients.get(0)).increment(finalCount))); + } + + private void assertThatListIsMerged(final List<GossipManager> clients){ + TUnit.assertThat(() -> { + return clients.get(0).findCrdt("cr"); + }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo(new GrowOnlySet<String>(Arrays.asList("1","2"))); + } + + private SharedDataMessage CrdtMessage(String item){ + SharedDataMessage d = new SharedDataMessage(); + d.setKey("cr"); + d.setPayload(new GrowOnlySet<String>( Arrays.asList(item))); + d.setExpireAt(Long.MAX_VALUE); + d.setTimestamp(System.currentTimeMillis()); + return d; + } + + private PerNodeDataMessage msg(){ + PerNodeDataMessage g = new PerNodeDataMessage(); + g.setExpireAt(Long.MAX_VALUE); + g.setKey("a"); + g.setPayload("b"); + g.setTimestamp(System.currentTimeMillis()); + return g; + } + + private SharedDataMessage sharedMsg(){ + SharedDataMessage g = new SharedDataMessage(); + g.setExpireAt(Long.MAX_VALUE); + g.setKey("a"); + g.setPayload("c"); + g.setTimestamp(System.currentTimeMillis()); + return g; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/IdAndPropertyTest.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/IdAndPropertyTest.java b/gossip-base/src/test/java/org/apache/gossip/IdAndPropertyTest.java new file mode 100644 index 0000000..7f550de --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/IdAndPropertyTest.java @@ -0,0 +1,91 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +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 org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; + +import io.teknek.tunit.TUnit; + +@RunWith(JUnitPlatform.class) +public class IdAndPropertyTest extends AbstractIntegrationBase { + + @Test + public void testDatacenterRackGossiper() throws URISyntaxException, UnknownHostException, InterruptedException { + GossipSettings settings = new GossipSettings(); + settings.setActiveGossipClass(DatacenterRackAwareActiveGossiper.class.getName()); + List<Member> startupMembers = new ArrayList<>(); + Map<String, String> x = new HashMap<>(); + x.put("a", "b"); + x.put("datacenter", "dc1"); + x.put("rack", "rack1"); + GossipManager gossipService1 = GossipManagerBuilder.newBuilder() + .cluster("a") + .uri(new URI("udp://" + "127.0.0.1" + ":" + (29000 + 0))) + .id("0") + .properties(x) + .gossipMembers(startupMembers) + .gossipSettings(settings).build(); + gossipService1.init(); + register(gossipService1); + + Map<String, String> y = new HashMap<>(); + y.put("a", "c"); + y.put("datacenter", "dc2"); + y.put("rack", "rack2"); + GossipManager gossipService2 = GossipManagerBuilder.newBuilder().cluster("a") + .uri( new URI("udp://" + "127.0.0.1" + ":" + (29000 + 10))) + .id("1") + .properties(y) + .gossipMembers(Arrays.asList(new RemoteMember("a", + new URI("udp://" + "127.0.0.1" + ":" + (29000 + 0)), "0"))) + .gossipSettings(settings).build(); + gossipService2.init(); + register(gossipService2); + + TUnit.assertThat(() -> { + String value = ""; + try { + value = gossipService1.getLiveMembers().get(0).getProperties().get("a"); + } catch (RuntimeException e){ } + return value; + }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo("c"); + + TUnit.assertThat(() -> { + String value = ""; + try { + value = gossipService2.getLiveMembers().get(0).getProperties().get("a"); + } catch (RuntimeException e){ } + return value; + }).afterWaitingAtMost(10, TimeUnit.SECONDS).isEqualTo("b"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/MemberTest.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/MemberTest.java b/gossip-base/src/test/java/org/apache/gossip/MemberTest.java new file mode 100644 index 0000000..5f0d18a --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/MemberTest.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.HashMap; + +import org.junit.Assert; +import org.junit.jupiter.api.Test; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; + +@RunWith(JUnitPlatform.class) +public class MemberTest { + + @Test + public void testHashCodeFromGossip40() throws URISyntaxException { + Assert.assertNotEquals( + new LocalMember("mycluster", new URI("udp://4.4.4.4:1000"), "myid", 1, new HashMap<String,String>(), 10, 5, "exponential") + .hashCode(), + new LocalMember("mycluster", new URI("udp://4.4.4.5:1005"), "yourid", 11, new HashMap<String,String>(), 11, 6, "exponential") + .hashCode()); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java b/gossip-base/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java new file mode 100644 index 0000000..54005c3 --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/ShutdownDeadtimeTest.java @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import io.teknek.tunit.TUnit; + +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.manager.GossipManagerBuilder; +import org.apache.log4j.Logger; + +import org.junit.platform.runner.JUnitPlatform; +import org.junit.jupiter.api.Test; + +import org.junit.runner.RunWith; + +@RunWith(JUnitPlatform.class) +public class ShutdownDeadtimeTest { + + private static final Logger log = Logger.getLogger(ShutdownDeadtimeTest.class); + + @Test + public void DeadNodesDoNotComeAliveAgain() + throws InterruptedException, UnknownHostException, URISyntaxException { + GossipSettings settings = new GossipSettings(100, 10000, 1000, 1, 10.0, "normal"); + settings.setPersistRingState(false); + settings.setPersistDataState(false); + String cluster = UUID.randomUUID().toString(); + int seedNodes = 3; + List<Member> startupMembers = new ArrayList<>(); + for (int i = 1; i < seedNodes + 1; ++i) { + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (30300 + i)); + startupMembers.add(new RemoteMember(cluster, uri, i + "")); + } + final List<GossipManager> clients = Collections.synchronizedList(new ArrayList<GossipManager>()); + final int clusterMembers = 5; + for (int i = 1; i < clusterMembers + 1; ++i) { + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (30300 + i)); + GossipManager gossipService = GossipManagerBuilder.newBuilder() + .cluster(cluster) + .uri(uri) + .id(i + "") + .gossipMembers(startupMembers) + .gossipSettings(settings) + .build(); + clients.add(gossipService); + gossipService.init(); + + } + TUnit.assertThat(new Callable<Integer>() { + public Integer call() throws Exception { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + } + }).afterWaitingAtMost(40, TimeUnit.SECONDS).isEqualTo(20); + + // shutdown one client and verify that one client is lost. + Random r = new Random(); + int randomClientId = r.nextInt(clusterMembers); + log.info("shutting down " + randomClientId); + final int shutdownPort = clients.get(randomClientId).getMyself().getUri() + .getPort(); + final String shutdownId = clients.get(randomClientId).getMyself().getId(); + clients.get(randomClientId).shutdown(); + TUnit.assertThat(new Callable<Integer>() { + public Integer call() throws Exception { + 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(new Callable<Integer>() { + public Integer call() throws Exception { + 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); + + URI uri = new URI("udp://" + "127.0.0.1" + ":" + shutdownPort); + // start client again + GossipManager gossipService = GossipManagerBuilder.newBuilder() + .gossipSettings(settings) + .cluster(cluster) + .uri(uri) + .id(shutdownId+"") + .gossipMembers(startupMembers) + .build(); + clients.add(gossipService); + gossipService.init(); + + // verify that the client is alive again for every node + TUnit.assertThat(new Callable<Integer>() { + public Integer call() throws Exception { + int total = 0; + for (int i = 0; i < clusterMembers; ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + } + }).afterWaitingAtMost(60, TimeUnit.SECONDS).isEqualTo(20); + + for (int i = 0; i < clusterMembers; ++i) { + final int j = i; + new Thread() { + public void run(){ + clients.get(j).shutdown(); + } + }.start(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/SignedMessageTest.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/SignedMessageTest.java b/gossip-base/src/test/java/org/apache/gossip/SignedMessageTest.java new file mode 100644 index 0000000..5c3bb76 --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/SignedMessageTest.java @@ -0,0 +1,135 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.util.ArrayList; +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; +import org.apache.gossip.secure.KeyTool; +import org.junit.Assert; +import org.junit.Test; + +import io.teknek.tunit.TUnit; + +public class SignedMessageTest extends AbstractIntegrationBase { + + @Test(expected = IllegalArgumentException.class) + public void ifSignMustHaveKeys() + throws URISyntaxException, UnknownHostException, InterruptedException { + String cluster = UUID.randomUUID().toString(); + GossipSettings settings = gossiperThatSigns(); + List<Member> startupMembers = new ArrayList<>(); + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (30000 + 1)); + GossipManager gossipService = GossipManagerBuilder.newBuilder() + .cluster(cluster) + .uri(uri) + .id(1 + "") + .gossipMembers(startupMembers) + .gossipSettings(settings) + .build(); + gossipService.init(); + } + + private GossipSettings gossiperThatSigns(){ + GossipSettings settings = new GossipSettings(); + settings.setPersistRingState(false); + settings.setPersistDataState(false); + settings.setSignMessages(true); + return settings; + } + + private GossipSettings gossiperThatSigns(String keysDir){ + GossipSettings settings = gossiperThatSigns(); + settings.setPathToKeyStore(Objects.requireNonNull(keysDir)); + return settings; + } + + @Test + public void dataTest() throws InterruptedException, URISyntaxException, NoSuchAlgorithmException, NoSuchProviderException, IOException { + final String keys = System.getProperty("java.io.tmpdir") + "/keys"; + GossipSettings settings = gossiperThatSigns(keys); + setup(keys); + String cluster = UUID.randomUUID().toString(); + List<Member> startupMembers = new ArrayList<>(); + for (int i = 1; i < 2; ++i) { + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (30000 + i)); + startupMembers.add(new RemoteMember(cluster, uri, i + "")); + } + final List<GossipManager> clients = new ArrayList<>(); + for (int i = 1; i < 3; ++i) { + URI uri = new URI("udp://" + "127.0.0.1" + ":" + (30000 + i)); + GossipManager gossipService = GossipManagerBuilder.newBuilder() + .cluster(cluster) + .uri(uri) + .id(i + "") + .gossipMembers(startupMembers) + .gossipSettings(settings) + .build(); + gossipService.init(); + clients.add(gossipService); + } + assertTwoAlive(clients); + assertOnlySignedMessages(clients); + cleanup(keys, clients); + } + + private void assertTwoAlive(List<GossipManager> clients){ + TUnit.assertThat(() -> { + int total = 0; + for (int i = 0; i < clients.size(); ++i) { + total += clients.get(i).getLiveMembers().size(); + } + return total; + }).afterWaitingAtMost(20, TimeUnit.SECONDS).isEqualTo(2); + } + + private void assertOnlySignedMessages(List<GossipManager> clients){ + Assert.assertEquals(0, clients.get(0).getRegistry() + .meter(PassiveGossipConstants.UNSIGNED_MESSAGE).getCount()); + Assert.assertTrue(clients.get(0).getRegistry() + .meter(PassiveGossipConstants.SIGNED_MESSAGE).getCount() > 0); + } + + private void cleanup(String keys, List<GossipManager> clients){ + new File(keys, "1").delete(); + new File(keys, "2").delete(); + new File(keys).delete(); + for (int i = 0; i < clients.size(); ++i) { + clients.get(i).shutdown(); + } + } + + private void setup(String keys) throws NoSuchAlgorithmException, NoSuchProviderException, IOException { + new File(keys).mkdir(); + KeyTool.generatePubandPrivateKeyFiles(keys, "1"); + KeyTool.generatePubandPrivateKeyFiles(keys, "2"); + } +} http://git-wip-us.apache.org/repos/asf/incubator-gossip/blob/298b1ae3/gossip-base/src/test/java/org/apache/gossip/StartupSettingsTest.java ---------------------------------------------------------------------- diff --git a/gossip-base/src/test/java/org/apache/gossip/StartupSettingsTest.java b/gossip-base/src/test/java/org/apache/gossip/StartupSettingsTest.java new file mode 100644 index 0000000..d6c4a1e --- /dev/null +++ b/gossip-base/src/test/java/org/apache/gossip/StartupSettingsTest.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * 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; + +import org.apache.gossip.manager.GossipManager; +import org.apache.gossip.manager.GossipManagerBuilder; +import org.apache.log4j.Logger; + +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 org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; + +/** + * Tests support of using {@code StartupSettings} and thereby reading + * setup config from file. + */ +@RunWith(JUnitPlatform.class) +public class StartupSettingsTest { + private static final Logger log = Logger.getLogger(StartupSettingsTest.class); + private static final String CLUSTER = UUID.randomUUID().toString(); + + @Test + public void testUsingSettingsFile() throws IOException, InterruptedException, URISyntaxException { + File settingsFile = File.createTempFile("gossipTest",".json"); + settingsFile.deleteOnExit(); + writeSettingsFile(settingsFile); + URI uri = new URI("udp://" + "127.0.0.1" + ":" + 50000); + GossipManager firstService = GossipManagerBuilder.newBuilder() + .cluster(CLUSTER) + .uri(uri) + .id("1") + .gossipSettings(new GossipSettings()).build(); + firstService.init(); + GossipManager manager = GossipManagerBuilder.newBuilder() + .startupSettings(StartupSettings.fromJSONFile(settingsFile)).build(); + manager.init(); + firstService.shutdown(); + manager.shutdown(); + } + + private void writeSettingsFile( File target ) throws IOException { + String settings = + "[{\n" + // It is odd that this is meant to be in an array, but oh well. + " \"cluster\":\"" + CLUSTER + "\",\n" + + " \"id\":\"" + "2" + "\",\n" + + " \"uri\":\"udp://127.0.0.1:50001\",\n" + + " \"gossip_interval\":1000,\n" + + " \"window_size\":1000,\n" + + " \"minimum_samples\":5,\n" + + " \"cleanup_interval\":10000,\n" + + " \"convict_threshold\":2.6,\n" + + " \"distribution\":\"exponential\",\n" + + " \"properties\":{},\n" + + " \"members\":[\n" + + " {\"cluster\": \"" + CLUSTER + "\",\"uri\":\"udp://127.0.0.1:5000\"}\n" + + " ]\n" + + "}]"; + + log.info( "Using settings file with contents of:\n---\n" + settings + "\n---" ); + FileOutputStream output = new FileOutputStream(target); + output.write(settings.getBytes()); + output.close(); + } +}
