import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
public final class ShardedDOMDataTree implements DOMDataTreeService, DOMDataTreeShardingService {
private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTree.class);
private final DOMDataTreePrefixTable<DOMDataTreeShardRegistration<?>> shards = DOMDataTreePrefixTable.create();
@GuardedBy("this")
private final DOMDataTreePrefixTable<DOMDataTreeProducer> producers = DOMDataTreePrefixTable.create();
+ @GuardedBy("this")
+ private final Map<DOMDataTreeIdentifier, DOMDataTreeProducer> producerMap = new HashMap<>();
void removeShard(final DOMDataTreeShardRegistration<?> reg) {
final DOMDataTreeIdentifier prefix = reg.getPrefix();
synchronized void destroyProducer(final ShardedDOMDataTreeProducer producer) {
for (final DOMDataTreeIdentifier s : producer.getSubtrees()) {
producers.remove(s);
+ producerMap.remove(s);
}
}
final DOMDataTreeProducer ret = ShardedDOMDataTreeProducer.create(this, subtrees, shardMap);
for (final DOMDataTreeIdentifier subtree : subtrees) {
producers.store(subtree, ret);
+ producerMap.put(subtree, ret);
}
return ret;
final DOMDataTreeProducer producer = findProducer(subtree);
checkArgument(producer == null, "Subtree %s is attached to producer %s", subtree, producer);
+ for (Map.Entry<DOMDataTreeIdentifier, DOMDataTreeProducer> 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<DOMDataTreeShardRegistration<?>> possibleShardReg =
shards.lookup(subtree);
if (possibleShardReg != null && possibleShardReg.getValue() != null) {