From 9325737ff613f7f14e44338b68ab657e0ed52d37 Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Sun, 5 Jan 2020 15:24:36 +0100 Subject: Don't apply stale zone updates --- .../edu/mimuw/cloudatlas/agent/modules/Stanik.java | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/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..1b1824f 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 @@ -34,12 +34,14 @@ public class Stanik extends Module { private ZMI hierarchy; private HashMap> queries; + private long freshnessPeriod; public Stanik() { super(ModuleType.STATE); hierarchy = new ZMI(); queries = new HashMap>(); hierarchy.getAttributes().add("timestamp", new ValueTime(0l)); + freshnessPeriod = 60 * 1000; } public void handleTyped(StanikMessage message) throws InterruptedException, InvalidMessageType { @@ -113,13 +115,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()); -- cgit v1.2.3 From 88cc1f5da8ded831b15f4970e8877494d449a471 Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Mon, 6 Jan 2020 12:02:46 +0100 Subject: Prune hierarchy of stale zones on read --- .../edu/mimuw/cloudatlas/agent/modules/Stanik.java | 44 +++++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/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 1b1824f..6c0f380 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; @@ -36,12 +39,16 @@ public class Stanik extends Module { private HashMap> queries; private long freshnessPeriod; - public Stanik() { + public Stanik(long freshnessPeriod) { super(ModuleType.STATE); hierarchy = new ZMI(); queries = new HashMap>(); hierarchy.getAttributes().add("timestamp", new ValueTime(0l)); - freshnessPeriod = 60 * 1000; + this.freshnessPeriod = freshnessPeriod; + } + + public Stanik() { + this(60 * 1000); } public void handleTyped(StanikMessage message) throws InterruptedException, InvalidMessageType { @@ -67,6 +74,7 @@ public class Stanik extends Module { } public void handleGetState(GetStateMessage message) throws InterruptedException { + pruneHierarchy(); StateMessage response = new StateMessage( "", message.getRequestingModule(), @@ -78,6 +86,38 @@ 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"); + + List 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 (zmi.getSons().isEmpty()) { + return true; + } + + return false; + } + public void handleRemoveZMI(RemoveZMIMessage message) { try { ZMI zmi = hierarchy.findDescendant(new PathName(message.getPathName())); -- cgit v1.2.3 From 8a44299b0072a8bedd1c0d74f92d258379c8447a Mon Sep 17 00:00:00 2001 From: Marcin Chrzanowski Date: Mon, 6 Jan 2020 12:57:33 +0100 Subject: Increase freshness threshold in tests --- src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/main/java/pl/edu/mimuw/cloudatlas/agent/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 6c0f380..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 @@ -94,6 +94,8 @@ public class Stanik extends Module { private boolean pruneZMI(ZMI zmi, ValueTime time) { Value timestamp = zmi.getAttributes().get("timestamp"); + boolean isLeaf = zmi.getSons().isEmpty(); + List sonsToRemove = new LinkedList(); if (ValueUtils.valueLower(timestamp, time.subtract(new ValueDuration(freshnessPeriod)))) { if (zmi.getFather() != null) { @@ -111,7 +113,7 @@ public class Stanik extends Module { zmi.removeSon(son); } - if (zmi.getSons().isEmpty()) { + if (!isLeaf && zmi.getSons().isEmpty()) { return true; } -- cgit v1.2.3