Removed TreeNode's parent reference to avoid maintaning a reference that could keep live big trees (solves #119 and #126)

This commit is contained in:
andsel
2015-12-01 22:59:38 +01:00
parent e3b6391653
commit 810d8a1af8
4 changed files with 11 additions and 17 deletions
@@ -90,7 +90,7 @@ public class SubscriptionsStore {
}
}
private AtomicReference<TreeNode> subscriptions = new AtomicReference<>(new TreeNode(null));
private AtomicReference<TreeNode> subscriptions = new AtomicReference<>(new TreeNode());
private static final Logger LOG = LoggerFactory.getLogger(SubscriptionsStore.class);
/**
@@ -109,8 +109,8 @@ public class SubscriptionsStore {
LOG.debug("Re-subscribing {} to topic {}", subscription.getClientId(), subscription.getTopicFilter());
add(subscription);
}
if (LOG.isDebugEnabled()) {
LOG.debug("Finished loading. Subscription tree after {}", dumpTree());
if (LOG.isTraceEnabled()) {
LOG.trace("Finished loading. Subscription tree after {}", dumpTree());
}
}
@@ -146,13 +146,13 @@ public class SubscriptionsStore {
if ((matchingChildren = current.childWithToken(token)) != null) {
//copy the traversed node
current = matchingChildren.copy();
current.m_parent = parent;
// current.m_parent = parent;
//update the child just added in the children list
parent.updateChild(matchingChildren, current);
parent = current;
} else {
//create a new node for the newly inserted token
matchingChildren = new TreeNode(current);
matchingChildren = new TreeNode(/*current*/);
matchingChildren.setToken(token);
current.addChild(matchingChildren);
current = matchingChildren;
@@ -28,13 +28,11 @@ class TreeNode {
}
TreeNode m_parent;
Token m_token;
List<TreeNode> m_children = new ArrayList<>();
List<Subscription> m_subscriptions = new ArrayList<>();
TreeNode(TreeNode parent) {
this.m_parent = parent;
TreeNode() {
}
Token getToken() {
@@ -70,13 +68,9 @@ class TreeNode {
* Copy the token and the children.
* */
TreeNode copy() {
final TreeNode copy = new TreeNode(this);
copy.m_parent = m_parent;
final TreeNode copy = new TreeNode();
copy.m_children = new ArrayList<>(m_children);
copy.m_subscriptions = new ArrayList<>(m_subscriptions.size());
for (Subscription sub : m_subscriptions) {
copy.m_subscriptions.add(new Subscription(sub));
}
copy.m_subscriptions = new ArrayList<>(m_subscriptions);
copy.m_token = m_token;
return copy;
}