diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-01-27 18:29:26 +0100 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-01-27 18:29:26 +0100 |
commit | 1383166dd80b8cec4d7b20e81725eaa219717d5d (patch) | |
tree | 0142b81524da3d88a2ccf53178229ff8f195c731 /src | |
parent | e3599820c3a2bcd85053f186128ba65d0ceab5a9 (diff) |
Filter our contact when gossipping
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java | 37 |
1 files 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<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() { |