Report an InternalFeedError when starvation occurs in TaskQueue.
PiperOrigin-RevId: 242216573
Change-Id: I16a676c6ed08e74f88bd025429f231980326344e
diff --git a/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java b/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java
index c6ea25e..bf5370c 100644
--- a/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java
+++ b/src/main/java/com/google/android/libraries/feed/common/concurrent/TaskQueue.java
@@ -22,6 +22,7 @@
import com.google.android.libraries.feed.common.logging.StringFormattingUtils;
import com.google.android.libraries.feed.common.time.Clock;
import com.google.android.libraries.feed.host.logging.BasicLoggingApi;
+import com.google.android.libraries.feed.host.logging.InternalFeedError;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.concurrent.Executor;
@@ -118,7 +119,7 @@
/** Track if starvation checking is running */
private final AtomicBoolean starvationChecks = new AtomicBoolean(false);
- private final BasicLoggingApi unusedBasicLoggingApi;
+ private final BasicLoggingApi basicLoggingApi;
private final Executor executor;
private final Clock clock;
private final boolean checkStarvation;
@@ -148,7 +149,7 @@
MainThreadRunner mainThreadRunner,
Clock clock,
boolean checkStarvation) {
- this.unusedBasicLoggingApi = basicLoggingApi;
+ this.basicLoggingApi = basicLoggingApi;
this.executor = executor;
this.mainThreadRunner = mainThreadRunner;
this.clock = clock;
@@ -271,6 +272,7 @@
TAG, " * Starvation Check, last task %s", StringFormattingUtils.formatLogDate(lastTask));
if (clock.currentTimeMillis() >= lastTask + STARVATION_TIMEOUT_MS) {
Logger.e(TAG, " - Starvation check failed, stopping the delay and running tasks");
+ basicLoggingApi.onInternalError(InternalFeedError.TASK_QUEUE_STARVATION);
// Reset the delay since things aren't being run
synchronized (lock) {
if (waitingForHeadReset) {
diff --git a/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java b/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java
index 6a787ea..e9ad693 100644
--- a/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java
+++ b/src/main/java/com/google/android/libraries/feed/host/logging/InternalFeedError.java
@@ -36,6 +36,7 @@
InternalFeedError.NULL_SHARED_STATES,
InternalFeedError.FAILED_TO_CREATE_LEAF,
InternalFeedError.UNHANDLED_TOKEN,
+ InternalFeedError.TASK_QUEUE_STARVATION,
InternalFeedError.NEXT_VALUE
})
public @interface InternalFeedError {
@@ -76,6 +77,12 @@
/** Represents a token that could not be handled. */
int UNHANDLED_TOKEN = 11;
+ /**
+ * Represents that the task queue timed out waiting for a network request and began executing
+ * queued tasks.
+ */
+ int TASK_QUEUE_STARVATION = 12;
+
/** The next value that should be used when adding additional values to the IntDef. */
- int NEXT_VALUE = 12;
+ int NEXT_VALUE = 13;
}
diff --git a/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java b/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java
index 1155cfe..331fccd 100644
--- a/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java
+++ b/src/main/java/com/google/android/libraries/feed/testing/host/logging/FakeBasicLoggingApi.java
@@ -29,6 +29,7 @@
/** Fake implementation of {@link BasicLoggingApi}. */
public class FakeBasicLoggingApi implements BasicLoggingApi {
+ @InternalFeedError public int lastInternalError = InternalFeedError.NEXT_VALUE;
@RequestReason public int serverRequestReason = RequestReason.UNKNOWN;
public FakeBasicLoggingApi() {}
@@ -103,7 +104,9 @@
public void onVisualElementViewed(ElementLoggingData data, int elementType) {}
@Override
- public void onInternalError(@InternalFeedError int internalError) {}
+ public void onInternalError(@InternalFeedError int internalError) {
+ lastInternalError = internalError;
+ }
@Override
public void onZeroStateRefreshCompleted(int newContentCount, int newTokenCount) {}
diff --git a/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD b/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD
index 0efd138..abe0b26 100644
--- a/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD
+++ b/src/test/java/com/google/android/libraries/feed/common/concurrent/BUILD
@@ -44,6 +44,7 @@
"//src/main/java/com/google/android/libraries/feed/common/concurrent",
"//src/main/java/com/google/android/libraries/feed/common/concurrent/testing",
"//src/main/java/com/google/android/libraries/feed/common/time/testing",
+ "//src/main/java/com/google/android/libraries/feed/host/logging",
"//src/main/java/com/google/android/libraries/feed/testing/host/logging",
"@com_google_protobuf_javalite//:protobuf_java_lite",
"@maven//:com_google_guava_guava",
diff --git a/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java b/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java
index 1cbec74..a6389ee 100644
--- a/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java
+++ b/src/test/java/com/google/android/libraries/feed/common/concurrent/TaskQueueTest.java
@@ -20,6 +20,7 @@
import com.google.android.libraries.feed.common.concurrent.TaskQueue.TaskType;
import com.google.android.libraries.feed.common.concurrent.testing.ClockBackedFakeMainThreadRunner;
import com.google.android.libraries.feed.common.time.testing.FakeClock;
+import com.google.android.libraries.feed.host.logging.InternalFeedError;
import com.google.android.libraries.feed.testing.host.logging.FakeBasicLoggingApi;
import com.google.common.util.concurrent.MoreExecutors;
import java.util.ArrayList;
@@ -202,6 +203,8 @@
runAndAssertStarvationChecks();
assertThat(delayedTaskHasRun).isTrue();
assertThat(taskQueue.isDelayed()).isFalse();
+ assertThat(fakeBasicLoggingApi.lastInternalError)
+ .isEqualTo(InternalFeedError.TASK_QUEUE_STARVATION);
}
@Test