m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMartin <marcin.j.chrzanowski@gmail.com>2020-01-06 13:30:37 +0100
committerGitHub <noreply@github.com>2020-01-06 13:30:37 +0100
commitedd8c9d09b89a68a0d654dd6b08dc23a22d50293 (patch)
tree0ac7614ab80ca530f726bb83fa33fea76c9b5ab4 /src/main
parent69480d460a698a78b90d8d111f5fb4d761ffda81 (diff)
parent8a44299b0072a8bedd1c0d74f92d258379c8447a (diff)
Merge pull request #85 from m-chrzan/staleness
Staleness
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java3
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java65
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/interpreter/Main.java19
-rw-r--r--src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java4
4 files changed, 75 insertions, 16 deletions
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 0efa710..26f0e0b 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/Agent.java
@@ -46,7 +46,8 @@ public class Agent {
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());
+ Long freshnessPeriod = new Long(System.getProperty("freshness_period"));
+ modules.put(ModuleType.STATE, new Stanik(freshnessPeriod));
modules.put(ModuleType.QUERY, new Qurnik());
// TODO add modules as we implement them
return modules;
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 3e5b790..6761c94 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
@@ -1,6 +1,8 @@
package pl.edu.mimuw.cloudatlas.agent.modules;
import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map.Entry;
import pl.edu.mimuw.cloudatlas.agent.messages.AgentMessage;
@@ -19,6 +21,7 @@ import pl.edu.mimuw.cloudatlas.model.Type;
import pl.edu.mimuw.cloudatlas.model.TypePrimitive;
import pl.edu.mimuw.cloudatlas.model.Value;
import pl.edu.mimuw.cloudatlas.model.ValueBoolean;
+import pl.edu.mimuw.cloudatlas.model.ValueDuration;
import pl.edu.mimuw.cloudatlas.model.ValueQuery;
import pl.edu.mimuw.cloudatlas.model.ValueString;
import pl.edu.mimuw.cloudatlas.model.ValueTime;
@@ -34,12 +37,18 @@ public class Stanik extends Module {
private ZMI hierarchy;
private HashMap<Attribute, Entry<ValueQuery, ValueTime>> queries;
+ private long freshnessPeriod;
- public Stanik() {
+ public Stanik(long freshnessPeriod) {
super(ModuleType.STATE);
hierarchy = new ZMI();
queries = new HashMap<Attribute, Entry<ValueQuery, ValueTime>>();
hierarchy.getAttributes().add("timestamp", new ValueTime(0l));
+ this.freshnessPeriod = freshnessPeriod;
+ }
+
+ public Stanik() {
+ this(60 * 1000);
}
public void handleTyped(StanikMessage message) throws InterruptedException, InvalidMessageType {
@@ -65,6 +74,7 @@ public class Stanik extends Module {
}
public void handleGetState(GetStateMessage message) throws InterruptedException {
+ pruneHierarchy();
StateMessage response = new StateMessage(
"",
message.getRequestingModule(),
@@ -76,6 +86,40 @@ public class Stanik extends Module {
sendMessage(response);
}
+ private void pruneHierarchy() {
+ ValueTime now = ValueUtils.currentTime();
+ pruneZMI(hierarchy, now);
+ }
+
+ private boolean pruneZMI(ZMI zmi, ValueTime time) {
+ Value timestamp = zmi.getAttributes().get("timestamp");
+
+ boolean isLeaf = zmi.getSons().isEmpty();
+
+ List<ZMI> sonsToRemove = new LinkedList();
+ if (ValueUtils.valueLower(timestamp, time.subtract(new ValueDuration(freshnessPeriod)))) {
+ if (zmi.getFather() != null) {
+ return true;
+ }
+ } else {
+ for (ZMI son : zmi.getSons()) {
+ if (pruneZMI(son, time)) {
+ sonsToRemove.add(son);
+ }
+ }
+ }
+
+ for (ZMI son : sonsToRemove) {
+ zmi.removeSon(son);
+ }
+
+ if (!isLeaf && zmi.getSons().isEmpty()) {
+ return true;
+ }
+
+ return false;
+ }
+
public void handleRemoveZMI(RemoveZMIMessage message) {
try {
ZMI zmi = hierarchy.findDescendant(new PathName(message.getPathName()));
@@ -113,13 +157,20 @@ public class Stanik extends Module {
public void handleUpdateAttributes(UpdateAttributesMessage message) {
try {
validateUpdateAttributesMessage(message);
- addMissingZones(new PathName(message.getPathName()));
- ZMI zone = hierarchy.findDescendant(message.getPathName());
- AttributesMap attributes = zone.getAttributes();
- if (ValueUtils.valueLower(attributes.get("timestamp"), message.getAttributes().get("timestamp"))) {
- AttributesUtil.transferAttributes(message.getAttributes(), attributes);
+ if (!ValueUtils.valueLower(
+ message.getAttributes().get("timestamp"),
+ new ValueTime(System.currentTimeMillis() - freshnessPeriod)
+ )) {
+ addMissingZones(new PathName(message.getPathName()));
+ ZMI zone = hierarchy.findDescendant(message.getPathName());
+ AttributesMap attributes = zone.getAttributes();
+ if (ValueUtils.valueLower(attributes.get("timestamp"), message.getAttributes().get("timestamp"))) {
+ AttributesUtil.transferAttributes(message.getAttributes(), attributes);
+ } else {
+ System.out.println("DEBUG: not applying update with older attributes");
+ }
} else {
- System.out.println("DEBUG: not applying update with older attributes");
+ System.out.println("DEBUG: not applying update with stale attributes");
}
} catch (InvalidUpdateAttributesMessage e) {
System.out.println("ERROR: invalid UpdateAttributesMessage " + e.getMessage());
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/Main.java b/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/Main.java
index 1e0bb4f..7419ad4 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/Main.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/interpreter/Main.java
@@ -50,6 +50,7 @@ import pl.edu.mimuw.cloudatlas.model.ValueList;
import pl.edu.mimuw.cloudatlas.model.ValueSet;
import pl.edu.mimuw.cloudatlas.model.ValueString;
import pl.edu.mimuw.cloudatlas.model.ValueTime;
+import pl.edu.mimuw.cloudatlas.model.ValueUtils;
import pl.edu.mimuw.cloudatlas.model.ZMI;
public class Main {
@@ -274,29 +275,31 @@ public class Main {
List<Value> list;
+ ValueTime time = ValueUtils.currentTime();
+
ZMI root = new ZMI();
root.getAttributes().add("level", new ValueInt(0l));
root.getAttributes().add("name", new ValueString(null));
- root.getAttributes().add("timestamp", new ValueTime(10l));
+ root.getAttributes().add("timestamp", time);
ZMI uw = new ZMI(root);
root.addSon(uw);
uw.getAttributes().add("level", new ValueInt(1l));
uw.getAttributes().add("name", new ValueString("uw"));
- uw.getAttributes().add("timestamp", new ValueTime(10l));
+ uw.getAttributes().add("timestamp", time);
ZMI pjwstk = new ZMI(root);
root.addSon(pjwstk);
pjwstk.getAttributes().add("level", new ValueInt(1l));
pjwstk.getAttributes().add("name", new ValueString("pjwstk"));
- pjwstk.getAttributes().add("timestamp", new ValueTime(10l));
+ pjwstk.getAttributes().add("timestamp", time);
ZMI violet07 = new ZMI(uw);
uw.addSon(violet07);
violet07.getAttributes().add("level", new ValueInt(2l));
violet07.getAttributes().add("name", new ValueString("violet07"));
violet07.getAttributes().add("owner", new ValueString("/uw/violet07"));
- violet07.getAttributes().add("timestamp", new ValueTime("2012/11/09 18:00:00.000"));
+ violet07.getAttributes().add("timestamp", time);
list = Arrays.asList(new Value[] {
violet07Contact, khaki31Contact, khaki13Contact
});
@@ -322,7 +325,7 @@ public class Main {
khaki31.getAttributes().add("level", new ValueInt(2l));
khaki31.getAttributes().add("name", new ValueString("khaki31"));
khaki31.getAttributes().add("owner", new ValueString("/uw/khaki31"));
- khaki31.getAttributes().add("timestamp", new ValueTime("2012/11/09 20:03:00.000"));
+ khaki31.getAttributes().add("timestamp", time);
list = Arrays.asList(new Value[] {
violet08Contact
});
@@ -348,7 +351,7 @@ public class Main {
khaki13.getAttributes().add("level", new ValueInt(2l));
khaki13.getAttributes().add("name", new ValueString("khaki13"));
khaki13.getAttributes().add("owner", new ValueString("/uw/khaki13"));
- khaki13.getAttributes().add("timestamp", new ValueTime("2012/11/09 21:03:00.000"));
+ khaki13.getAttributes().add("timestamp", time);
list = Arrays.asList(new Value[] {
khaki14Contact, khaki32Contact
});
@@ -372,7 +375,7 @@ public class Main {
whatever01.getAttributes().add("level", new ValueInt(2l));
whatever01.getAttributes().add("name", new ValueString("whatever01"));
whatever01.getAttributes().add("owner", new ValueString("/pjwstk/whatever01"));
- whatever01.getAttributes().add("timestamp", new ValueTime("2012/11/09 21:12:00.000"));
+ whatever01.getAttributes().add("timestamp", time);
list = Arrays.asList(new Value[] {
whatever02Contact,
});
@@ -396,7 +399,7 @@ public class Main {
whatever02.getAttributes().add("level", new ValueInt(2l));
whatever02.getAttributes().add("name", new ValueString("whatever02"));
whatever02.getAttributes().add("owner", new ValueString("/pjwstk/whatever02"));
- whatever02.getAttributes().add("timestamp", new ValueTime("2012/11/09 21:13:00.000"));
+ whatever02.getAttributes().add("timestamp", time);
list = Arrays.asList(new Value[] {
whatever01Contact,
});
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 02b2ce4..3df8231 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/model/ValueUtils.java
@@ -8,4 +8,8 @@ public class ValueUtils {
public static boolean valueLower(Value a, Value b) {
return ((ValueBoolean) a.isLowerThan(b)).getValue();
}
+
+ public static ValueTime currentTime() {
+ return new ValueTime(System.currentTimeMillis());
+ }
}