2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.cluster.access.client;
10 import akka.actor.ActorRef;
11 import com.google.common.base.MoreObjects;
12 import com.google.common.base.Preconditions;
13 import javax.annotation.Nullable;
14 import org.opendaylight.controller.cluster.access.concepts.Request;
15 import org.opendaylight.controller.cluster.access.concepts.RequestEnvelope;
16 import org.opendaylight.controller.cluster.access.concepts.RequestException;
17 import org.opendaylight.controller.cluster.access.concepts.Response;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
22 * Single entry in {@link SequencedQueue}. Tracks the request, the associated callback and accounting information.
24 * @author Robert Varga
26 final class SequencedQueueEntry {
27 private static final Logger LOG = LoggerFactory.getLogger(SequencedQueueEntry.class);
29 private final Request<?, ?> request;
30 private final RequestCallback callback;
31 private final long enqueuedTicks;
33 private TxDetails txDetails;
35 SequencedQueueEntry(final Request<?, ?> request, final RequestCallback callback,
37 this.request = Preconditions.checkNotNull(request);
38 this.callback = Preconditions.checkNotNull(callback);
39 this.enqueuedTicks = now;
42 Request<?, ?> getRequest() {
46 @Nullable TxDetails getTxDetails() {
50 ClientActorBehavior complete(final Response<?, ?> response) {
51 LOG.debug("Completing request {} with {}", request, response);
52 return callback.complete(response);
55 void poison(final RequestException cause) {
56 LOG.trace("Poisoning request {}", request, cause);
57 callback.complete(request.toRequestFailure(cause));
60 boolean isTimedOut(final long now, final long timeoutNanos) {
63 if (txDetails != null) {
64 elapsed = now - txDetails.getTimeTicks();
66 elapsed = now - enqueuedTicks;
69 if (elapsed >= timeoutNanos) {
70 LOG.debug("Request {} timed out after {}ns", request, elapsed);
77 void retransmit(final BackendInfo backend, final long txSequence, final long now) {
78 final RequestEnvelope toSend = new RequestEnvelope(request.toVersion(backend.getVersion()),
79 backend.getSessionId(), txSequence);
81 final ActorRef actor = backend.getActor();
82 LOG.trace("Transmitting request {} as {} to {}", request, toSend, actor);
83 actor.tell(toSend, ActorRef.noSender());
84 txDetails = new TxDetails(backend.getSessionId(), txSequence, now);
88 public String toString() {
89 return MoreObjects.toStringHelper(SequencedQueueEntry.class).add("request", request).toString();