From 0953e404e7dacbe397cc60d8715af72bd59b8c1c Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sat, 11 Jan 2020 20:12:34 +0100 Subject: Start implementing gossip cleanup --- .../agent/messages/CleanOldGossipsMessage.java | 16 ++++++++++++++++ .../cloudatlas/agent/messages/GossipGirlMessage.java | 3 ++- .../edu/mimuw/cloudatlas/agent/modules/GossipGirl.java | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/CleanOldGossipsMessage.java (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/CleanOldGossipsMessage.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/CleanOldGossipsMessage.java new file mode 100644 index 0000000..6c3cb7e --- /dev/null +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/CleanOldGossipsMessage.java @@ -0,0 +1,16 @@ +package pl.edu.mimuw.cloudatlas.agent.messages; + +import pl.edu.mimuw.cloudatlas.model.ValueTime; + +public class CleanOldGossipsMessage extends GossipGirlMessage { + private ValueTime ageThreshold; + + public CleanOldGossipsMessage(String messageId, long timestamp, ValueTime ageThreshold) { + super(messageId, timestamp, Type.CLEAN); + this.ageThreshold = ageThreshold; + } + + public ValueTime getAgeThreshold() { + return ageThreshold; + } +} diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java index 03525bb..6255e3b 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java @@ -9,7 +9,8 @@ public abstract class GossipGirlMessage extends AgentMessage { HEJKA, INITIATE, NO_CO_TAM, - QUERY + QUERY, + CLEAN } private Type type; diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java index dd8f0b7..175c238 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java @@ -2,6 +2,7 @@ package pl.edu.mimuw.cloudatlas.agent.modules; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -51,6 +52,9 @@ public class GossipGirl extends Module { case QUERY: handleQuery((QueryMessage) message); break; + case CLEAN: + cleanOldGossips(); + break; default: throw new InvalidMessageType("This type of message cannot be handled by GossipGirl"); } @@ -189,4 +193,12 @@ public class GossipGirl extends Module { System.out.println("ERROR: GossipGirl got query for a nonexistent gossip"); } } + + private void cleanOldGossips() { + Iterator> iterator = gossipStates.entrySet().iterator(); + while (iterator.hasNext()) { + GossipGirlState state = iterator.next().getValue(); + // TODO: remove + } + } } -- cgit v1.2.3 From fd554f89eeff6ffb3dcd80447c4284c976090e9c Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sat, 11 Jan 2020 20:22:15 +0100 Subject: Add message to remove old gossips --- .../pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java | 13 ++++++++++--- .../edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java | 6 ++++++ 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java index 175c238..ec34c7f 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java @@ -7,6 +7,7 @@ import java.util.Map; import java.util.Map.Entry; import pl.edu.mimuw.cloudatlas.agent.messages.AttributesMessage; +import pl.edu.mimuw.cloudatlas.agent.messages.CleanOldGossipsMessage; import pl.edu.mimuw.cloudatlas.agent.messages.GetStateMessage; import pl.edu.mimuw.cloudatlas.agent.messages.GossipGirlMessage; import pl.edu.mimuw.cloudatlas.agent.messages.HejkaMessage; @@ -53,7 +54,7 @@ public class GossipGirl extends Module { handleQuery((QueryMessage) message); break; case CLEAN: - cleanOldGossips(); + cleanOldGossips((CleanOldGossipsMessage) message); break; default: throw new InvalidMessageType("This type of message cannot be handled by GossipGirl"); @@ -99,6 +100,7 @@ public class GossipGirl extends Module { private void setState(StateMessage message) throws InterruptedException { GossipGirlState state = gossipStates.get(message.getRequestId()); if (state != null) { + state.setLastAction(); state.setState(message.getZMI(), message.getQueries()); if (state.state == GossipGirlState.State.SEND_HEJKA) { HejkaMessage hejka = new HejkaMessage( @@ -136,6 +138,7 @@ public class GossipGirl extends Module { private void handleNoCoTam(NoCoTamMessage message) throws InterruptedException { GossipGirlState state = gossipStates.get(message.getReceiverGossipId()); if (state != null) { + state.setLastAction(); state.handleNoCoTam(message); sendInfo(state); } else { @@ -161,6 +164,7 @@ public class GossipGirl extends Module { private void handleAttributes(AttributesMessage message) throws InterruptedException { GossipGirlState state = gossipStates.get(message.getReceiverGossipId()); if (state != null) { + state.setLastAction(); state.gotAttributes(message); if (state.state == GossipGirlState.State.SEND_INFO) { sendInfo(state); @@ -178,6 +182,7 @@ public class GossipGirl extends Module { private void handleQuery(QueryMessage message) throws InterruptedException { GossipGirlState state = gossipStates.get(message.getReceiverGossipId()); if (state != null) { + state.setLastAction(); state.gotQuery(message.getName()); Map> queries = new HashMap(); queries.put( @@ -194,11 +199,13 @@ public class GossipGirl extends Module { } } - private void cleanOldGossips() { + private void cleanOldGossips(CleanOldGossipsMessage message) { Iterator> iterator = gossipStates.entrySet().iterator(); while (iterator.hasNext()) { GossipGirlState state = iterator.next().getValue(); - // TODO: remove + if (state.lastAction.isLowerThan(message.getAgeThreshold()).getValue()) { + iterator.remove(); + } } } } diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java index eafbcca..70d57d9 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java @@ -36,6 +36,7 @@ public class GossipGirlState { FINISHED, ERROR } + public ValueTime lastAction; public PathName ourPath; public ValueContact theirContact; public long gossipId; @@ -64,6 +65,11 @@ public class GossipGirlState { } else { state = State.APPLY_HEJKA; } + this.lastAction = ValueUtils.currentTime(); + } + + public void setLastAction() { + lastAction = ValueUtils.currentTime(); } public void setState(ZMI hierarchy, Map> queries) { -- cgit v1.2.3 From 8644de307a17ad7a2f8695b53c0e3d0c42087ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Sat, 11 Jan 2020 22:05:03 +0100 Subject: Switching zone to violet08 by hand --- src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java | 4 +++- src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java index 210505d..f6c49cf 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java @@ -53,7 +53,8 @@ public class ClientController { return size() > MAX_ENTRIES; } }; - this.currentZoneName = "/uw/violet07"; + // TODO set zone in config + this.currentZoneName = "/uw/violet08"; fetchAttributeData(); // fetch attribute data as early as possible } @@ -445,6 +446,7 @@ public class ClientController { return "zoneForm"; } + // TODO available zones dont work when our zone changed @PostMapping("/zones") public String zonesPostPage(@ModelAttribute DataStringInput zoneName, Model model) { this.currentZoneName = zoneName.getString(); 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 15f8a59..f96d259 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java @@ -111,7 +111,8 @@ public class Fetcher { deserializedAttribs = deserializeAttribs(jsonAttribs); for (int i = 0; i < fetcherAttributeNames.size(); i++) { api.setAttributeValue( - "/uw/violet07", + // TODO enable setup in config + "/uw/violet08", fetcherAttributeNames.get(i), packAttributeValue( deserializedAttribs.get(i), -- cgit v1.2.3 From 226f36d1de3e71a34c344d9b859216ad2de3fb16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Sun, 12 Jan 2020 14:40:05 +0100 Subject: Add fix to attrib sending logic in gossip girl --- src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java index dd8f0b7..0cfa527 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java @@ -158,7 +158,7 @@ public class GossipGirl extends Module { GossipGirlState state = gossipStates.get(message.getReceiverGossipId()); if (state != null) { state.gotAttributes(message); - if (state.state == GossipGirlState.State.SEND_INFO) { + if (state.state == GossipGirlState.State.SEND_INFO || state.state == GossipGirlState.State.SEND_INFO_AND_FINISH) { sendInfo(state); } UpdateAttributesMessage updateMessage = new UpdateAttributesMessage("", 0, message.getPath().toString(), message.getAttributes()); -- cgit v1.2.3 From 7a4508bfa906eff853dfb2424e3b91761a886da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Sun, 12 Jan 2020 14:54:47 +0100 Subject: Switch zones by flags in agent, client, fetcher --- src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java | 3 ++- src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java | 4 ++-- .../java/pl/edu/mimuw/cloudatlas/client/ClientController.java | 4 +--- src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java | 8 ++++---- 4 files changed, 9 insertions(+), 10 deletions(-) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java index 0cbda2d..53255aa 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java @@ -44,12 +44,13 @@ public class Agent { // TODO config setup String zonePath = System.getProperty("zone_path"); + System.out.println("zonePAth " + zonePath); String selectionStrategy = System.getProperty("Gossip.zone_strategy"); Long queryPeriod = Long.getLong("query_period"); Long gossipPeriod = Long.getLong("gossip_period"); HierarchyConfig hierarchyConfig = new HierarchyConfig(eventBus, zonePath, selectionStrategy); hierarchyConfig.startQueries(queryPeriod); - hierarchyConfig.startGossip(gossipPeriod); + hierarchyConfig.startGossip(gossipPeriod, zonePath); } } 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 dc5241d..f9e323a 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java @@ -37,7 +37,7 @@ public class HierarchyConfig { } } - public void startGossip(long gossipPeriod) { + public void startGossip(long gossipPeriod, String zonePath) { Supplier taskSupplier = () -> new TimerScheduledTask() { public void run() { @@ -47,7 +47,7 @@ public class HierarchyConfig { 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); + InitiateGossipMessage message = new InitiateGossipMessage("", 0, new PathName(zonePath), contact); sendMessage(message); } else { System.out.println("DEBUG: couldn't find contact for gossip"); diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java index f6c49cf..4019696 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/client/ClientController.java @@ -53,8 +53,7 @@ public class ClientController { return size() > MAX_ENTRIES; } }; - // TODO set zone in config - this.currentZoneName = "/uw/violet08"; + this.currentZoneName = System.getProperty("zone_path"); fetchAttributeData(); // fetch attribute data as early as possible } @@ -446,7 +445,6 @@ public class ClientController { return "zoneForm"; } - // TODO available zones dont work when our zone changed @PostMapping("/zones") public String zonesPostPage(@ModelAttribute DataStringInput zoneName, Model model) { this.currentZoneName = zoneName.getString(); 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 f96d259..12d795a 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/fetcher/Fetcher.java @@ -92,7 +92,7 @@ public class Fetcher { } // https://jj09.net/interprocess-communication-python-java/ - private static void fetchData() { + private static void fetchData(String zonePath) { BufferedReader bufferRead; ArrayList deserializedAttribs; String jsonAttribs; @@ -111,8 +111,7 @@ public class Fetcher { deserializedAttribs = deserializeAttribs(jsonAttribs); for (int i = 0; i < fetcherAttributeNames.size(); i++) { api.setAttributeValue( - // TODO enable setup in config - "/uw/violet08", + zonePath, fetcherAttributeNames.get(i), packAttributeValue( deserializedAttribs.get(i), @@ -144,7 +143,8 @@ public class Fetcher { } public static void main(String[] args) { + String zonePath = System.getProperty("zone_path"); parseArgs(args); - fetchData(); + fetchData(zonePath); } } -- cgit v1.2.3 From 5995da144818842e69b9d0afa9f392a9e6419508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= Date: Sun, 12 Jan 2020 14:57:35 +0100 Subject: Remove redundant log --- src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java index 53255aa..24ed0c1 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java @@ -42,9 +42,7 @@ public class Agent { // TODO: make query period confiurable with config file and from tests - // TODO config setup String zonePath = System.getProperty("zone_path"); - System.out.println("zonePAth " + zonePath); String selectionStrategy = System.getProperty("Gossip.zone_strategy"); Long queryPeriod = Long.getLong("query_period"); Long gossipPeriod = Long.getLong("gossip_period"); -- cgit v1.2.3 From a91ffb770782450b0dd23f0510cd80ec531f7339 Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sun, 12 Jan 2020 16:12:08 +0100 Subject: Add log --- src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java | 1 + 1 file changed, 1 insertion(+) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java index ec34c7f..08d8580 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java @@ -204,6 +204,7 @@ public class GossipGirl extends Module { while (iterator.hasNext()) { GossipGirlState state = iterator.next().getValue(); if (state.lastAction.isLowerThan(message.getAgeThreshold()).getValue()) { + System.out.println("INFO: GossipGirl removing old gossip " + Long.toString(state.gossipId)); iterator.remove(); } } -- cgit v1.2.3 From edec7f92b20f1f873083bdf3198283fa822e0f64 Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sun, 12 Jan 2020 16:36:42 +0100 Subject: Start removing old gossips --- src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java | 3 +++ .../pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java | 16 ++++++++++++++++ .../java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java | 4 ++++ 3 files changed, 23 insertions(+) (limited to 'src/main/java/pl/edu/mimuw') diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java index 24ed0c1..06e067b 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java @@ -46,9 +46,12 @@ public class Agent { String selectionStrategy = System.getProperty("Gossip.zone_strategy"); Long queryPeriod = Long.getLong("query_period"); Long gossipPeriod = Long.getLong("gossip_period"); + Long freshnessPeriod = Long.getLong("freshness_period"); HierarchyConfig hierarchyConfig = new HierarchyConfig(eventBus, zonePath, selectionStrategy); hierarchyConfig.startQueries(queryPeriod); hierarchyConfig.startGossip(gossipPeriod, zonePath); + // TODO: should this be different than ZMI freshness period? + hierarchyConfig.startCleaningGossips(freshnessPeriod); } } 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 f9e323a..92b7f66 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/HierarchyConfig.java @@ -153,4 +153,20 @@ public class HierarchyConfig { AgentUtils.startRecursiveTask(taskSupplier, queriesPeriod, eventBus); } + + public void startCleaningGossips(long gossipCleanPeriod) { + Supplier taskSupplier = () -> + new TimerScheduledTask() { + public void run() { + try { + System.out.println("INFO: Scheduling old gossip cleanup"); + sendMessage(new CleanOldGossipsMessage("", 0, ValueUtils.addToTime(ValueUtils.currentTime(), -gossipCleanPeriod))); + } catch (InterruptedException e) { + System.out.println("Interrupted while triggering queries"); + } + } + }; + + AgentUtils.startRecursiveTask(taskSupplier, gossipCleanPeriod, eventBus); + } } diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java index 3df8231..866349f 100644 --- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java +++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java @@ -12,4 +12,8 @@ public class ValueUtils { public static ValueTime currentTime() { return new ValueTime(System.currentTimeMillis()); } + + public static ValueTime addToTime(ValueTime time, long millis) { + return time.addValue(new ValueDuration(millis)); + } } -- cgit v1.2.3