m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.gradle4
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java37
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java5
3 files changed, 41 insertions, 5 deletions
diff --git a/build.gradle b/build.gradle
index 201f249..143bae9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -55,11 +55,11 @@ Example: -DfallbackContacts=\{\"/uw/violet07\":[192,168,0,11]}
escape at the beginning and before "
*/
ext.fallbackContacts = {
- return System.getProperty("fallbackContacts") ?: "{\"" + zonePath() + "\":[127,0,0,1]}"
+ return System.getProperty("fallbackContacts") ?: "{}"
}
ext.ownAddr = {
- return System.getProperty("ownZone") ?: "localhost"
+ return System.getProperty("ownAddr") ?: "localhost"
}
/*
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java
index 4d8842f..1087b8a 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java
@@ -14,11 +14,13 @@ public class HierarchyConfig {
private GossipGirlStrategies gossipGirlStrategies;
private GossipGirlStrategies.ZoneSelectionStrategy zoneSelectionStrategy;
private Random random = new Random();
+ private PathName ourPath;
private EventBus eventBus;
HierarchyConfig(EventBus eventBus, String zonePath, String zoneStrategy) {
zoneSelectionStrategy = parseStrategy(zoneStrategy);
- gossipGirlStrategies = new GossipGirlStrategies(new PathName(zonePath));
+ ourPath = new PathName(zonePath);
+ gossipGirlStrategies = new GossipGirlStrategies(ourPath);
this.eventBus = eventBus;
}
@@ -81,9 +83,25 @@ public class HierarchyConfig {
ZMI zmi = selectZMI(siblings);
ValueSet contactsValue = (ValueSet) zmi.getAttributes().getOrNull("contacts");
Set<Value> valueSet = contactsValue.getValue();
+ filterOurContact(valueSet);
return selectContactFromSet(valueSet);
}
+ private void filterOurContact(Set<Value> contacts) {
+ Iterator it = contacts.iterator();
+ while (it.hasNext()) {
+ Value value = (Value) it.next();
+ if (value.getType().getPrimaryType() == Type.PrimaryType.CONTACT) {
+ ValueContact contact = (ValueContact) value;
+ if (!contact.getName().equals(ourPath)) {
+ it.remove();
+ }
+ } else {
+ System.out.println("WARN: non contact value passed to filterOurContact");
+ }
+ }
+ }
+
private StateMessage getState() throws Exception {
CompletableFuture<ResponseMessage> responseFuture = new CompletableFuture();
this.eventBus.addMessage(new RequestStateMessage("", 0, responseFuture));
@@ -143,12 +161,27 @@ public class HierarchyConfig {
while (iterator.hasNext()) {
ZMI zmi = iterator.next();
ValueSet contacts = (ValueSet) zmi.getAttributes().getOrNull("contacts");
- if (contacts == null || contacts.isNull() || contacts.isEmpty()) {
+ if (contacts == null || contacts.isNull() || contacts.isEmpty() || onlyContactIsUs(contacts)) {
iterator.remove();
}
}
}
+ private boolean onlyContactIsUs(ValueSet contacts) {
+ for (Value value : contacts) {
+ if (value.getType().getPrimaryType() == Type.PrimaryType.CONTACT) {
+ ValueContact contact = (ValueContact) value;
+ if (!contact.getName().equals(ourPath)) {
+ return true;
+ }
+ } else {
+ System.out.println("WARN: non contact value passed to onlyContactIsUs");
+ }
+ }
+
+ return false;
+ }
+
public void startQueries(long queriesPeriod) {
Supplier<TimerScheduledTask> taskSupplier = () ->
new TimerScheduledTask() {
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java b/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java
index 096e4e3..8916b13 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java
@@ -114,9 +114,12 @@ public class Fetcher {
api.setFallbackContacts(ClientController.parseContactsString(fallbackContactsString));
ValueContact initialContact = new ValueContact(new PathName(zonePath), InetAddress.getByName(ownAddr));
- api.setAttributeValue(zonePath, "contacts", initialContact);
+ Set<Value> initialContacts = new HashSet();
+ initialContacts.add(initialContact);
+ ValueSet initialContactsValue = new ValueSet(initialContacts, TypePrimitive.CONTACT);
while((jsonAttribs = bufferRead.readLine()) != null) {
+ api.setAttributeValue(zonePath, "contacts", initialContactsValue);
System.out.println(jsonAttribs);
System.out.flush();
deserializedAttribs = deserializeAttribs(jsonAttribs);