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%2Fdatastore%2FAbstractFrontendHistory.java;h=dbea3a1cbb5cd00058c0bcf38dff6ce7f0b1e1b1;hp=7c2ddb05b22ba07fba5503615c723b90d38681c4;hb=de64c6bbf2d5aeb51f4036f9dd606a9bf6f71afb;hpb=5cb0787412ab63a3aa5dcc044511e1ce569662cf 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 7c2ddb05b2..dbea3a1cbb 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 @@ -7,6 +7,7 @@ */ package org.opendaylight.controller.cluster.datastore; +import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Ticker; import java.util.HashMap; @@ -16,6 +17,8 @@ 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.TransactionPurgeRequest; +import org.opendaylight.controller.cluster.access.commands.TransactionPurgeResponse; import org.opendaylight.controller.cluster.access.commands.TransactionRequest; import org.opendaylight.controller.cluster.access.commands.TransactionSuccess; import org.opendaylight.controller.cluster.access.concepts.LocalHistoryIdentifier; @@ -56,26 +59,34 @@ abstract class AbstractFrontendHistory implements Identifiable handleTransactionRequest(final TransactionRequest request, final RequestEnvelope envelope, final long now) throws RequestException { - - // FIXME: handle purging of transactions - final TransactionIdentifier id = request.getTarget(); - FrontendTransaction tx = transactions.get(id); - if (tx == null) { - // The transaction does not exist and we are about to create it, check sequence number - if (request.getSequence() != 0) { - LOG.debug("{}: no transaction state present, unexpected request {}", persistenceId(), request); - throw UNSEQUENCED_START; - } - tx = createTransaction(request, id); - transactions.put(id, tx); + FrontendTransaction tx; + if (request instanceof TransactionPurgeRequest) { + tx = transactions.remove(id); + if (tx == null) { + // We have no record of the transaction, nothing to do + LOG.debug("{}: no state for transaction {}, purge is complete", persistenceId(), id); + return new TransactionPurgeResponse(id, request.getSequence()); + } } else { - 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; + tx = transactions.get(id); + if (tx == null) { + // The transaction does not exist and we are about to create it, check sequence number + if (request.getSequence() != 0) { + LOG.debug("{}: no transaction state present, unexpected request {}", persistenceId(), request); + throw UNSEQUENCED_START; + } + + tx = createTransaction(request, id); + transactions.put(id, tx); + } else { + 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; + } } } @@ -106,5 +117,11 @@ abstract class AbstractFrontendHistory implements Identifiable