diff options
author | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-01-06 12:02:46 +0100 |
---|---|---|
committer | Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com> | 2020-01-06 12:02:46 +0100 |
commit | 88cc1f5da8ded831b15f4970e8877494d449a471 (patch) | |
tree | fcf3141fd7acbf19b87ea4eb215e39220137aa09 /src/main | |
parent | 89a5d7b00f71a5be805ecc7e7907e5b0c88c5f03 (diff) |
Prune hierarchy of stale zones on read
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/Stanik.java | 44 |
1 files changed, 42 insertions, 2 deletions
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<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)); - 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<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 (zmi.getSons().isEmpty()) { + return true; + } + + return false; + } + public void handleRemoveZMI(RemoveZMIMessage message) { try { ZMI zmi = hierarchy.findDescendant(new PathName(message.getPathName())); |