When local transactions are aborted from the frontend, it is done
via a dedicated message which we failed to account for. This can
happen only as an alternative to CommitLocalTransactionRequest,
hence needs to be handled only in FrontendReadWriteTransaction.
Change-Id: I350a103f132da473d397a7d5f7de7e45850911f3
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit
79418d81cd6accb12ee52d33d5add6f495d7db3c)
}
if (request instanceof AbstractReadTransactionRequest) {
if (((AbstractReadTransactionRequest<?>) request).isSnapshotOnly()) {
}
if (request instanceof AbstractReadTransactionRequest) {
if (((AbstractReadTransactionRequest<?>) request).isSnapshotOnly()) {
- LOG.debug("{}: allocatint new open snapshot {}", persistenceId(), id);
+ LOG.debug("{}: allocating new open snapshot {}", persistenceId(), id);
tree.getStats().incrementReadOnlyTransactionCount();
return createOpenSnapshot(id);
}
tree.getStats().incrementReadOnlyTransactionCount();
return createOpenSnapshot(id);
}
import java.util.Collection;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;
import java.util.Collection;
import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe;
+import org.opendaylight.controller.cluster.access.commands.AbortLocalTransactionRequest;
import org.opendaylight.controller.cluster.access.commands.CommitLocalTransactionRequest;
import org.opendaylight.controller.cluster.access.commands.ExistsTransactionRequest;
import org.opendaylight.controller.cluster.access.commands.ExistsTransactionSuccess;
import org.opendaylight.controller.cluster.access.commands.CommitLocalTransactionRequest;
import org.opendaylight.controller.cluster.access.commands.ExistsTransactionRequest;
import org.opendaylight.controller.cluster.access.commands.ExistsTransactionSuccess;
handleTransactionDoCommit((TransactionDoCommitRequest) request, envelope, now);
return null;
} else if (request instanceof TransactionAbortRequest) {
handleTransactionDoCommit((TransactionDoCommitRequest) request, envelope, now);
return null;
} else if (request instanceof TransactionAbortRequest) {
- handleTransactionAbort((TransactionAbortRequest) request, envelope, now);
+ handleTransactionAbort(request.getSequence(), envelope, now);
+ return null;
+ } else if (request instanceof AbortLocalTransactionRequest) {
+ handleLocalTransactionAbort(request.getSequence(), envelope, now);
return null;
} else {
LOG.warn("Rejecting unsupported request {}", request);
return null;
} else {
LOG.warn("Rejecting unsupported request {}", request);
- private void handleTransactionAbort(final TransactionAbortRequest request,
- final RequestEnvelope envelope, final long now) throws RequestException {
+ private void handleLocalTransactionAbort(final long sequence, final RequestEnvelope envelope, final long now) {
+ Preconditions.checkState(readyCohort == null, "Transaction {} encountered local abort with commit underway",
+ getIdentifier());
+ openTransaction.abort(() -> recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(),
+ sequence)));
+ }
+
+ private void handleTransactionAbort(final long sequence, final RequestEnvelope envelope, final long now) {
if (readyCohort == null) {
if (readyCohort == null) {
- openTransaction.abort(() -> recordAndSendSuccess(envelope, now,
- new TransactionAbortSuccess(getIdentifier(), request.getSequence())));
+ openTransaction.abort(() -> recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(),
+ sequence)));
@Override
public void onSuccess(final Void result) {
readyCohort = null;
@Override
public void onSuccess(final Void result) {
readyCohort = null;
- recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(),
- request.getSequence()));
+ recordAndSendSuccess(envelope, now, new TransactionAbortSuccess(getIdentifier(), sequence));
LOG.debug("Transaction {} aborted", getIdentifier());
}
LOG.debug("Transaction {} aborted", getIdentifier());
}