Merge "Throttle the number of work requests picked up by Greedy Scheduler." into androidx-master-dev
diff --git a/work/workmanager/src/main/java/androidx/work/impl/Scheduler.java b/work/workmanager/src/main/java/androidx/work/impl/Scheduler.java
index 4779722..f60e66f 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/Scheduler.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/Scheduler.java
@@ -33,6 +33,12 @@
     int MAX_SCHEDULER_LIMIT = 50;
 
     /**
+     * The maximum number of {@link WorkSpec}s that are considered for execution by the greedy
+     * scheduler.
+     */
+    int MAX_GREEDY_SCHEDULER_LIMIT = 200;
+
+    /**
      * Schedule the given {@link WorkSpec}s for background execution.  The Scheduler does NOT need
      * to check if there are any dependencies.
      *
diff --git a/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java b/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java
index d2caaf4..b43c623 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/Schedulers.java
@@ -16,6 +16,7 @@
 
 package androidx.work.impl;
 
+import static androidx.work.impl.Scheduler.MAX_GREEDY_SCHEDULER_LIMIT;
 import static androidx.work.impl.utils.PackageManagerHelper.setComponentEnabled;
 
 import android.content.Context;
@@ -74,7 +75,8 @@
                     configuration.getMaxSchedulerLimit());
 
             // Enqueued workSpecs when scheduling limits are NOT applicable.
-            allEligibleWorkSpecs = workSpecDao.getAllEligibleWorkSpecsForScheduling();
+            allEligibleWorkSpecs = workSpecDao.getAllEligibleWorkSpecsForScheduling(
+                    MAX_GREEDY_SCHEDULER_LIMIT);
 
             if (eligibleWorkSpecsForLimitedSlots != null
                     && eligibleWorkSpecsForLimitedSlots.size() > 0) {
diff --git a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
index a1ef4cdb..68b0e28 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/model/WorkSpecDao.java
@@ -313,8 +313,9 @@
             + "state=" + WorkTypeConverters.StateIds.ENQUEUED
             // Order by period start time so we execute scheduled WorkSpecs in FIFO order
             + " ORDER BY period_start_time"
+            + " LIMIT :maxLimit"
     )
-    List<WorkSpec> getAllEligibleWorkSpecsForScheduling();
+    List<WorkSpec> getAllEligibleWorkSpecsForScheduling(int maxLimit);
 
     /**
      * @return The List of {@link WorkSpec}s that are unfinished and scheduled.
diff --git a/work/workmanager/src/main/java/androidx/work/impl/workers/DiagnosticsWorker.java b/work/workmanager/src/main/java/androidx/work/impl/workers/DiagnosticsWorker.java
index a67c3b1..3f20289 100644
--- a/work/workmanager/src/main/java/androidx/work/impl/workers/DiagnosticsWorker.java
+++ b/work/workmanager/src/main/java/androidx/work/impl/workers/DiagnosticsWorker.java
@@ -16,6 +16,8 @@
 
 package androidx.work.impl.workers;
 
+import static androidx.work.impl.Scheduler.MAX_GREEDY_SCHEDULER_LIMIT;
+
 import android.content.Context;
 import android.os.Build;
 import android.text.TextUtils;
@@ -64,7 +66,8 @@
         long startAt = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1);
         List<WorkSpec> completed = workSpecDao.getRecentlyCompletedWork(startAt);
         List<WorkSpec> running = workSpecDao.getRunningWork();
-        List<WorkSpec> enqueued = workSpecDao.getAllEligibleWorkSpecsForScheduling();
+        List<WorkSpec> enqueued = workSpecDao.getAllEligibleWorkSpecsForScheduling(
+                MAX_GREEDY_SCHEDULER_LIMIT);
 
         if (completed != null && !completed.isEmpty()) {
             Logger.get().info(TAG, "Recently completed work:\n\n");