private volatile RequestException poisoned;
+ // Private constructor to avoid code duplication.
+ private AbstractClientConnection(final AbstractClientConnection<T> oldConn, final TransmitQueue newQueue) {
+ this.context = Preconditions.checkNotNull(oldConn.context);
+ this.cookie = Preconditions.checkNotNull(oldConn.cookie);
+ this.queue = Preconditions.checkNotNull(newQueue);
+ // Will be updated in finishReplay if needed.
+ this.lastReceivedTicks = oldConn.lastReceivedTicks;
+ }
+
+ // This constructor is only to be called by ConnectingClientConnection constructor.
// Do not allow subclassing outside of this package
- AbstractClientConnection(final ClientActorContext context, final Long cookie,
- final TransmitQueue queue) {
+ AbstractClientConnection(final ClientActorContext context, final Long cookie, final int queueDepth) {
this.context = Preconditions.checkNotNull(context);
this.cookie = Preconditions.checkNotNull(cookie);
- this.queue = Preconditions.checkNotNull(queue);
+ this.queue = new TransmitQueue.Halted(queueDepth);
this.lastReceivedTicks = currentTime();
}
+ // This constructor is only to be called (indirectly) by ReconnectingClientConnection constructor.
// Do not allow subclassing outside of this package
- AbstractClientConnection(final AbstractClientConnection<T> oldConnection, final int targetQueueSize) {
- this.context = oldConnection.context;
- this.cookie = oldConnection.cookie;
- this.queue = new TransmitQueue.Halted(targetQueueSize);
- this.lastReceivedTicks = oldConnection.lastReceivedTicks;
+ AbstractClientConnection(final AbstractClientConnection<T> oldConn) {
+ this(oldConn, new TransmitQueue.Halted(oldConn.queue, oldConn.currentTime()));
+ }
+
+ // This constructor is only to be called (indirectly) by ConnectedClientConnection constructor.
+ // Do not allow subclassing outside of this package
+ AbstractClientConnection(final AbstractClientConnection<T> oldConn, final T newBackend, final int queueDepth) {
+ this(oldConn, new TransmitQueue.Transmitting(oldConn.queue, queueDepth, newBackend, oldConn.currentTime()));
}
public final ClientActorContext context() {
}
}
+ // To be called from ClientActorBehavior on ConnectedClientConnection after entries are replayed.
+ final void cancelDebt() {
+ queue.cancelDebt(currentTime());
+ }
+
public abstract Optional<T> getBackendInfo();
final Collection<ConnectionEntry> startReplay() {