From 0953e404e7dacbe397cc60d8715af72bd59b8c1c Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sat, 11 Jan 2020 20:12:34 +0100
Subject: Start implementing gossip cleanup

---
 .../agent/messages/CleanOldGossipsMessage.java     | 16 +++++++++++++++
 .../agent/messages/GossipGirlMessage.java          |  3 ++-
 .../mimuw/cloudatlas/agent/modules/GossipGirl.java | 12 +++++++++++
 .../cloudatlas/agent/modules/GossipGirlTest.java   | 23 ++++++++++++++++++++++
 4 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/CleanOldGossipsMessage.java

(limited to 'src')

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<Entry<Long, GossipGirlState>> iterator = gossipStates.entrySet().iterator();
+        while (iterator.hasNext()) {
+            GossipGirlState state = iterator.next().getValue();
+            // TODO: remove
+        }
+    }
 }
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
index a812e61..fb3c5f7 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
@@ -15,6 +15,7 @@ import java.util.Set;
 import pl.edu.mimuw.cloudatlas.agent.MockExecutor;
 import pl.edu.mimuw.cloudatlas.agent.messages.AgentMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.AttributesMessage;
+import pl.edu.mimuw.cloudatlas.agent.messages.CleanOldGossipsMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.HejkaMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.GetStateMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.GossipGirlMessage;
@@ -409,6 +410,28 @@ public class GossipGirlTest {
         gossipGirl.handleTyped(queryMessage2);
     }
 
+    @Test
+    public void cleanupOldGossips() throws Exception {
+        gossipGirl.handleTyped(hejkaMessage);
+        executor.messagesToPass.take();
+        gossipGirl.handleTyped(stateMessage);
+        executor.messagesToPass.take();
+
+        gossipGirl.handleTyped(attributesMessage1);
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+
+        CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, TestUtil.addToTime(ValueUtils.currentTime(), 10));
+        gossipGirl.handleTyped(message);
+        gossipGirl.handleTyped(attributesMessage2);
+
+        assertEquals(0, executor.messagesToPass.size());
+    }
+
     private void assertQueryMessage(AgentMessage message, String recipientPath, String name, String query) throws Exception {
         assertUDUPMessage(
                 message,
-- 
cgit v1.2.3


From fd554f89eeff6ffb3dcd80447c4284c976090e9c Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
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')

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<Attribute, Entry<ValueQuery, ValueTime>> queries = new HashMap();
             queries.put(
@@ -194,11 +199,13 @@ public class GossipGirl extends Module {
         }
     }
 
-    private void cleanOldGossips() {
+    private void cleanOldGossips(CleanOldGossipsMessage message) {
         Iterator<Entry<Long, GossipGirlState>> 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<Attribute, Entry<ValueQuery, ValueTime>> queries) {
-- 
cgit v1.2.3


From 8644de307a17ad7a2f8695b53c0e3d0c42087ed0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
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')

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?= <mag.grodzinska@gmail.com>
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')

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?= <mag.grodzinska@gmail.com>
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')

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<TimerScheduledTask> 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?= <mag.grodzinska@gmail.com>
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')

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 3ebdb1ce162e13c5accf7f3e65a35863504026dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Magdalena=20Grodzi=C5=84ska?= <mag.grodzinska@gmail.com>
Date: Sun, 12 Jan 2020 15:10:27 +0100
Subject: Reduce sleeps

---
 .../pl/edu/mimuw/cloudatlas/agent/AgentIntegrationTest.java  |  4 ++--
 .../java/pl/edu/mimuw/cloudatlas/agent/SchedulerTest.java    |  6 +++---
 src/test/java/pl/edu/mimuw/cloudatlas/agent/UDUPTest.java    | 12 ++++++------
 3 files changed, 11 insertions(+), 11 deletions(-)

(limited to 'src')

diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/AgentIntegrationTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/AgentIntegrationTest.java
index e2c12d6..9028026 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/AgentIntegrationTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/AgentIntegrationTest.java
@@ -48,9 +48,9 @@ public class AgentIntegrationTest {
     @BeforeClass
     public static void bindApi() throws Exception {
         registryProcess = Runtime.getRuntime().exec("./scripts/registry");
-        Thread.sleep(10000);
+        Thread.sleep(5000);
         agentProcess = Runtime.getRuntime().exec("./gradlew runAgent -Dhostname=localhost -DfreshnessPeriod=10000000 -DqueryPeriod=100");
-        Thread.sleep(10000);
+        Thread.sleep(5000);
 
         registry = LocateRegistry.getRegistry("localhost");
         api = (Api) registry.lookup("Api");
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/SchedulerTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/SchedulerTest.java
index 4a9eb87..99051ff 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/SchedulerTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/SchedulerTest.java
@@ -60,7 +60,7 @@ public class SchedulerTest {
                     }
                 }));
 
-        Thread.sleep(1000);
+        Thread.sleep(300);
     }
 
     @Test
@@ -92,7 +92,7 @@ public class SchedulerTest {
                 }));
 
 
-        Thread.sleep(1000);
+        Thread.sleep(300);
     }
 
     @Test
@@ -129,6 +129,6 @@ public class SchedulerTest {
                     }
                 }));
 
-        Thread.sleep(1000);
+        Thread.sleep(300);
     }
 }
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/UDUPTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/UDUPTest.java
index ac2c587..f731706 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/UDUPTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/UDUPTest.java
@@ -30,7 +30,7 @@ public class UDUPTest {
         UDUPServer server2 = null;
         UDUPMessage msg1 = null;
         boolean testSuccess = true;
-        int timeout = 5000;
+        int timeout = 500;
 
         try {
             System.out.println("Starting udp1");
@@ -72,7 +72,7 @@ public class UDUPTest {
         udpThread2.start();
 
         try {
-            Thread.sleep(500);
+            Thread.sleep(100);
             if (udp1 == null | udp2 == null) {
                 testSuccess = false;
             } else {
@@ -102,7 +102,7 @@ public class UDUPTest {
         UDUPServer server2 = null;
         UDUPMessage msg1 = null;
         boolean testSuccess = true;
-        int timeout = 3000;
+        int timeout = 1000;
 
         try {
             System.out.println("Starting udp1");
@@ -144,7 +144,7 @@ public class UDUPTest {
         udpThread2.start();
 
         try {
-            Thread.sleep(500);
+            Thread.sleep(100);
             if (udp1 == null | udp2 == null) {
                 testSuccess = false;
             } else {
@@ -177,7 +177,7 @@ public class UDUPTest {
         UDUPMessage msg2 = null;
         UDUPMessage msg3 = null;
         boolean testSuccess = true;
-        int timeout = 3000;
+        int timeout = 1000;
 
         try {
             System.out.println("Starting udp1");
@@ -231,7 +231,7 @@ public class UDUPTest {
         udpThread2.start();
 
         try {
-            Thread.sleep(500);
+            Thread.sleep(100);
             if (udp1 == null | udp2 == null) {
                 testSuccess = false;
             } else {
-- 
cgit v1.2.3


From a91ffb770782450b0dd23f0510cd80ec531f7339 Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sun, 12 Jan 2020 16:12:08 +0100
Subject: Add log

---
 src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java     | 1 +
 src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java | 1 -
 2 files changed, 1 insertion(+), 1 deletion(-)

(limited to 'src')

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();
             }
         }
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
index 2d7b15f..720a7e3 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
@@ -429,7 +429,6 @@ public class GossipGirlTest {
         CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, TestUtil.addToTime(ValueUtils.currentTime(), 10));
         gossipGirl.handleTyped(message);
         gossipGirl.handleTyped(attributesMessage2);
-
         assertEquals(0, executor.messagesToPass.size());
     }
 
-- 
cgit v1.2.3


From 37f413d69d8f60e327c564d2b9a604739f80080b Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sun, 12 Jan 2020 16:20:01 +0100
Subject: Add test for live gossip

---
 .../cloudatlas/agent/modules/GossipGirlTest.java    | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

(limited to 'src')

diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
index 720a7e3..e35274b 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
@@ -432,6 +432,27 @@ public class GossipGirlTest {
         assertEquals(0, executor.messagesToPass.size());
     }
 
+    @Test
+    public void dontCleanFreshGossips() throws Exception {
+        gossipGirl.handleTyped(hejkaMessage);
+        executor.messagesToPass.take();
+        gossipGirl.handleTyped(stateMessage);
+        executor.messagesToPass.take();
+
+        gossipGirl.handleTyped(attributesMessage1);
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+        executor.messagesToPass.take();
+
+        CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, TestUtil.addToTime(testTime, -10));
+        gossipGirl.handleTyped(message);
+        gossipGirl.handleTyped(attributesMessage2);
+        assertEquals(1, executor.messagesToPass.size());
+    }
+
     private void assertQueryMessage(AgentMessage message, String recipientPath, String name, String query) throws Exception {
         assertUDUPMessage(
                 message,
-- 
cgit v1.2.3


From edec7f92b20f1f873083bdf3198283fa822e0f64 Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
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 ++++
 .../mimuw/cloudatlas/agent/modules/GossipGirlTest.java | 18 +++++++++---------
 .../java/pl/edu/mimuw/cloudatlas/model/TestUtil.java   |  4 ----
 5 files changed, 32 insertions(+), 13 deletions(-)

(limited to 'src')

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<TimerScheduledTask> 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));
+    }
 }
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
index e35274b..d443fad 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlTest.java
@@ -84,7 +84,7 @@ public class GossipGirlTest {
         Map<PathName, ValueTime> otherZoneTimestamps = makeOtherZoneTimestamps();
         Map<Attribute, ValueTime> otherQueryTimestamps = makeOtherQueryTimestamps();
 
-        noCoTamMessage = new NoCoTamMessage("", 0, 42, 0, otherZoneTimestamps, otherQueryTimestamps, TestUtil.addToTime(testTime, 10), TestUtil.addToTime(testTime, 22));
+        noCoTamMessage = new NoCoTamMessage("", 0, 42, 0, otherZoneTimestamps, otherQueryTimestamps, ValueUtils.addToTime(testTime, 10), ValueUtils.addToTime(testTime, 22));
 
         attributesMessage1 = makeAttributesMessage("/son/bro", makeAttributes1());
         attributesMessage2 = makeAttributesMessage("/son/whodis", makeAttributes2());
@@ -93,7 +93,7 @@ public class GossipGirlTest {
 
         hejkaMessage = new HejkaMessage("", 0, 123, new PathName("/son/bro"), new PathName("/son/grand"), otherZoneTimestamps, otherQueryTimestamps);
         hejkaMessage.setSentTimestamp(testTime);
-        hejkaMessage.setReceivedTimestamp(TestUtil.addToTime(testTime, 15));
+        hejkaMessage.setReceivedTimestamp(ValueUtils.addToTime(testTime, 15));
         hejkaMessage.setSenderAddress(theirContact.getAddress());
     }
 
@@ -114,7 +114,7 @@ public class GossipGirlTest {
     public AttributesMap makeAttributes2() {
         AttributesMap attributes = new AttributesMap();
         attributes.add("name", new ValueString("whodis"));
-        attributes.add("timestamp", TestUtil.addToTime(testTime, -300));
+        attributes.add("timestamp", ValueUtils.addToTime(testTime, -300));
         attributes.add("foo", new ValueInt(61l));
         attributes.add("bar", new ValueString("nice"));
         return attributes;
@@ -142,11 +142,11 @@ public class GossipGirlTest {
     }
 
     public void addOtherQueryTimestamp(Map<Attribute, ValueTime> timestamps, String name, long offset) {
-        timestamps.put(new Attribute(name), TestUtil.addToTime(testTime, offset));
+        timestamps.put(new Attribute(name), ValueUtils.addToTime(testTime, offset));
     }
 
     public void addOtherZoneTimestamp(Map<PathName, ValueTime> timestamps, String path, long offset) {
-        timestamps.put(new PathName(path), TestUtil.addToTime(testTime, offset));
+        timestamps.put(new PathName(path), ValueUtils.addToTime(testTime, offset));
     }
 
     public void setupHierarchy() {
@@ -290,7 +290,7 @@ public class GossipGirlTest {
                 new SimpleImmutableEntry(
                     new ValueQuery("SELECT 3 AS one"),
                     // TODO: this should be modified by GTP
-                    TestUtil.addToTime(testTime, 10)
+                    ValueUtils.addToTime(testTime, 10)
                 )
         );
 
@@ -403,7 +403,7 @@ public class GossipGirlTest {
                 new SimpleImmutableEntry(
                     new ValueQuery("SELECT 3 AS one"),
                     // TODO: this should be modified by GTP
-                    TestUtil.addToTime(testTime, 10)
+                    ValueUtils.addToTime(testTime, 10)
                 )
         );
 
@@ -426,7 +426,7 @@ public class GossipGirlTest {
         executor.messagesToPass.take();
         executor.messagesToPass.take();
 
-        CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, TestUtil.addToTime(ValueUtils.currentTime(), 10));
+        CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, ValueUtils.addToTime(ValueUtils.currentTime(), 10));
         gossipGirl.handleTyped(message);
         gossipGirl.handleTyped(attributesMessage2);
         assertEquals(0, executor.messagesToPass.size());
@@ -447,7 +447,7 @@ public class GossipGirlTest {
         executor.messagesToPass.take();
         executor.messagesToPass.take();
 
-        CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, TestUtil.addToTime(testTime, -10));
+        CleanOldGossipsMessage message = new CleanOldGossipsMessage("", 0, ValueUtils.addToTime(testTime, -10));
         gossipGirl.handleTyped(message);
         gossipGirl.handleTyped(attributesMessage2);
         assertEquals(1, executor.messagesToPass.size());
diff --git a/src/test/java/pl/edu/mimuw/cloudatlas/model/TestUtil.java b/src/test/java/pl/edu/mimuw/cloudatlas/model/TestUtil.java
index 0fef6b4..ddc61a9 100644
--- a/src/test/java/pl/edu/mimuw/cloudatlas/model/TestUtil.java
+++ b/src/test/java/pl/edu/mimuw/cloudatlas/model/TestUtil.java
@@ -9,8 +9,4 @@ public class TestUtil {
 
         return count;
     }
-
-    public static ValueTime addToTime(ValueTime time, long millis) {
-        return time.addValue(new ValueDuration(millis));
-    }
 }
-- 
cgit v1.2.3