Search in sources :

Example 6 with RequestException

use of org.opendaylight.controller.cluster.access.concepts.RequestException in project controller by opendaylight.

the class ClientActorBehavior method backendConnectFinished.

private void backendConnectFinished(final Long shard, final AbstractClientConnection<T> oldConn, final T backend, final Throwable failure) {
    if (failure != null) {
        if (failure instanceof TimeoutException) {
            if (!oldConn.equals(connections.get(shard))) {
                // AbstractClientConnection will remove itself when it decides there is no point in continuing,
                // at which point we want to stop retrying
                LOG.info("{}: stopping resolution of shard {} on stale connection {}", persistenceId(), shard, oldConn, failure);
                return;
            }
            LOG.debug("{}: timed out resolving shard {}, scheduling retry in {}", persistenceId(), shard, RESOLVE_RETRY_DURATION, failure);
            context().executeInActor(b -> {
                resolveConnection(shard, oldConn);
                return b;
            }, RESOLVE_RETRY_DURATION);
            return;
        }
        LOG.error("{}: failed to resolve shard {}", persistenceId(), shard, failure);
        final RequestException cause;
        if (failure instanceof RequestException) {
            cause = (RequestException) failure;
        } else {
            cause = new RuntimeRequestException("Failed to resolve shard " + shard, failure);
        }
        oldConn.poison(cause);
        return;
    }
    LOG.info("{}: resolved shard {} to {}", persistenceId(), shard, backend);
    final long stamp = connectionsLock.writeLock();
    try {
        final Stopwatch sw = Stopwatch.createStarted();
        // Create a new connected connection
        final ConnectedClientConnection<T> newConn = new ConnectedClientConnection<>(oldConn, backend);
        LOG.info("{}: resolving connection {} to {}", persistenceId(), oldConn, newConn);
        // Start reconnecting without the old connection lock held
        final ConnectionConnectCohort cohort = Verify.verifyNotNull(connectionUp(newConn));
        // Lock the old connection and get a reference to its entries
        final Collection<ConnectionEntry> replayIterable = oldConn.startReplay();
        // Finish the connection attempt
        final ReconnectForwarder forwarder = Verify.verifyNotNull(cohort.finishReconnect(replayIterable));
        // Cancel sleep debt after entries were replayed, before new connection starts receiving.
        newConn.cancelDebt();
        // Install the forwarder, unlocking the old connection
        oldConn.finishReplay(forwarder);
        // Make sure new lookups pick up the new connection
        if (!connections.replace(shard, oldConn, newConn)) {
            final AbstractClientConnection<T> existing = connections.get(oldConn.cookie());
            LOG.warn("{}: old connection {} does not match existing {}, new connection {} in limbo", persistenceId(), oldConn, existing, newConn);
        } else {
            LOG.info("{}: replaced connection {} with {} in {}", persistenceId(), oldConn, newConn, sw);
        }
    } finally {
        connectionsLock.unlockWrite(stamp);
    }
}
Also used : Stopwatch(com.google.common.base.Stopwatch) RuntimeRequestException(org.opendaylight.controller.cluster.access.concepts.RuntimeRequestException) RequestException(org.opendaylight.controller.cluster.access.concepts.RequestException) RuntimeRequestException(org.opendaylight.controller.cluster.access.concepts.RuntimeRequestException) TimeoutException(java.util.concurrent.TimeoutException)

Aggregations

RequestException (org.opendaylight.controller.cluster.access.concepts.RequestException)6 RuntimeRequestException (org.opendaylight.controller.cluster.access.concepts.RuntimeRequestException)5 Test (org.junit.Test)2 NotLeaderException (org.opendaylight.controller.cluster.access.commands.NotLeaderException)2 AbstractRequestTest (org.opendaylight.controller.cluster.access.concepts.AbstractRequestTest)2 UnsupportedRequestException (org.opendaylight.controller.cluster.access.concepts.UnsupportedRequestException)2 Failure (akka.actor.Status.Failure)1 Stopwatch (com.google.common.base.Stopwatch)1 TimeoutException (java.util.concurrent.TimeoutException)1 ABIVersion (org.opendaylight.controller.cluster.access.ABIVersion)1 ConnectClientSuccess (org.opendaylight.controller.cluster.access.commands.ConnectClientSuccess)1 OutOfSequenceEnvelopeException (org.opendaylight.controller.cluster.access.commands.OutOfSequenceEnvelopeException)1 ClientIdentifier (org.opendaylight.controller.cluster.access.concepts.ClientIdentifier)1 RetiredGenerationException (org.opendaylight.controller.cluster.access.concepts.RetiredGenerationException)1 DataTreeModification (org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification)1