X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fnetconf-topology-singleton%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Ftopology%2Fsingleton%2Fimpl%2Factors%2FWriteTransactionActor.java;h=dd799dd58254163c6dcca5909898a036ad321cc4;hb=1d37ac583f3e2dd1f3886c31bf1407ca2eb13d53;hp=5350b6478ed317e6be5e18e6b6f58a7a76435912;hpb=446738525190ad92736f1a8868e3263737276aff;p=netconf.git diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/WriteTransactionActor.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/WriteTransactionActor.java index 5350b6478e..dd799dd582 100644 --- a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/WriteTransactionActor.java +++ b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/actors/WriteTransactionActor.java @@ -5,89 +5,60 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.topology.singleton.impl.actors; -import akka.actor.ActorRef; import akka.actor.Props; -import akka.actor.UntypedActor; -import com.google.common.util.concurrent.CheckedFuture; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import javax.annotation.Nonnull; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.netconf.topology.singleton.messages.NormalizedNodeMessage; -import org.opendaylight.netconf.topology.singleton.messages.transactions.CancelRequest; -import org.opendaylight.netconf.topology.singleton.messages.transactions.DeleteRequest; -import org.opendaylight.netconf.topology.singleton.messages.transactions.MergeRequest; -import org.opendaylight.netconf.topology.singleton.messages.transactions.PutRequest; -import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitReply; -import org.opendaylight.netconf.topology.singleton.messages.transactions.SubmitRequest; +import akka.actor.ReceiveTimeout; +import akka.actor.UntypedAbstractActor; +import akka.util.JavaDurationConverters; +import java.time.Duration; +import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; +import org.opendaylight.netconf.topology.singleton.messages.transactions.WriteActorMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** - * WriteTransactionActor is an interface to device's {@link DOMDataReadOnlyTransaction} for cluster nodes. + * WriteTransactionActor is an interface to device's {@link DOMDataTreeWriteTransaction} for cluster nodes. */ -public class WriteTransactionActor extends UntypedActor { +public final class WriteTransactionActor extends UntypedAbstractActor { + + private static final Logger LOG = LoggerFactory.getLogger(WriteTransactionActor.class); - private final DOMDataWriteTransaction tx; + private final DOMDataTreeWriteTransaction tx; + private final long idleTimeout; + private final WriteAdapter writeAdapter; + + private WriteTransactionActor(final DOMDataTreeWriteTransaction tx, final Duration idleTimeout) { + this.tx = tx; + this.idleTimeout = idleTimeout.toSeconds(); + if (this.idleTimeout > 0) { + context().setReceiveTimeout(JavaDurationConverters.asFiniteDuration(idleTimeout)); + } + writeAdapter = new WriteAdapter(tx); + } /** * Creates new actor Props. * - * @param tx delegate device write transaction + * @param tx delegate device write transaction + * @param idleTimeout idle time in seconds, after which transaction is closed automatically * @return props */ - static Props props(final DOMDataWriteTransaction tx) { - return Props.create(WriteTransactionActor.class, () -> new WriteTransactionActor(tx)); - } - - private WriteTransactionActor(final DOMDataWriteTransaction tx) { - this.tx = tx; + static Props props(final DOMDataTreeWriteTransaction tx, final Duration idleTimeout) { + return Props.create(WriteTransactionActor.class, () -> new WriteTransactionActor(tx, idleTimeout)); } @Override - public void onReceive(final Object message) throws Throwable { - if (message instanceof MergeRequest) { - final MergeRequest mergeRequest = (MergeRequest) message; - final NormalizedNodeMessage data = mergeRequest.getNormalizedNodeMessage(); - tx.merge(mergeRequest.getStore(), data.getIdentifier(), data.getNode()); - } else if (message instanceof PutRequest) { - final PutRequest putRequest = (PutRequest) message; - final NormalizedNodeMessage data = putRequest.getNormalizedNodeMessage(); - tx.put(putRequest.getStore(), data.getIdentifier(), data.getNode()); - } else if (message instanceof DeleteRequest) { - final DeleteRequest deleteRequest = (DeleteRequest) message; - tx.delete(deleteRequest.getStore(), deleteRequest.getPath()); - } else if (message instanceof CancelRequest) { - cancel(); - } else if (message instanceof SubmitRequest) { - submit(sender(), self()); + public void onReceive(final Object message) { + if (message instanceof WriteActorMessage) { + writeAdapter.handle(message, sender(), context(), self()); + } else if (message instanceof ReceiveTimeout) { + LOG.warn("Haven't received any message for {} seconds, cancelling transaction and stopping actor", + idleTimeout); + tx.cancel(); + context().stop(self()); } else { unhandled(message); } } - - private void cancel() { - final boolean cancelled = tx.cancel(); - sender().tell(cancelled, self()); - context().stop(self()); - } - - private void submit(final ActorRef requester, final ActorRef self) { - final CheckedFuture submitFuture = tx.submit(); - context().stop(self); - Futures.addCallback(submitFuture, new FutureCallback() { - @Override - public void onSuccess(final Void result) { - requester.tell(new SubmitReply(), self); - } - - @Override - public void onFailure(@Nonnull final Throwable throwable) { - requester.tell(throwable, self); - } - }); - } }