From 1383166dd80b8cec4d7b20e81725eaa219717d5d Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Mon, 27 Jan 2020 18:29:26 +0100
Subject: Filter our contact when gossipping

---
 .../mimuw/cloudatlas/agent/HierarchyConfig.java    | 37 ++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

(limited to 'src/main/java')

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() {
-- 
cgit v1.2.3