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%2FShardedDOMDataTreeWriteTransaction.java;h=83080f7be141b5129b84a32bb0cc62bd595e034b;hb=refs%2Fchanges%2F32%2F45832%2F1;hp=b2deac6179fa5562a384439562f5a5d7244fb0bf;hpb=74425faef2cc216605188e70e2d2916398d85301;p=mdsal.git diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeWriteTransaction.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeWriteTransaction.java index b2deac6179..83080f7be1 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeWriteTransaction.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeWriteTransaction.java @@ -8,15 +8,15 @@ package org.opendaylight.mdsal.dom.broker; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; import com.google.common.util.concurrent.CheckedFuture; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; +import java.util.Collection; import java.util.Deque; -import java.util.HashMap; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -32,7 +32,6 @@ import javax.annotation.concurrent.NotThreadSafe; import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; import org.opendaylight.mdsal.dom.api.DOMDataTreeCursorAwareTransaction; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.mdsal.dom.api.DOMDataTreeProducer; import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteCursor; import org.opendaylight.mdsal.dom.store.inmemory.DOMDataTreeShardProducer; import org.opendaylight.mdsal.dom.store.inmemory.DOMDataTreeShardWriteTransaction; @@ -45,48 +44,45 @@ import org.slf4j.LoggerFactory; @NotThreadSafe final class ShardedDOMDataTreeWriteTransaction implements DOMDataTreeCursorAwareTransaction { private static final Logger LOG = LoggerFactory.getLogger(ShardedDOMDataTreeWriteTransaction.class); + private static final TransactionCommitFailedExceptionMapper SUBMIT_FAILED_MAPPER = + TransactionCommitFailedExceptionMapper.create("submit"); private static final AtomicLong COUNTER = new AtomicLong(); + private final Map idToTransaction; + private final Collection childBoundaries; private final ShardedDOMDataTreeProducer producer; private final String identifier; - private final Set childBoundaries = new HashSet<>(); + + private final SettableFuture future = SettableFuture.create(); + private final CheckedFuture submitFuture = + Futures.makeChecked(future, SUBMIT_FAILED_MAPPER); + @GuardedBy("this") private boolean closed = false; @GuardedBy("this") private DOMDataTreeWriteCursor openCursor; - private final SettableFuture future = SettableFuture.create(); - private final CheckedFuture submitFuture = - Futures.makeChecked(future, TransactionCommitFailedExceptionMapper.create("submit")); - - private final boolean isolated; - ShardedDOMDataTreeWriteTransaction(final ShardedDOMDataTreeProducer producer, final Map idToProducer, - final Map childProducers, - final boolean isolated) { - this.isolated = isolated; + final Set childRoots) { this.producer = Preconditions.checkNotNull(producer); - idToTransaction = new HashMap<>(); - Preconditions.checkNotNull(idToProducer).forEach((id, prod) -> idToTransaction.put( - id, prod.createTransaction())); this.identifier = "SHARDED-DOM-" + COUNTER.getAndIncrement(); - LOG.debug("Created new transaction{}", identifier); - childProducers.forEach((id, prod) -> childBoundaries.add(id.getRootIdentifier())); + idToTransaction = ImmutableMap.copyOf(Maps.transformValues(idToProducer, + DOMDataTreeShardProducer::createTransaction)); + childBoundaries = Preconditions.checkNotNull(childRoots); + LOG.debug("Created new transaction {}", identifier); } - // FIXME: use atomic operations - @GuardedBy("this") private DOMDataTreeShardWriteTransaction lookup(final DOMDataTreeIdentifier prefix) { for (final Entry e : idToTransaction.entrySet()) { if (e.getKey().contains(prefix)) { Preconditions.checkArgument(!producer.isDelegatedToChild(prefix), - "Path %s is delegated to child producer.", - prefix); + "Path %s is delegated to child producer.", prefix); return e.getValue(); } } + throw new IllegalArgumentException(String.format("Path %s is not accessible from transaction %s", prefix, this)); } @@ -106,7 +102,7 @@ final class ShardedDOMDataTreeWriteTransaction implements DOMDataTreeCursorAware if (openCursor != null) { openCursor.close(); } - for (final DOMDataTreeShardWriteTransaction tx : ImmutableSet.copyOf(idToTransaction.values())) { + for (final DOMDataTreeShardWriteTransaction tx : idToTransaction.values()) { tx.close(); } @@ -134,16 +130,15 @@ final class ShardedDOMDataTreeWriteTransaction implements DOMDataTreeCursorAware } CheckedFuture doSubmit( - Consumer success, - BiConsumer failure) { + final Consumer success, + final BiConsumer failure) { - final Set txns = ImmutableSet.copyOf(idToTransaction.values()); - final ListenableFuture> listListenableFuture = - Futures.allAsList(txns.stream().map(tx -> { - LOG.debug("Readying tx {}", identifier); - tx.ready(); - return tx.submit(); - }).collect(Collectors.toList())); + final ListenableFuture> listListenableFuture = Futures.allAsList( + idToTransaction.values().stream().map(tx -> { + LOG.debug("Readying tx {}", identifier); + tx.ready(); + return tx.submit(); + }).collect(Collectors.toList())); final SettableFuture ret = SettableFuture.create(); Futures.addCallback(listListenableFuture, new FutureCallback>() { @@ -160,7 +155,7 @@ final class ShardedDOMDataTreeWriteTransaction implements DOMDataTreeCursorAware } }); - return Futures.makeChecked(ret, TransactionCommitFailedExceptionMapper.create("submit")); + return Futures.makeChecked(ret, SUBMIT_FAILED_MAPPER); } void onTransactionSuccess(final Void result) { @@ -175,10 +170,6 @@ final class ShardedDOMDataTreeWriteTransaction implements DOMDataTreeCursorAware openCursor = null; } - boolean isIsolated() { - return isolated; - } - private class DelegatingCursor implements DOMDataTreeWriteCursor { private final DOMDataTreeWriteCursor delegate;