X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatabroker%2Factors%2Fdds%2FAbstractClientHistory.java;h=d445d3c2f6f9e542ec031c2737653317e3952a73;hp=00f7572f986562c2c3d88d8c8743c6266c34157f;hb=d502ae8e1529b69af55a59c3e664a02457c05ec6;hpb=5ab22a0bea0492dd8f1541b2f0cde4ea7618a786 diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java index 00f7572f98..d445d3c2f6 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/AbstractClientHistory.java @@ -7,15 +7,21 @@ */ package org.opendaylight.controller.cluster.databroker.actors.dds; -import com.google.common.base.Preconditions; -import com.google.common.base.Verify; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Verify.verifyNotNull; +import static java.util.Objects.requireNonNull; + +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLongFieldUpdater; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.concurrent.locks.StampedLock; -import javax.annotation.concurrent.GuardedBy; +import org.checkerframework.checker.lock.qual.GuardedBy; +import org.checkerframework.checker.lock.qual.Holding; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.controller.cluster.access.client.AbstractClientConnection; import org.opendaylight.controller.cluster.access.client.ConnectedClientConnection; import org.opendaylight.controller.cluster.access.client.ConnectionEntry; @@ -24,7 +30,7 @@ import org.opendaylight.controller.cluster.access.commands.CreateLocalHistoryReq import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; import org.opendaylight.controller.cluster.access.concepts.Response; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; -import org.opendaylight.mdsal.common.api.TransactionChainClosedException; +import org.opendaylight.mdsal.dom.api.DOMTransactionChainClosedException; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.slf4j.Logger; @@ -36,7 +42,7 @@ import org.slf4j.LoggerFactory; * * @author Robert Varga */ -abstract class AbstractClientHistory extends LocalAbortable implements Identifiable { +public abstract class AbstractClientHistory extends LocalAbortable implements Identifiable { enum State { IDLE, TX_OPEN, @@ -58,8 +64,8 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia private final Map histories = new ConcurrentHashMap<>(); private final StampedLock lock = new StampedLock(); - private final AbstractDataStoreClientBehavior client; - private final LocalHistoryIdentifier identifier; + private final @NonNull AbstractDataStoreClientBehavior client; + private final @NonNull LocalHistoryIdentifier identifier; // Used via NEXT_TX_UPDATER @SuppressWarnings("unused") @@ -68,9 +74,9 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia private volatile State state = State.IDLE; AbstractClientHistory(final AbstractDataStoreClientBehavior client, final LocalHistoryIdentifier identifier) { - this.client = Preconditions.checkNotNull(client); - this.identifier = Preconditions.checkNotNull(identifier); - Preconditions.checkArgument(identifier.getCookie() == 0); + this.client = requireNonNull(client); + this.identifier = requireNonNull(identifier); + checkArgument(identifier.getCookie() == 0); } final State state() { @@ -79,15 +85,16 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia final void updateState(final State expected, final State next) { final boolean success = STATE_UPDATER.compareAndSet(this, expected, next); - Preconditions.checkState(success, "Race condition detected, state changed from %s to %s", expected, state); + checkState(success, "Race condition detected, state changed from %s to %s", expected, state); LOG.debug("Client history {} changed state from {} to {}", this, expected, next); } final synchronized void doClose() { final State local = state; if (local != State.CLOSED) { - Preconditions.checkState(local == State.IDLE, "Local history %s has an open transaction", this); + checkState(local == State.IDLE, "Local history %s has an open transaction", this); histories.values().forEach(ProxyHistory::close); + updateState(local, State.CLOSED); } } @@ -97,7 +104,7 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia } @Override - public final LocalHistoryIdentifier getIdentifier() { + public LocalHistoryIdentifier getIdentifier() { return identifier; } @@ -130,7 +137,7 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia * * @throws InversibleLockException if the shard is being reconnected */ - @GuardedBy("lock") + @Holding("lock") private ProxyHistory createHistoryProxy(final Long shard) { final AbstractClientConnection connection = client.getConnection(shard); final LocalHistoryIdentifier proxyId = new LocalHistoryIdentifier(identifier.getClientId(), @@ -154,7 +161,7 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia LOG.debug("Create history response {}", response); } - private ProxyHistory ensureHistoryProxy(final TransactionIdentifier transactionId, final Long shard) { + private @NonNull ProxyHistory ensureHistoryProxy(final TransactionIdentifier transactionId, final Long shard) { while (true) { try { // Short-lived lock to ensure exclusion of createHistoryProxy and the lookup phase in startReconnect, @@ -173,17 +180,19 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia } } - final AbstractProxyTransaction createSnapshotProxy(final TransactionIdentifier transactionId, final Long shard) { + final @NonNull AbstractProxyTransaction createSnapshotProxy(final TransactionIdentifier transactionId, + final Long shard) { return ensureHistoryProxy(transactionId, shard).createTransactionProxy(transactionId, true); } - final AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier transactionId, final Long shard) { + final @NonNull AbstractProxyTransaction createTransactionProxy(final TransactionIdentifier transactionId, + final Long shard) { return ensureHistoryProxy(transactionId, shard).createTransactionProxy(transactionId, false); } private void checkNotClosed() { if (state == State.CLOSED) { - throw new TransactionChainClosedException(String.format("Local history %s is closed", identifier)); + throw new DOMTransactionChainClosedException(String.format("Local history %s is closed", identifier)); } } @@ -191,10 +200,10 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia * Allocate a new {@link ClientTransaction}. * * @return A new {@link ClientTransaction} - * @throws TransactionChainClosedException if this history is closed + * @throws DOMTransactionChainClosedException if this history is closed * @throws IllegalStateException if a previous dependent transaction has not been closed */ - public final ClientTransaction createTransaction() { + public @NonNull ClientTransaction createTransaction() { checkNotClosed(); synchronized (this) { @@ -208,10 +217,10 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia * Create a new {@link ClientSnapshot}. * * @return A new {@link ClientSnapshot} - * @throws TransactionChainClosedException if this history is closed + * @throws DOMTransactionChainClosedException if this history is closed * @throws IllegalStateException if a previous dependent transaction has not been closed */ - public final ClientSnapshot takeSnapshot() { + public ClientSnapshot takeSnapshot() { checkNotClosed(); synchronized (this) { @@ -221,10 +230,10 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia } } - @GuardedBy("this") + @Holding("this") abstract ClientSnapshot doCreateSnapshot(); - @GuardedBy("this") + @Holding("this") abstract ClientTransaction doCreateTransaction(); /** @@ -241,8 +250,7 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia } final AbstractTransactionCommitCohort previous = readyTransactions.putIfAbsent(txId, cohort); - Preconditions.checkState(previous == null, "Duplicate cohort %s for transaction %s, already have %s", - cohort, txId, previous); + checkState(previous == null, "Duplicate cohort %s for transaction %s, already have %s", cohort, txId, previous); LOG.debug("Local history {} readied transaction {}", this, txId); return cohort; @@ -297,7 +305,7 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia return null; } - final ProxyReconnectCohort proxy = Verify.verifyNotNull(oldProxy.startReconnect(newConn)); + final ProxyReconnectCohort proxy = verifyNotNull(oldProxy.startReconnect(newConn)); return new HistoryReconnectCohort() { @Override ProxyReconnectCohort getProxy() { @@ -305,8 +313,8 @@ abstract class AbstractClientHistory extends LocalAbortable implements Identifia } @Override - void replaySuccessfulRequests(final Iterable previousEntries) { - proxy.replaySuccessfulRequests(previousEntries); + void replayRequests(final Collection previousEntries) { + proxy.replayRequests(previousEntries); } @Override