From cb18b6de35bc819764b431a4e922d8cbce634014 Mon Sep 17 00:00:00 2001 From: han Date: Fri, 12 Oct 2018 11:16:19 +0800 Subject: [PATCH] Fix check path contention when create tree producers - It's not allowed to create producers with their subtrees conflicts. Add a map to store producers aim to do this check more simply than to travel 'DOMDataTreePrefixTable'. It's assumed there're less producers in th map that we could accept to do 'for' operation. JIRA: MDSAL-397 Change-Id: I105291402f21b530f54873307316f0f0c5640f6b Signed-off-by: Jie Han --- .../mdsal/dom/broker/ShardedDOMDataTree.java | 11 +++++++++++ .../mdsal/dom/broker/ShardedDOMDataTreeTest.java | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTree.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTree.java index 92c2397a2f..7cbbf0be88 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTree.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTree.java @@ -42,6 +42,7 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTreeShardingService { private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTree.class); @@ -49,6 +50,8 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree private final DOMDataTreePrefixTable> shards = DOMDataTreePrefixTable.create(); @GuardedBy("this") private final DOMDataTreePrefixTable producers = DOMDataTreePrefixTable.create(); + @GuardedBy("this") + private final Map producerMap = new HashMap<>(); void removeShard(final DOMDataTreeShardRegistration reg) { final DOMDataTreeIdentifier prefix = reg.getPrefix(); @@ -134,6 +137,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree synchronized void destroyProducer(final ShardedDOMDataTreeProducer producer) { for (final DOMDataTreeIdentifier s : producer.getSubtrees()) { producers.remove(s); + producerMap.remove(s); } } @@ -149,6 +153,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree final DOMDataTreeProducer ret = ShardedDOMDataTreeProducer.create(this, subtrees, shardMap); for (final DOMDataTreeIdentifier subtree : subtrees) { producers.store(subtree, ret); + producerMap.put(subtree, ret); } return ret; @@ -164,6 +169,12 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree final DOMDataTreeProducer producer = findProducer(subtree); checkArgument(producer == null, "Subtree %s is attached to producer %s", subtree, producer); + for (Map.Entry producerEntry : producerMap.entrySet()) { + checkArgument(!subtree.contains(producerEntry.getKey()), + "Subtree %s contains subtree %s which is already attached to producer %s.", + subtree, producerEntry.getKey(), producerEntry.getValue()); + } + final DOMDataTreePrefixTableEntry> possibleShardReg = shards.lookup(subtree); if (possibleShardReg != null && possibleShardReg.getValue() != null) { diff --git a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeTest.java b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeTest.java index b7c28d7675..dc2d584a76 100644 --- a/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeTest.java +++ b/dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeTest.java @@ -111,6 +111,12 @@ public class ShardedDOMDataTreeTest { dataTreeService.createProducer(Collections.singletonList(TEST_ID)); } + @Test(expected = IllegalArgumentException.class) + public void testProducerPathContentionReverse() throws Exception { + dataTreeService.createProducer(Collections.singletonList(TEST_ID)); + dataTreeService.createProducer(Collections.singletonList(ROOT_ID)); + } + @Test public void testShardRegistrationClose() throws Exception { rootShardReg.close(); -- 2.36.6