X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-distributed-datastore%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fdatabroker%2Factors%2Fdds%2FClientLocalHistory.java;h=b6c274628c752f19aa3728bb6e77996051e12240;hb=320a4e5cd2d9d80468a3f82798744f2035488218;hp=be94e3ee6af121abd7eeac3ef1bacc6281072985;hpb=1d34f75864ac09d31ef0f7b4ef59f7434167ae15;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientLocalHistory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientLocalHistory.java index be94e3ee6a..b6c274628c 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientLocalHistory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/actors/dds/ClientLocalHistory.java @@ -9,8 +9,7 @@ package org.opendaylight.controller.cluster.databroker.actors.dds; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; -import com.google.common.base.Verify; -import java.util.concurrent.atomic.AtomicLongFieldUpdater; +import org.opendaylight.controller.cluster.access.client.AbstractClientConnection; import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; @@ -18,49 +17,59 @@ import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier * Client-side view of a local history. This class tracks all state related to a particular history and routes * frontend requests towards the backend. * + *

* This interface is used by the world outside of the actor system and in the actor system it is manifested via - * its client actor. That requires some state transfer with {@link DistributedDataStoreClientBehavior}. In order to + * its client actor. That requires some state transfer with {@link AbstractDataStoreClientBehavior}. In order to * reduce request latency, all messages are carbon-copied (and enqueued first) to the client actor. * * @author Robert Varga */ @Beta public final class ClientLocalHistory extends AbstractClientHistory implements AutoCloseable { - - private static final AtomicLongFieldUpdater NEXT_TX_UPDATER = - AtomicLongFieldUpdater.newUpdater(ClientLocalHistory.class, "nextTx"); - - // Used via NEXT_TX_UPDATER - @SuppressWarnings("unused") - private volatile long nextTx = 0; - - ClientLocalHistory(final DistributedDataStoreClientBehavior client, final LocalHistoryIdentifier historyId) { + ClientLocalHistory(final AbstractDataStoreClientBehavior client, final LocalHistoryIdentifier historyId) { super(client, historyId); } - public ClientTransaction createTransaction() { + @Override + public void close() { + final State local = state(); + if (local != State.CLOSED) { + Preconditions.checkState(local == State.IDLE, "Local history %s has an open transaction", this); + updateState(local, State.CLOSED); + } + } + + @Override + ClientTransaction doCreateTransaction() { final State local = state(); Preconditions.checkState(local == State.IDLE, "Local history %s state is %s", this, local); updateState(local, State.TX_OPEN); - return new ClientTransaction(this, new TransactionIdentifier(getIdentifier(), - NEXT_TX_UPDATER.getAndIncrement(this))); + return new ClientTransaction(this, new TransactionIdentifier(getIdentifier(), nextTx())); } @Override - public void close() { + AbstractTransactionCommitCohort onTransactionReady(final TransactionIdentifier txId, + final AbstractTransactionCommitCohort cohort) { final State local = state(); - if (local != State.CLOSED) { - Preconditions.checkState(local == State.IDLE, "Local history %s has an open transaction", this); - updateState(local, State.CLOSED); + switch (local) { + case CLOSED: + return super.onTransactionReady(txId, cohort); + case IDLE: + throw new IllegalStateException(String.format("Local history %s is idle when readying transaction %s", + this, txId)); + case TX_OPEN: + updateState(local, State.IDLE); + return super.onTransactionReady(txId, cohort); + default: + throw new IllegalStateException(String.format("Local history %s in unhandled state %s", this, local)); + } } @Override - void onTransactionReady(final ClientTransaction transaction) { - final State local = state(); - Verify.verify(local == State.TX_OPEN, "Local history %s is in unexpected state %s", this, local); - updateState(local, State.IDLE); - super.onTransactionReady(transaction); + ProxyHistory createHistoryProxy(final LocalHistoryIdentifier historyId, + final AbstractClientConnection connection) { + return ProxyHistory.createClient(connection, historyId); } }