import java.util.Collection;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Consumer;
import org.opendaylight.controller.cluster.access.concepts.RequestException;
import org.opendaylight.controller.cluster.access.concepts.Response;
import org.opendaylight.controller.cluster.access.concepts.ResponseEnvelope;
+import org.opendaylight.controller.cluster.access.concepts.RuntimeRequestException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import scala.concurrent.duration.FiniteDuration;
}
@GuardedBy("lock")
- abstract ClientActorBehavior<T> lockedReconnect(ClientActorBehavior<T> current);
+ abstract ClientActorBehavior<T> lockedReconnect(ClientActorBehavior<T> current,
+ RequestException runtimeRequestException);
final long enqueueEntry(final ConnectionEntry entry, final long now) {
lock.lock();
}
}
- final ClientActorBehavior<T> reconnect(final ClientActorBehavior<T> current) {
+ final ClientActorBehavior<T> reconnect(final ClientActorBehavior<T> current, final RequestException cause) {
lock.lock();
try {
- return lockedReconnect(current);
+ return lockedReconnect(current, cause);
} finally {
lock.unlock();
}
delay = lockedCheckTimeout(now);
if (delay == null) {
// We have timed out. There is no point in scheduling a timer
- return lockedReconnect(current);
+ return lockedReconnect(current, new RuntimeRequestException("Backend connection timed out",
+ new TimeoutException()));
}
if (delay.isPresent()) {
@GuardedBy("lock")
private void lockedPoison(final RequestException cause) {
- poisoned = cause;
+ poisoned = enrichPoison(cause);
queue.poison(cause);
}
+ RequestException enrichPoison(final RequestException ex) {
+ return ex;
+ }
+
@VisibleForTesting
final RequestException poisoned() {
return poisoned;