From 1383166dd80b8cec4d7b20e81725eaa219717d5d Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski 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(-) 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 valueSet = contactsValue.getValue(); + filterOurContact(valueSet); return selectContactFromSet(valueSet); } + private void filterOurContact(Set 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 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 taskSupplier = () -> new TimerScheduledTask() { -- cgit v1.2.3