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;
}
@@ -404,7 +404,7 @@ public class SubscriptionsStoreTest {
@Test
public void testRecreatePath_emptyRoot() {
TreeNode oldRoot = new TreeNode(null);
TreeNode oldRoot = new TreeNode();
final SubscriptionsStore.NodeCouple resp = store.recreatePath("/finance", oldRoot);
//Verify
@@ -416,7 +416,7 @@ public class SubscriptionsStoreTest {
@Test
public void testRecreatePath_1layer_tree() {
TreeNode oldRoot = new TreeNode(null);
TreeNode oldRoot = new TreeNode();
final SubscriptionsStore.NodeCouple respFinance = store.recreatePath("/finance", oldRoot);
final SubscriptionsStore.NodeCouple respPlus = store.recreatePath("/+", respFinance.root);
@@ -13,7 +13,7 @@ public class TreeNodeTest {
@Test
public void testAddSubscriptionOverwriteAnExistingWithDifferentCleanSessionFlag() throws Exception {
TreeNode root = new TreeNode(null);
TreeNode root = new TreeNode();
Subscription existingSub = new Subscription(CLIENT_ID, "/topic", LEAST_ONE, false);
root.addSubscription(existingSub);
Set<Subscription> subs = root.findAllByClientID(CLIENT_ID);