m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java')
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java106
1 files changed, 96 insertions, 10 deletions
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
index 73aef8b..dd8f0b7 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
@@ -1,5 +1,6 @@
package pl.edu.mimuw.cloudatlas.agent.modules;
+import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@@ -14,9 +15,12 @@ import pl.edu.mimuw.cloudatlas.agent.messages.QueryMessage;
import pl.edu.mimuw.cloudatlas.agent.messages.ResponseMessage;
import pl.edu.mimuw.cloudatlas.agent.messages.StateMessage;
import pl.edu.mimuw.cloudatlas.agent.messages.UDUPMessage;
+import pl.edu.mimuw.cloudatlas.agent.messages.UpdateAttributesMessage;
+import pl.edu.mimuw.cloudatlas.agent.messages.UpdateQueriesMessage;
import pl.edu.mimuw.cloudatlas.model.Attribute;
import pl.edu.mimuw.cloudatlas.model.AttributesMap;
import pl.edu.mimuw.cloudatlas.model.PathName;
+import pl.edu.mimuw.cloudatlas.model.ValueContact;
import pl.edu.mimuw.cloudatlas.model.ValueQuery;
import pl.edu.mimuw.cloudatlas.model.ValueTime;
import pl.edu.mimuw.cloudatlas.model.ZMI;
@@ -35,9 +39,18 @@ public class GossipGirl extends Module {
case INITIATE:
initiateGossip((InitiateGossipMessage) message);
break;
+ case HEJKA:
+ receiveGossip((HejkaMessage) message);
+ break;
case NO_CO_TAM:
handleNoCoTam((NoCoTamMessage) message);
break;
+ case ATTRIBUTES:
+ handleAttributes((AttributesMessage) message);
+ break;
+ case QUERY:
+ handleQuery((QueryMessage) message);
+ break;
default:
throw new InvalidMessageType("This type of message cannot be handled by GossipGirl");
}
@@ -62,6 +75,23 @@ public class GossipGirl extends Module {
sendMessage(getState);
}
+ private void receiveGossip(HejkaMessage message) throws InterruptedException {
+ Long gossipId = nextGossipId;
+ nextGossipId++;
+ gossipStates.put(gossipId, new GossipGirlState(
+ gossipId,
+ message.getReceiverPath(),
+ new ValueContact(message.getSenderPath(), message.getSenderAddress()),
+ false
+ )
+ );
+
+ gossipStates.get(gossipId).handleHejka(message);
+
+ GetStateMessage getState = new GetStateMessage("", 0, ModuleType.GOSSIP, gossipId);
+ sendMessage(getState);
+ }
+
private void setState(StateMessage message) throws InterruptedException {
GossipGirlState state = gossipStates.get(message.getRequestId());
if (state != null) {
@@ -71,12 +101,28 @@ public class GossipGirl extends Module {
"",
0,
state.gossipId,
+ state.ourPath,
+ state.theirContact.getName(),
state.getZoneTimestampsToSend(),
state.getQueryTimestampsToSend()
);
UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, hejka);
sendMessage(udupMessage);
state.sentHejka();
+ } else if (state.state == GossipGirlState.State.SEND_NO_CO_TAM) {
+ NoCoTamMessage noCoTam = new NoCoTamMessage(
+ "",
+ 0,
+ state.gossipId,
+ state.theirGossipId,
+ state.getZoneTimestampsToSend(),
+ state.getQueryTimestampsToSend(),
+ state.hejkaSendTimestamp,
+ state.hejkaReceiveTimestamp
+ );
+ UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, noCoTam);
+ sendMessage(udupMessage);
+ state.sentNoCoTam();
}
} else {
System.out.println("ERROR: GossipGirl got state for a nonexistent gossip");
@@ -87,20 +133,60 @@ public class GossipGirl extends Module {
GossipGirlState state = gossipStates.get(message.getReceiverGossipId());
if (state != null) {
state.handleNoCoTam(message);
- for (ZMI zmi : state.getZMIsToSend()) {
- AttributesMessage attributesMessage = new AttributesMessage("", 0, zmi.getPathName(), zmi.getAttributes(), state.theirGossipId);
- UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, attributesMessage);
- sendMessage(udupMessage);
+ sendInfo(state);
+ } else {
+ System.out.println("ERROR: GossipGirl got state for a nonexistent gossip");
+ }
+ }
+
+ private void sendInfo(GossipGirlState state) throws InterruptedException {
+ for (ZMI zmi : state.getZMIsToSend()) {
+ AttributesMessage attributesMessage = new AttributesMessage("", 0, zmi.getPathName(), zmi.getAttributes(), state.theirGossipId);
+ UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, attributesMessage);
+ sendMessage(udupMessage);
+ }
+
+ for (Entry<Attribute, ValueQuery> query : state.getQueriesToSend()) {
+ QueryMessage queryMessage = new QueryMessage("", 0, query.getKey(), query.getValue(), state.theirGossipId);
+ UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, queryMessage);
+ sendMessage(udupMessage);
+ }
+ state.sentInfo();
+ }
+
+ private void handleAttributes(AttributesMessage message) throws InterruptedException {
+ GossipGirlState state = gossipStates.get(message.getReceiverGossipId());
+ if (state != null) {
+ state.gotAttributes(message);
+ if (state.state == GossipGirlState.State.SEND_INFO) {
+ sendInfo(state);
+ }
+ UpdateAttributesMessage updateMessage = new UpdateAttributesMessage("", 0, message.getPath().toString(), message.getAttributes());
+ sendMessage(updateMessage);
+ if (state.state == GossipGirlState.State.FINISHED) {
+ gossipStates.remove(message.getReceiverGossipId());
}
+ } else {
+ System.out.println("ERROR: GossipGirl got attributes for a nonexistent gossip");
+ }
+ }
- for (Entry<Attribute, ValueQuery> query : state.getQueriesToSend()) {
- QueryMessage queryMessage = new QueryMessage("", 0, query.getKey(), query.getValue(), state.theirGossipId);
- UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, queryMessage);
- sendMessage(udupMessage);
+ private void handleQuery(QueryMessage message) throws InterruptedException {
+ GossipGirlState state = gossipStates.get(message.getReceiverGossipId());
+ if (state != null) {
+ state.gotQuery(message.getName());
+ Map<Attribute, Entry<ValueQuery, ValueTime>> queries = new HashMap();
+ queries.put(
+ message.getName(),
+ new SimpleImmutableEntry(message.getQuery(), state.getTheirQueryTimestamp(message.getName()))
+ );
+ UpdateQueriesMessage updateMessage = new UpdateQueriesMessage("", 0, queries);
+ sendMessage(updateMessage);
+ if (state.state == GossipGirlState.State.FINISHED) {
+ gossipStates.remove(message.getReceiverGossipId());
}
- state.sentInfo();
} else {
- System.out.println("ERROR: GossipGirl got state for a nonexistent gossip");
+ System.out.println("ERROR: GossipGirl got query for a nonexistent gossip");
}
}
}