From 84df6c11a868e8cd98fa14455456d313e25234db Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sun, 12 Jan 2020 21:52:38 +0100
Subject: Set zone levels

---
 .../java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java   | 12 ++++++++++++
 1 file changed, 12 insertions(+)

(limited to 'src/main/java/pl/edu')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
index 999c193..f572efe 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
@@ -61,6 +61,7 @@ public class Stanik extends Module {
 
     public void handleGetState(GetStateMessage message) throws InterruptedException {
         pruneHierarchy();
+        addLevels();
         StateMessage response = new StateMessage(
             "",
             message.getRequestingModule(),
@@ -78,6 +79,17 @@ public class Stanik extends Module {
         pruneZMI(hierarchy, now);
     }
 
+    private void addLevels() {
+        addLevelsRecursive(hierarchy, 0);
+    }
+
+    private void addLevelsRecursive(ZMI zmi, long level) {
+        zmi.getAttributes().addOrChange("level", new ValueInt(level));
+        for (ZMI son : zmi.getSons()) {
+            addLevelsRecursive(son, level + 1);
+        }
+    }
+
     private boolean pruneZMI(ZMI zmi, ValueTime time) {
         Value timestamp = zmi.getAttributes().get("timestamp");
 
-- 
cgit v1.2.3


From 411bf8f0dae524d70a0754049b5494182ade4a05 Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sun, 12 Jan 2020 22:12:09 +0100
Subject: Set owner of ZMIs on our path

---
 .../pl/edu/mimuw/cloudatlas/agent/AgentConfig.java |  4 +++-
 .../cloudatlas/agent/modules/GossipGirlState.java  | 21 +--------------------
 .../edu/mimuw/cloudatlas/agent/modules/Stanik.java | 21 +++++++++++++--------
 .../pl/edu/mimuw/cloudatlas/model/ValueUtils.java  | 22 ++++++++++++++++++++++
 4 files changed, 39 insertions(+), 29 deletions(-)

(limited to 'src/main/java/pl/edu')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/AgentConfig.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/AgentConfig.java
index 38d764a..e9bbf4e 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/AgentConfig.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/AgentConfig.java
@@ -3,6 +3,7 @@ package pl.edu.mimuw.cloudatlas.agent;
 import pl.edu.mimuw.cloudatlas.agent.modules.*;
 import pl.edu.mimuw.cloudatlas.agent.modules.Module;
 import pl.edu.mimuw.cloudatlas.api.Api;
+import pl.edu.mimuw.cloudatlas.model.PathName;
 
 import java.net.InetAddress;
 import java.net.SocketException;
@@ -43,11 +44,12 @@ public class AgentConfig {
         Integer timeout = Integer.getInteger("UDUPServer.timeout");
         Integer bufsize = Integer.getInteger("UDUPServer.bufsize");
         InetAddress serverAddr = InetAddress.getByName(System.getProperty("UDUPServer.hostname"));
+        String ourPath = System.getProperty("zone_path");
 
         HashMap<ModuleType, Module> modules = new HashMap<ModuleType, Module>();
         modules.put(ModuleType.TIMER_SCHEDULER, new TimerScheduler(ModuleType.TIMER_SCHEDULER));
         modules.put(ModuleType.RMI, new Remik());
-        modules.put(ModuleType.STATE, new Stanik(freshnessPeriod));
+        modules.put(ModuleType.STATE, new Stanik(new PathName(ourPath), freshnessPeriod));
         modules.put(ModuleType.QUERY, new Qurnik());
         modules.put(ModuleType.GOSSIP, new GossipGirl());
 
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 251d8b3..0525f41 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
@@ -280,26 +280,7 @@ public class GossipGirlState {
     }
 
     public boolean interestedIn(PathName recipientPath, PathName zmiPath) {
-        return isPrefix(zmiPath.levelUp(), recipientPath) && !isPrefix(zmiPath, recipientPath);
-    }
-
-    public boolean isPrefix(PathName prefix, PathName path) {
-        List<String> prefixComponents = prefix.getComponents();
-        List<String> pathComponents = path.getComponents();
-
-        if (prefixComponents.size() > pathComponents.size()) {
-            return false;
-        }
-
-        Iterator<String> prefixIterator = prefixComponents.iterator();
-        Iterator<String> pathIterator = pathComponents.iterator();
-
-        while (prefixIterator.hasNext()) {
-            if (!prefixIterator.next().equals(pathIterator.next())) {
-                return false;
-            }
-        }
-        return true;
+        return ValueUtils.isPrefix(zmiPath.levelUp(), recipientPath) && !ValueUtils.isPrefix(zmiPath, recipientPath);
     }
 
     public void sentInfo() {
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
index f572efe..a428232 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
@@ -19,9 +19,11 @@ public class Stanik extends Module {
     private long freshnessPeriod;
     private Set<ValueContact> contacts;
     private ValueTime contactsTimestamp;
+    private PathName ourPath;
 
-    public Stanik(long freshnessPeriod) {
+    public Stanik(PathName ourPath, long freshnessPeriod) {
         super(ModuleType.STATE);
+        this.ourPath = ourPath;
         hierarchy = new ZMI();
         queries = new HashMap<Attribute, Entry<ValueQuery, ValueTime>>();
         hierarchy.getAttributes().add("timestamp", new ValueTime(0l));
@@ -30,8 +32,8 @@ public class Stanik extends Module {
         this.contacts = new HashSet<>();
     }
 
-    public Stanik() {
-        this(60 * 1000);
+    public Stanik(PathName ourPath) {
+        this(ourPath, 60 * 1000);
     }
 
     public void handleTyped(StanikMessage message) throws InterruptedException, InvalidMessageType {
@@ -61,7 +63,7 @@ public class Stanik extends Module {
 
     public void handleGetState(GetStateMessage message) throws InterruptedException {
         pruneHierarchy();
-        addLevels();
+        addValues();
         StateMessage response = new StateMessage(
             "",
             message.getRequestingModule(),
@@ -79,14 +81,17 @@ public class Stanik extends Module {
         pruneZMI(hierarchy, now);
     }
 
-    private void addLevels() {
-        addLevelsRecursive(hierarchy, 0);
+    private void addValues() {
+        addValuesRecursive(hierarchy, 0);
     }
 
-    private void addLevelsRecursive(ZMI zmi, long level) {
+    private void addValuesRecursive(ZMI zmi, long level) {
         zmi.getAttributes().addOrChange("level", new ValueInt(level));
+        if (ValueUtils.isPrefix(zmi.getPathName(), ourPath)) {
+            zmi.getAttributes().addOrChange("owner", new ValueString(ourPath.toString()));
+        }
         for (ZMI son : zmi.getSons()) {
-            addLevelsRecursive(son, level + 1);
+            addValuesRecursive(son, level + 1);
         }
     }
 
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 866349f..20d6600 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java
@@ -1,5 +1,8 @@
 package pl.edu.mimuw.cloudatlas.model;
 
+import java.util.List;
+import java.util.Iterator;
+
 public class ValueUtils {
     public static boolean valueNonNullOfType(Value value, Type type) {
         return value != null && !value.isNull() && value.getType().isCompatible(type);
@@ -16,4 +19,23 @@ public class ValueUtils {
     public static ValueTime addToTime(ValueTime time, long millis) {
         return time.addValue(new ValueDuration(millis));
     }
+
+    public static boolean isPrefix(PathName prefix, PathName path) {
+        List<String> prefixComponents = prefix.getComponents();
+        List<String> pathComponents = path.getComponents();
+
+        if (prefixComponents.size() > pathComponents.size()) {
+            return false;
+        }
+
+        Iterator<String> prefixIterator = prefixComponents.iterator();
+        Iterator<String> pathIterator = pathComponents.iterator();
+
+        while (prefixIterator.hasNext()) {
+            if (!prefixIterator.next().equals(pathIterator.next())) {
+                return false;
+            }
+        }
+        return true;
+    }
 }
-- 
cgit v1.2.3


From cd247e8d64b2ef0aed7f0afdccd711008cd60fcd Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Sun, 12 Jan 2020 22:25:09 +0100
Subject: Add default queries for contacts and cardinality

---
 .../edu/mimuw/cloudatlas/agent/modules/Stanik.java | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

(limited to 'src/main/java/pl/edu')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
index a428232..6e7d4dc 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java
@@ -2,6 +2,7 @@ package pl.edu.mimuw.cloudatlas.agent.modules;
 
 import java.nio.file.Path;
 import java.util.*;
+import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.Map.Entry;
 
 import pl.edu.mimuw.cloudatlas.agent.messages.*;
@@ -30,6 +31,24 @@ public class Stanik extends Module {
         this.freshnessPeriod = freshnessPeriod;
         this.contactsTimestamp = ValueUtils.currentTime();
         this.contacts = new HashSet<>();
+        setDefaultQueries();
+    }
+
+    private void setDefaultQueries() {
+        String cardinalityQuery = "SELECT sum(cardinality) AS cardinality";
+        String contactsQuery = "SELECT random(5, unfold(contacts)) AS contacts";
+
+        setDefaultQuery("&cardinality", cardinalityQuery);
+        setDefaultQuery("&contacts", contactsQuery);
+    }
+
+    private void setDefaultQuery(String name, String query) {
+        try {
+            ValueQuery queryValue = new ValueQuery(query);
+            queries.put(new Attribute(name), new SimpleImmutableEntry(queryValue, new ValueTime(0l)));
+        } catch (Exception e) {
+            System.out.println("ERROR: failed to compile default query");
+        }
     }
 
     public Stanik(PathName ourPath) {
@@ -90,6 +109,9 @@ public class Stanik extends Module {
         if (ValueUtils.isPrefix(zmi.getPathName(), ourPath)) {
             zmi.getAttributes().addOrChange("owner", new ValueString(ourPath.toString()));
         }
+        if (zmi.getPathName().equals(ourPath)) {
+            zmi.getAttributes().addOrChange("cardinality", new ValueInt(1l));
+        }
         for (ZMI son : zmi.getSons()) {
             addValuesRecursive(son, level + 1);
         }
-- 
cgit v1.2.3