X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-common-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Fsal%2Fcommon%2Fimpl%2Fservice%2FAbstractDataTransaction.java;h=b2a03c298772caba9509e3122598dd8f1bc06aee;hb=cc0542591cd61d968af7083409730f24954feae1;hp=c73a62779921d74837d96eb9c06a3f274f06cf1b;hpb=fa3bc33c3103f8b52a57954d024e4b390ea01c94;p=controller.git diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataTransaction.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataTransaction.java index c73a627799..b2a03c2987 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataTransaction.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataTransaction.java @@ -7,42 +7,58 @@ */ package org.opendaylight.controller.md.sal.common.impl.service; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.AsyncFunction; +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.Future; - +import java.util.concurrent.TimeUnit; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; +import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.controller.md.sal.common.impl.AbstractDataModification; import org.opendaylight.yangtools.concepts.Path; import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@SuppressWarnings("all") public abstract class AbstractDataTransaction

, D extends Object> extends AbstractDataModification { - private final static Logger LOG = LoggerFactory.getLogger(AbstractDataTransaction.class); + private static final Logger LOG = LoggerFactory.getLogger(AbstractDataTransaction.class); + private static final ListenableFuture> SUCCESS_FUTURE = + Futures.immediateFuture(RpcResultBuilder.success(TransactionStatus.COMMITED).build()); private final Object identifier; + private final long allocationTime; + private long readyTime = 0; + private long completeTime = 0; - @Override - public Object getIdentifier() { - return this.identifier; - } - - private TransactionStatus status; + private TransactionStatus status = TransactionStatus.NEW; private final AbstractDataBroker broker; protected AbstractDataTransaction(final Object identifier, final AbstractDataBroker dataBroker) { super(dataBroker); - this.identifier = identifier; - this.broker = dataBroker; - this.status = TransactionStatus.NEW; - AbstractDataTransaction.LOG.debug("Transaction {} Allocated.", identifier); + this.identifier = Preconditions.checkNotNull(identifier); + this.broker = Preconditions.checkNotNull(dataBroker); + this.allocationTime = System.nanoTime(); + LOG.debug("Transaction {} Allocated.", identifier); + } + + @Override + public Object getIdentifier() { + return this.identifier; } @Override public Future> commit() { + readyTime = System.nanoTime(); + if (LOG.isDebugEnabled()) { + LOG.debug("Transaction {} Ready after {}ms.", identifier, TimeUnit.NANOSECONDS.toMillis(readyTime - allocationTime)); + } + changeStatus(TransactionStatus.SUBMITED); return this.broker.commit(this); } @@ -64,8 +80,6 @@ public abstract class AbstractDataTransaction

, D extends Objec return this.broker.readOperationalData(path); } - - @Override public int hashCode() { final int prime = 31; @@ -75,19 +89,24 @@ public abstract class AbstractDataTransaction

, D extends Objec } @Override - public boolean equals(Object obj) { - if (this == obj) + public boolean equals(final Object obj) { + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; - AbstractDataTransaction other = (AbstractDataTransaction) obj; + } + AbstractDataTransaction other = (AbstractDataTransaction) obj; if (identifier == null) { - if (other.identifier != null) + if (other.identifier != null) { return false; - } else if (!identifier.equals(other.identifier)) + } + } else if (!identifier.equals(other.identifier)) { return false; + } return true; } @@ -98,11 +117,35 @@ public abstract class AbstractDataTransaction

, D extends Objec protected abstract void onStatusChange(final TransactionStatus status); - public void changeStatus(final TransactionStatus status) { - Object _identifier = this.getIdentifier(); - AbstractDataTransaction.LOG - .debug("Transaction {} transitioned from {} to {}", _identifier, this.status, status); + public void succeeded() { + this.completeTime = System.nanoTime(); + if (LOG.isDebugEnabled()) { + LOG.debug("Transaction {} Committed after {}ms.", identifier, TimeUnit.NANOSECONDS.toMillis(completeTime - readyTime)); + } + changeStatus(TransactionStatus.COMMITED); + } + + public void failed() { + this.completeTime = System.nanoTime(); + + if (LOG.isDebugEnabled()) { + LOG.debug("Transaction {} Failed after {}ms.", identifier, TimeUnit.NANOSECONDS.toMillis(completeTime - readyTime)); + } + changeStatus(TransactionStatus.FAILED); + } + + private void changeStatus(final TransactionStatus status) { + LOG.debug("Transaction {} transitioned from {} to {}", getIdentifier(), this.status, status); this.status = status; this.onStatusChange(status); } + + public static ListenableFuture> convertToLegacyCommitFuture(final CheckedFuture from) { + return Futures.transform(from, new AsyncFunction>() { + @Override + public ListenableFuture> apply(final Void input) { + return SUCCESS_FUTURE; + } + }); + } }