import com.google.common.base.Preconditions;
import com.google.common.base.Ticker;
import com.google.common.base.Verify;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.util.ArrayDeque;
import java.util.Iterator;
import java.util.Optional;
import scala.concurrent.duration.FiniteDuration;
/*
+ * A queue that processes entries in sequence.
+ *
* TODO: make this class and its users thread-safe. This will require some atomic state-keeping so that timeouts,
* retries and enqueues work as expected.
*/
* 2) The request has been enqueued and transmitted, but the caller needs to schedule a new timer
* 3) The request has been enqueued, but the caller needs to request resolution of backend information and that
* process needs to complete before transmission occurs
- *
+ * <p/>
* These options are covered via returning an {@link Optional}. The caller needs to examine it and decode
* the scenarios above according to the following rules:
* - if is null, the first case applies
}
// Ready to transmit
- currentInflight.offer(e);
- LOG.debug("Enqueued request {} to queue {}", request, this);
+
+ if (currentInflight.offer(e)) {
+ LOG.debug("Enqueued request {} to queue {}", request, this);
+ } else {
+ // This shouldn't happen since the queue has unlimited capacity but check anyway to avoid FindBugs warning
+ // about checking return value.
+ LOG.warn("Fail to enqueued request {} to queue {}", request, this);
+ }
e.retransmit(backend, nextTxSequence(), now);
if (expectingTimer == null) {
* - if a matching entry is not found, but it makes sense to keep looking at other queues, return null
* - if a conflicting entry is encountered, indicating we should ignore this request, return an empty Optional
*/
+ @SuppressFBWarnings(value = "NP_OPTIONAL_RETURN_NULL",
+ justification = "Returning null Optional is documented in the API contract.")
private static Optional<SequencedQueueEntry> findMatchingEntry(final Queue<SequencedQueueEntry> queue,
final ResponseEnvelope<?> envelope) {
// Try to find the request in a queue. Responses may legally come back in a different order, hence we need
transmitEntries(pending, toSend);
}
- Optional<FiniteDuration> setBackendInfo(final CompletionStage<? extends BackendInfo> proof, final BackendInfo backend) {
+ Optional<FiniteDuration> setBackendInfo(final CompletionStage<? extends BackendInfo> proof,
+ final BackendInfo backend) {
Preconditions.checkNotNull(backend);
if (!proof.equals(backendProof)) {
LOG.debug("Ignoring resolution {} while waiting for {}", proof, this.backendProof);