From 9081694d2d8c462f1bea87696c33cd8596d02c1a Mon Sep 17 00:00:00 2001 From: keyonghan <54558023+keyonghan@users.noreply.github.com> Date: Fri, 14 Jul 2023 15:13:52 -0700 Subject: [PATCH] Skip scheduling recent failed tasks if an earlier task is already InProgress (#2934) Fixes: https://github.com/flutter/flutter/issues/110716 --- app_dart/lib/src/service/scheduler/policy.dart | 5 +++++ .../test/service/scheduler/policy_test.dart | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/app_dart/lib/src/service/scheduler/policy.dart b/app_dart/lib/src/service/scheduler/policy.dart index c0da468e3..36158339c 100644 --- a/app_dart/lib/src/service/scheduler/policy.dart +++ b/app_dart/lib/src/service/scheduler/policy.dart @@ -56,6 +56,11 @@ class BatchPolicy implements SchedulerPolicy { required DatastoreService datastore, }) async { final List recentTasks = await datastore.queryRecentTasksByName(name: task.name!).toList(); + // Skip scheduling if there is already a running task. + if (recentTasks.any((Task task) => task.status == Task.statusInProgress)) { + return null; + } + // Ensure task isn't considered in recentTasks recentTasks.removeWhere((Task t) => t.commitKey == task.commitKey); if (recentTasks.length < kBatchSize) { diff --git a/app_dart/test/service/scheduler/policy_test.dart b/app_dart/test/service/scheduler/policy_test.dart index 4cd169a56..275fd16ea 100644 --- a/app_dart/test/service/scheduler/policy_test.dart +++ b/app_dart/test/service/scheduler/policy_test.dart @@ -65,6 +65,15 @@ void main() { generateTask(1, status: Task.statusSucceeded), ]; + final List failedWithRunning = [ + generateTask(6), + generateTask(5), + generateTask(4), + generateTask(3, status: Task.statusFailed), + generateTask(2, status: Task.statusInProgress), + generateTask(1), + ]; + test('triggers if less tasks than batch size', () async { db.addOnQuery((Iterable results) => allPending); expect( @@ -89,6 +98,14 @@ void main() { ); }); + test('does not trigger on recent failures if there is already a running task', () async { + db.addOnQuery((Iterable results) => failedWithRunning); + expect( + await policy.triggerPriority(task: generateTask(7), datastore: datastore), + isNull, + ); + }); + test('does not trigger when a test was recently scheduled', () async { db.addOnQuery((Iterable results) => latestFinishedButRestPending); expect(await policy.triggerPriority(task: generateTask(7), datastore: datastore), isNull);