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%2Fdatastore%2FAbstractFrontendHistory.java;h=7c2ddb05b22ba07fba5503615c723b90d38681c4;hb=2faf656bf68dd3843fd59520b27a7ec2abbdcc68;hp=7a66eab9d0830fe7e80d739e0434e21fa4b1a914;hpb=5fd8e6506248cc34da72281a1662612f6c2b2f9a;p=controller.git diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractFrontendHistory.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractFrontendHistory.java index 7a66eab9d0..7c2ddb05b2 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractFrontendHistory.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/datastore/AbstractFrontendHistory.java @@ -8,10 +8,12 @@ package org.opendaylight.controller.cluster.datastore; import com.google.common.base.Preconditions; +import com.google.common.base.Ticker; import java.util.HashMap; import java.util.Map; import java.util.Optional; import javax.annotation.Nullable; +import org.opendaylight.controller.cluster.access.commands.AbstractReadTransactionRequest; import org.opendaylight.controller.cluster.access.commands.CommitLocalTransactionRequest; import org.opendaylight.controller.cluster.access.commands.OutOfOrderRequestException; import org.opendaylight.controller.cluster.access.commands.TransactionRequest; @@ -37,17 +39,23 @@ abstract class AbstractFrontendHistory implements Identifiable transactions = new HashMap<>(); private final String persistenceId; + private final Ticker ticker; - AbstractFrontendHistory(final String persistenceId) { + AbstractFrontendHistory(final String persistenceId, final Ticker ticker) { this.persistenceId = Preconditions.checkNotNull(persistenceId); + this.ticker = Preconditions.checkNotNull(ticker); } final String persistenceId() { return persistenceId; } + final long readTime() { + return ticker.read(); + } + final @Nullable TransactionSuccess handleTransactionRequest(final TransactionRequest request, - final RequestEnvelope envelope) throws RequestException { + final RequestEnvelope envelope, final long now) throws RequestException { // FIXME: handle purging of transactions @@ -60,25 +68,39 @@ abstract class AbstractFrontendHistory implements Identifiable> replay = tx.replaySequence(request.getSequence()); - if (replay.isPresent()) { - return replay.get(); + final Optional> maybeReplay = tx.replaySequence(request.getSequence()); + if (maybeReplay.isPresent()) { + final TransactionSuccess replay = maybeReplay.get(); + LOG.debug("{}: envelope {} replaying response {}", persistenceId(), envelope, replay); + return replay; } } - return tx.handleRequest(request, envelope); + return tx.handleRequest(request, envelope, now); } + private FrontendTransaction createTransaction(final TransactionRequest request, final TransactionIdentifier id) + throws RequestException { + if (request instanceof CommitLocalTransactionRequest) { + LOG.debug("{}: allocating new ready transaction {}", persistenceId(), id); + return createReadyTransaction(id, ((CommitLocalTransactionRequest) request).getModification()); + } + if (request instanceof AbstractReadTransactionRequest) { + if (((AbstractReadTransactionRequest) request).isSnapshotOnly()) { + LOG.debug("{}: allocatint new open snapshot {}", persistenceId(), id); + return createOpenSnapshot(id); + } + } + + LOG.debug("{}: allocating new open transaction {}", persistenceId(), id); + return createOpenTransaction(id); + } + + abstract FrontendTransaction createOpenSnapshot(TransactionIdentifier id) throws RequestException; + abstract FrontendTransaction createOpenTransaction(TransactionIdentifier id) throws RequestException; abstract FrontendTransaction createReadyTransaction(TransactionIdentifier id, DataTreeModification mod)