From 1df1cbf93448ed7d446e3f9e192f86f7dd99708b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Sat, 11 Jan 2020 19:36:42 +0100 Subject: Split agent to config classes --- .../mimuw/cloudatlas/agent/HierarchyConfig.java | 171 +++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.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 new file mode 100644 index 0000000..1ee9ac2 --- /dev/null +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java @@ -0,0 +1,171 @@ +package pl.edu.mimuw.cloudatlas.agent; + +import pl.edu.mimuw.cloudatlas.agent.messages.*; +import pl.edu.mimuw.cloudatlas.agent.modules.GossipGirl; +import pl.edu.mimuw.cloudatlas.agent.modules.GossipGirlStrategies; +import pl.edu.mimuw.cloudatlas.agent.modules.RecursiveScheduledTask; +import pl.edu.mimuw.cloudatlas.agent.modules.TimerScheduledTask; +import pl.edu.mimuw.cloudatlas.interpreter.Main; +import pl.edu.mimuw.cloudatlas.model.*; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class HierarchyConfig { + private GossipGirlStrategies gossipGirlStrategies; + private GossipGirlStrategies.ZoneSelectionStrategy zoneSelectionStrategy; + private Random random = new Random(); + private EventBus eventBus; + + HierarchyConfig(EventBus eventBus) { + zoneSelectionStrategy = GossipGirlStrategies.ZoneSelectionStrategy.ROUND_ROBIN_SAME_FREQ; + gossipGirlStrategies = new GossipGirlStrategies(new PathName("/uw/violet07")); + this.eventBus = eventBus; + } + + public void startGossip(long gossipPeriod) { + Supplier taskSupplier = () -> + new TimerScheduledTask() { + public void run() { + try { + System.out.println("INFO: initiating gossip"); + PathName gossipLevel = gossipGirlStrategies.selectStrategy(zoneSelectionStrategy); + ValueContact contact = selectContactFromLevel(gossipLevel); + if (contact != null) { + System.out.println("INFO: found a contact " + contact.toString()); + InitiateGossipMessage message = new InitiateGossipMessage("", 0, new PathName("/uw/violet07"), contact); + sendMessage(message); + } else { + System.out.println("DEBUG: couldn't find contact for gossip"); + } + } catch (InterruptedException e) { + System.out.println("Interrupted while initiating gossip"); + } catch (Exception e) { + System.out.println("ERROR: something happened " + e.toString()); + } + } + }; + + startRecursiveTask(taskSupplier, gossipPeriod); + } + + private ValueContact selectContactFromLevel(PathName path) throws Exception { + CompletableFuture responseFuture = new CompletableFuture(); + this.eventBus.addMessage(new RequestStateMessage("", 0, responseFuture)); + StateMessage response = (StateMessage) responseFuture.get(); + ZMI root = response.getZMI(); + List siblings = getSiblings(root, path); + filterEmptyContacts(siblings); + if (siblings.isEmpty()) { + return selectFallbackContact(); + } + ZMI zmi = selectZMI(siblings); + ValueSet contactsValue = (ValueSet) zmi.getAttributes().getOrNull("contacts"); + Set valueSet = contactsValue.getValue(); + return selectContactFromSet(valueSet); + } + + // TODO + private ValueContact selectFallbackContact() throws Exception { + return null; + } + + private ZMI selectZMI(List zmis) throws Exception { + int i = random.nextInt(zmis.size()); + for (ZMI zmi : zmis) { + if (i == 0) { + return zmi; + } + i--; + } + System.out.println("ERROR: empty list passed to selectZMI"); + throw new Exception("empty list passed to selectZMI"); + } + + private ValueContact selectContactFromSet(Set contacts) throws Exception { + int i = random.nextInt(contacts.size()); + for (Value contact : contacts) { + if (i == 0) { + return (ValueContact) contact; + } + i--; + } + System.out.println("ERROR: empty list passed to selectContactFromSet"); + throw new Exception("empty list passed to selectContactFromSet"); + } + + private List getSiblings(ZMI root, PathName path) { + try { + List siblingsAndI = root.findDescendant(path).getFather().getSons(); + List siblings = new ArrayList(); + for (ZMI siblingOrI : siblingsAndI) { + if (!siblingOrI.getPathName().equals(path)) { + siblings.add(siblingOrI); + } + } + return siblings; + } catch (ZMI.NoSuchZoneException e) { + System.out.println("ERROR: didn't find path when looking for siblings"); + return new ArrayList(); + } + } + + private void filterEmptyContacts(List zmis) { + Iterator iterator = zmis.iterator(); + while (iterator.hasNext()) { + ZMI zmi = iterator.next(); + ValueSet contacts = (ValueSet) zmi.getAttributes().getOrNull("contacts"); + if (contacts == null || contacts.isNull() || contacts.isEmpty()) { + iterator.remove(); + } + } + } + + public void startRecursiveTask(Supplier taskSupplier, long period) { + TimerScheduledTask timerTask = new RecursiveScheduledTask(period, taskSupplier); + + try { + this.eventBus.addMessage(new TimerSchedulerMessage("", 0, "", period, 0, timerTask)); + } catch (InterruptedException e) { + System.out.println("Interrupted while starting queries"); + } + } + + private void addZoneAndChildren(ZMI zmi, PathName pathName) { + try { + UpdateAttributesMessage message = new UpdateAttributesMessage("", 0, pathName.toString(), zmi.getAttributes()); + this.eventBus.addMessage(message); + for (ZMI son : zmi.getSons()) { + addZoneAndChildren(son, pathName.levelDown(son.getAttributes().getOrNull("name").toString())); + } + } catch (Exception e) { + System.out.println("ERROR: failed to add zone"); + } + } + + public void initZones() { + try { + ZMI root = Main.createTestHierarchy2(); + addZoneAndChildren(root, new PathName("")); + System.out.println("Initialized with test hierarchy"); + } catch (Exception e) { + System.out.println("ERROR: failed to create test hierarchy"); + } + } + + public void startQueries(long queriesPeriod) { + Supplier taskSupplier = () -> + new TimerScheduledTask() { + public void run() { + try { + sendMessage(new RunQueriesMessage("", 0)); + } catch (InterruptedException e) { + System.out.println("Interrupted while triggering queries"); + } + } + }; + + startRecursiveTask(taskSupplier, queriesPeriod); + } +} -- cgit v1.2.3 From 22ec12d762db07b6ecc65462b1e7cb38c8ca1578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Sat, 11 Jan 2020 20:06:14 +0100 Subject: Refactor agent configs nicely --- .../mimuw/cloudatlas/agent/HierarchyConfig.java | 61 ++++++++-------------- 1 file changed, 21 insertions(+), 40 deletions(-) (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.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 1ee9ac2..04b9b5b 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java @@ -1,13 +1,11 @@ package pl.edu.mimuw.cloudatlas.agent; import pl.edu.mimuw.cloudatlas.agent.messages.*; -import pl.edu.mimuw.cloudatlas.agent.modules.GossipGirl; import pl.edu.mimuw.cloudatlas.agent.modules.GossipGirlStrategies; -import pl.edu.mimuw.cloudatlas.agent.modules.RecursiveScheduledTask; import pl.edu.mimuw.cloudatlas.agent.modules.TimerScheduledTask; -import pl.edu.mimuw.cloudatlas.interpreter.Main; import pl.edu.mimuw.cloudatlas.model.*; +import java.lang.reflect.UndeclaredThrowableException; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; @@ -18,12 +16,27 @@ public class HierarchyConfig { private Random random = new Random(); private EventBus eventBus; - HierarchyConfig(EventBus eventBus) { - zoneSelectionStrategy = GossipGirlStrategies.ZoneSelectionStrategy.ROUND_ROBIN_SAME_FREQ; - gossipGirlStrategies = new GossipGirlStrategies(new PathName("/uw/violet07")); + HierarchyConfig(EventBus eventBus, String zonePath, String zoneStrategy) { + zoneSelectionStrategy = parseStrategy(zoneStrategy); + gossipGirlStrategies = new GossipGirlStrategies(new PathName(zonePath)); this.eventBus = eventBus; } + private GossipGirlStrategies.ZoneSelectionStrategy parseStrategy(String selectionStrategy) { + switch (selectionStrategy) { + case "RoundRobinExp": + return GossipGirlStrategies.ZoneSelectionStrategy.ROUND_ROBIN_EXP_FREQ; + case "RoundRobinUniform": + return GossipGirlStrategies.ZoneSelectionStrategy.ROUND_ROBIN_SAME_FREQ; + case "RandomExp": + return GossipGirlStrategies.ZoneSelectionStrategy.RANDOM_DECR_EXP; + case "RandomUniform": + return GossipGirlStrategies.ZoneSelectionStrategy.RANDOM_UNFIORM; + default: + throw new UnsupportedOperationException("Selection strategy doesnt exist"); + } + } + public void startGossip(long gossipPeriod) { Supplier taskSupplier = () -> new TimerScheduledTask() { @@ -47,7 +60,7 @@ public class HierarchyConfig { } }; - startRecursiveTask(taskSupplier, gossipPeriod); + AgentUtils.startRecursiveTask(taskSupplier, gossipPeriod, eventBus); } private ValueContact selectContactFromLevel(PathName path) throws Exception { @@ -122,38 +135,6 @@ public class HierarchyConfig { } } - public void startRecursiveTask(Supplier taskSupplier, long period) { - TimerScheduledTask timerTask = new RecursiveScheduledTask(period, taskSupplier); - - try { - this.eventBus.addMessage(new TimerSchedulerMessage("", 0, "", period, 0, timerTask)); - } catch (InterruptedException e) { - System.out.println("Interrupted while starting queries"); - } - } - - private void addZoneAndChildren(ZMI zmi, PathName pathName) { - try { - UpdateAttributesMessage message = new UpdateAttributesMessage("", 0, pathName.toString(), zmi.getAttributes()); - this.eventBus.addMessage(message); - for (ZMI son : zmi.getSons()) { - addZoneAndChildren(son, pathName.levelDown(son.getAttributes().getOrNull("name").toString())); - } - } catch (Exception e) { - System.out.println("ERROR: failed to add zone"); - } - } - - public void initZones() { - try { - ZMI root = Main.createTestHierarchy2(); - addZoneAndChildren(root, new PathName("")); - System.out.println("Initialized with test hierarchy"); - } catch (Exception e) { - System.out.println("ERROR: failed to create test hierarchy"); - } - } - public void startQueries(long queriesPeriod) { Supplier taskSupplier = () -> new TimerScheduledTask() { @@ -166,6 +147,6 @@ public class HierarchyConfig { } }; - startRecursiveTask(taskSupplier, queriesPeriod); + AgentUtils.startRecursiveTask(taskSupplier, queriesPeriod, eventBus); } } -- cgit v1.2.3