X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=dom%2Fmdsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fdom%2Fbroker%2FShardedDOMDataTree.java;h=6f30d207f8bc7a525648d14f991f3bc60f68be6a;hb=6ffa8194f3ae4630f958bf4ab36c79709b951799;hp=8d0c16243ca061170191cc177467d5c33ede60ca;hpb=79501e16a9760cc46b7aabe52bfca3ba0e0ce01c;p=mdsal.git 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 8d0c16243c..6f30d207f8 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 @@ -8,7 +8,9 @@ package org.opendaylight.mdsal.dom.broker; import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -21,6 +23,8 @@ import org.opendaylight.mdsal.dom.api.DOMDataTreeService; import org.opendaylight.mdsal.dom.api.DOMDataTreeShard; import org.opendaylight.mdsal.dom.api.DOMDataTreeShardingConflictException; import org.opendaylight.mdsal.dom.api.DOMDataTreeShardingService; +import org.opendaylight.mdsal.dom.spi.DOMDataTreePrefixTable; +import org.opendaylight.mdsal.dom.spi.DOMDataTreePrefixTableEntry; import org.opendaylight.mdsal.dom.spi.store.DOMStoreTreeChangePublisher; import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.ListenerRegistration; @@ -31,10 +35,9 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTree.class); @GuardedBy("this") - private final ShardingTable> shards = ShardingTable.create(); + private final DOMDataTreePrefixTable> shards = DOMDataTreePrefixTable.create(); @GuardedBy("this") - private final ShardingTable producers = ShardingTable.create(); - + private final DOMDataTreePrefixTable producers = DOMDataTreePrefixTable.create(); void removeShard(final ShardRegistration reg) { final DOMDataTreeIdentifier prefix = reg.getPrefix(); @@ -57,7 +60,17 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree } @Override - public ListenerRegistration registerDataTreeShard(final DOMDataTreeIdentifier prefix, final T shard) throws DOMDataTreeShardingConflictException { + public ListenerRegistration registerDataTreeShard( + final DOMDataTreeIdentifier prefix, final T shard, final DOMDataTreeProducer producer) + throws DOMDataTreeShardingConflictException { + + final DOMDataTreeIdentifier firstSubtree = Iterables.getOnlyElement((( + ShardedDOMDataTreeProducer) producer).getSubtrees()); + Preconditions.checkArgument(firstSubtree != null, "Producer that is used to verify namespace claim can" + + " only claim a single namespace"); + Preconditions.checkArgument(prefix.equals(firstSubtree), "Trying to register shard to a different namespace" + + " than the producer has claimed"); + final ShardRegistration reg; final ShardRegistration parentReg; @@ -67,7 +80,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree * and if it exists, check if its registration prefix does not collide with * this registration. */ - final ShardingTableEntry> parent = shards.lookup(prefix); + final DOMDataTreePrefixTableEntry> parent = shards.lookup(prefix); if (parent != null) { parentReg = parent.getValue(); if (parentReg != null && prefix.equals(parentReg.getPrefix())) { @@ -84,7 +97,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree shards.store(prefix, reg); - // FIXME: update any producers/registrations + ((ShardedDOMDataTreeProducer) producer).subshardAdded(Collections.singletonMap(prefix, shard)); } // Notify the parent shard @@ -98,7 +111,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree @GuardedBy("this") private DOMDataTreeProducer findProducer(final DOMDataTreeIdentifier subtree) { - ShardingTableEntry producerEntry = producers.lookup(subtree); + final DOMDataTreePrefixTableEntry producerEntry = producers.lookup(subtree); if (producerEntry != null) { return producerEntry.getValue(); } @@ -112,11 +125,12 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree } @GuardedBy("this") - private DOMDataTreeProducer createProducer(final Map shardMap) { + private DOMDataTreeProducer createProducer(final Collection subtrees, + final Map shardMap) { // Record the producer's attachment points - final DOMDataTreeProducer ret = ShardedDOMDataTreeProducer.create(this, shardMap); - for (final DOMDataTreeIdentifier s : shardMap.keySet()) { - producers.store(s, ret); + final DOMDataTreeProducer ret = ShardedDOMDataTreeProducer.create(this, subtrees, shardMap); + for (final DOMDataTreeIdentifier subtree : subtrees) { + producers.store(subtree, ret); } return ret; @@ -127,18 +141,22 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree Preconditions.checkArgument(!subtrees.isEmpty(), "Subtrees may not be empty"); final Map shardMap = new HashMap<>(); - for (final DOMDataTreeIdentifier s : subtrees) { + for (final DOMDataTreeIdentifier subtree : subtrees) { // Attempting to create a disconnected producer -- all subtrees have to be unclaimed - final DOMDataTreeProducer producer = findProducer(s); - Preconditions.checkArgument(producer == null, "Subtree %s is attached to producer %s", s, producer); + final DOMDataTreeProducer producer = findProducer(subtree); + Preconditions.checkArgument(producer == null, "Subtree %s is attached to producer %s", subtree, producer); - shardMap.put(s, shards.lookup(s).getValue().getInstance()); + final DOMDataTreePrefixTableEntry> possibleShardReg = shards.lookup(subtree); + if (possibleShardReg != null && possibleShardReg.getValue() != null) { + shardMap.put(subtree, possibleShardReg.getValue().getInstance()); + } } - return createProducer(shardMap); + return createProducer(subtrees, shardMap); } - synchronized DOMDataTreeProducer createProducer(final ShardedDOMDataTreeProducer parent, final Collection subtrees) { + synchronized DOMDataTreeProducer createProducer(final ShardedDOMDataTreeProducer parent, + final Collection subtrees) { Preconditions.checkNotNull(parent); final Map shardMap = new HashMap<>(); @@ -146,9 +164,10 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree shardMap.put(s, shards.lookup(s).getValue().getInstance()); } - return createProducer(shardMap); + return createProducer(subtrees, shardMap); } + @SuppressWarnings("checkstyle:IllegalCatch") @Override public synchronized ListenerRegistration registerListener(final T listener, final Collection subtrees, final boolean allowRxMerges, @@ -159,16 +178,16 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree ShardedDOMDataTreeListenerContext.create(listener, subtrees, allowRxMerges); try { // FIXME: Add attachment of producers - for (DOMDataTreeProducer producer : producers) { + for (final DOMDataTreeProducer producer : producers) { Preconditions.checkArgument(producer instanceof ShardedDOMDataTreeProducer); - ShardedDOMDataTreeProducer castedProducer = ((ShardedDOMDataTreeProducer) producer); + final ShardedDOMDataTreeProducer castedProducer = ((ShardedDOMDataTreeProducer) producer); simpleLoopCheck(subtrees, castedProducer.getSubtrees()); // FIXME: We should also unbound listeners castedProducer.boundToListener(listenerContext); } - for (DOMDataTreeIdentifier subtree : subtrees) { - DOMDataTreeShard shard = shards.lookup(subtree).getValue().getInstance(); + for (final DOMDataTreeIdentifier subtree : subtrees) { + final DOMDataTreeShard shard = shards.lookup(subtree).getValue().getInstance(); // FIXME: What should we do if listener is wildcard? And shards are on per // node basis? Preconditions.checkArgument(shard instanceof DOMStoreTreeChangePublisher, @@ -176,7 +195,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree listenerContext.register(subtree, (DOMStoreTreeChangePublisher) shard); } - } catch (Exception e) { + } catch (final Exception e) { listenerContext.close(); throw e; } @@ -188,10 +207,10 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree }; } - private static void simpleLoopCheck(Collection listen, Set writes) - throws DOMDataTreeLoopException { - for(DOMDataTreeIdentifier listenPath : listen) { - for (DOMDataTreeIdentifier writePath : writes) { + private static void simpleLoopCheck(final Collection listen, + final Set writes) throws DOMDataTreeLoopException { + for (final DOMDataTreeIdentifier listenPath : listen) { + for (final DOMDataTreeIdentifier writePath : writes) { if (listenPath.contains(writePath)) { throw new DOMDataTreeLoopException(String.format( "Listener must not listen on parent (%s), and also writes child (%s)", listenPath, @@ -205,7 +224,7 @@ public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTree } } - void removeListener(ShardedDOMDataTreeListenerContext listener) { + void removeListener(final ShardedDOMDataTreeListenerContext listener) { // FIXME: detach producers listener.close(); }