Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 4 additions & 36 deletions app_dart/lib/src/model/firestore/task.dart
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ final class Task extends AppDocument<Task> {
required int createTimestamp,
required int startTimestamp,
required int endTimestamp,
required String status,
required TaskStatus status,
required bool testFlaky,
required int? buildNumber,
}) {
Expand Down Expand Up @@ -199,7 +199,7 @@ final class Task extends AppDocument<Task> {
currentAttempt: 1,
createTimestamp: commit.createTimestamp,
bringup: target.isBringup,
status: statusNew,
status: TaskStatus.waitingForBackfill,
commitSha: commit.sha,
builderName: target.name,
buildNumber: null,
Expand All @@ -217,7 +217,7 @@ final class Task extends AppDocument<Task> {

/// Returns a Firestore [Write] that patches the [status] field for [id].
@useResult
static Write patchStatus(AppDocumentId<Task> id, String status) {
static Write patchStatus(AppDocumentId<Task> id, TaskStatus status) {
return Write(
currentDocument: Precondition(exists: true),
update: Document(
Expand All @@ -233,41 +233,9 @@ final class Task extends AppDocument<Task> {
);
}

/// The task was cancelled.
static const statusCancelled = TaskStatus.cancelled;

/// The task is yet to be run.
static const statusNew = TaskStatus.queuedForBackfill;

/// The task failed to run due to an unexpected issue.
static const statusInfraFailure = TaskStatus.infraFailure;

/// The task is currently running.
static const statusInProgress = TaskStatus.inProgress;

/// The task was run successfully.
static const statusSucceeded = TaskStatus.succeeded;

/// The task failed to run successfully.
static const statusFailed = TaskStatus.failed;

/// The task was skipped instead of being executed.
static const statusSkipped = TaskStatus.skipped;

static const Set<String> taskFailStatusSet = <String>{
Task.statusInfraFailure,
Task.statusFailed,
Task.statusCancelled,
};

static const finishedStatusValues = {
statusCancelled,
statusFailed,
statusInfraFailure,
statusSkipped,
statusSucceeded,
};

/// The timestamp (in milliseconds since the Epoch) that this task was
/// created.
///
Expand Down Expand Up @@ -384,7 +352,7 @@ final class Task extends AppDocument<Task> {
fieldBringup: bringup.toValue(),
fieldName: taskName.toValue(),
fieldStartTimestamp: 0.toValue(),
fieldStatus: Task.statusNew.toValue(),
fieldStatus: TaskStatus.waitingForBackfill.toValue(),
fieldTestFlaky: false.toValue(),
fieldCommitSha: commitSha.toValue(),
fieldAttempt: attempt.toValue(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:convert';

import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
import 'package:cocoon_common/is_dart_internal.dart';
import 'package:cocoon_common/task_status.dart';
import 'package:cocoon_server/logging.dart';
import 'package:googleapis/firestore/v1.dart';
import 'package:meta/meta.dart';
Expand Down Expand Up @@ -61,7 +62,7 @@ final class DartInternalSubscription extends SubscriptionHandler {
if (existing != null) {
fsTask = existing;
// Don't increment the task attempt if it's waiting for a build numnber.
if (fsTask.status != fs.Task.statusInProgress ||
if (fsTask.status != TaskStatus.inProgress ||
fsTask.buildNumber != build.number) {
fsTask.resetAsRetry();
}
Expand Down
6 changes: 3 additions & 3 deletions app_dart/lib/src/request_handlers/get_green_commits.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

import 'dart:async';

import 'package:cocoon_common/task_status.dart';
import 'package:github/github.dart';
import 'package:meta/meta.dart';

import '../model/firestore/task.dart' as fs;
import '../request_handling/body.dart';
import '../request_handling/request_handler.dart';
import '../service/build_status_provider/commit_tasks_status.dart';
Expand Down Expand Up @@ -75,8 +75,8 @@ final class GetGreenCommits extends RequestHandler<Body> {
continue;
}
if (!const {
fs.Task.statusSkipped,
fs.Task.statusSucceeded,
TaskStatus.skipped,
TaskStatus.succeeded,
}.contains(task.status)) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,14 @@ final class PostsubmitLuciSubscription extends SubscriptionHandler {
if (build.status == bbv2.Status.SCHEDULED) {
return false;
}
return !fs.Task.finishedStatusValues.contains(task.status);
return !task.status.isComplete;
}

/// Check if a builder should be rerun.
///
/// A rerun happens when a build fails, the retry number hasn't reached the limit, and the build is on TOT.
Future<bool> _shouldAutomaticallyRerun(fs.Task task) async {
if (!fs.Task.taskFailStatusSet.contains(task.status)) {
if (!task.status.isFailure) {
log.debug('${task.taskName} is not failing. No rerun needed.');
return false;
}
Expand Down
8 changes: 4 additions & 4 deletions app_dart/lib/src/request_handlers/rerun_prod_task.dart
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ final class RerunProdTask extends ApiRequestHandler<Body> {

// Wait for cancellations?
final Future<void> cancelRunningTasks;
if (statusesToRerun.contains(fs.Task.statusInProgress)) {
if (statusesToRerun.contains(TaskStatus.inProgress)) {
cancelRunningTasks = _luciBuildService.cancelBuildsBySha(
sha: commit.sha,
reason: '$email cancelled build to schedule a fresh rerun',
Expand All @@ -214,7 +214,7 @@ final class RerunProdTask extends ApiRequestHandler<Body> {

// If it appears the task was in progress, cancel any running builders
// and crease a _new_ task (to represent a new run).
if (task.status == fs.Task.statusInProgress) {
if (task.status == TaskStatus.inProgress) {
// Mark cancelled.
documentWrites.add(
fs.Task.patchStatus(
Expand All @@ -223,7 +223,7 @@ final class RerunProdTask extends ApiRequestHandler<Body> {
currentAttempt: task.currentAttempt,
taskName: task.taskName,
),
fs.Task.statusCancelled,
TaskStatus.cancelled,
),
);
}
Expand Down Expand Up @@ -258,7 +258,7 @@ final class RerunProdTask extends ApiRequestHandler<Body> {
// If we wanted to do better, that is, allow rerunning targets without
// waiting for the task to be complete, we'd need a different strategy
// (i.e. multiple tasks per release builder, versus one).
if (!fs.Task.finishedStatusValues.contains(task.status)) {
if (!task.status.isComplete) {
throw const BadRequestException(
'Cannot rerun a release builder that is not done running',
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ library;
import 'dart:collection';
import 'dart:convert';

import 'package:cocoon_common/task_status.dart';
import 'package:meta/meta.dart';

import '../../model/ci_yaml/target.dart';
import '../../model/commit_ref.dart';
import '../../model/firestore/task.dart';
import '../../model/task_ref.dart';
import '../../service/luci_build_service/pending_task.dart';
import '../../service/scheduler/policy.dart';
Expand Down Expand Up @@ -155,7 +155,7 @@ final class BackfillGrid {
continue;
}
for (final task in column) {
if (task.status != Task.statusNew) {
if (task.status != TaskStatus.waitingForBackfill) {
continue;
}
final commit = _commitsBySha[task.commitSha];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'dart:math';

import 'package:cocoon_common/is_release_branch.dart';
import 'package:cocoon_common/task_status.dart';
import 'package:meta/meta.dart';

import '../../model/firestore/task.dart' as fs;
Expand Down Expand Up @@ -64,7 +65,7 @@ final class DefaultBackfillStrategy extends BackfillStrategy {
// Remove entire columns where any of the following is true.
grid.removeColumnWhere((tasks) {
// At least one task in progress;
if (tasks.any((t) => t.status == fs.Task.statusInProgress)) {
if (tasks.any((t) => t.status == TaskStatus.inProgress)) {
return true;
}

Expand All @@ -83,7 +84,7 @@ final class DefaultBackfillStrategy extends BackfillStrategy {
for (final (_, column) in grid.eligibleTasks) {
for (var i = 0; i < column.length; i++) {
final row = column[i];
if (row.status != fs.Task.statusNew) {
if (row.status != TaskStatus.waitingForBackfill) {
continue;
}

Expand Down Expand Up @@ -151,12 +152,12 @@ final class DefaultBackfillStrategy extends BackfillStrategy {
static int? _indexOfTreeRedCause(Iterable<TaskRef> tasks) {
for (final (i, task) in tasks.indexed) {
// Only evaluate completed tasks.
if (!fs.Task.finishedStatusValues.contains(task.status)) {
if (!task.status.isComplete) {
continue;
}

// Returns true for failed tasks, and false for successful.
if (fs.Task.taskFailStatusSet.contains(task.status)) {
if (task.status.isFailure) {
return i;
} else {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'dart:math';

import 'package:cocoon_common/is_release_branch.dart';
import 'package:cocoon_common/task_status.dart';
import 'package:cocoon_server/logging.dart';
import 'package:github/github.dart';
import 'package:meta/meta.dart';
Expand Down Expand Up @@ -158,7 +159,7 @@ final class BatchBackfiller extends RequestHandler {
taskName: task.name,
currentAttempt: task.currentAttempt,
),
fs.Task.statusInProgress,
TaskStatus.inProgress,
);
}),
...skip.map((toSkip) {
Expand All @@ -169,7 +170,7 @@ final class BatchBackfiller extends RequestHandler {
taskName: task.name,
currentAttempt: task.currentAttempt,
),
fs.Task.statusSkipped,
TaskStatus.skipped,
);
}),
]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:async';

import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
import 'package:cocoon_common/is_release_branch.dart';
import 'package:cocoon_common/task_status.dart';
import 'package:cocoon_server/logging.dart';
import 'package:github/github.dart' as gh;
import 'package:googleapis/firestore/v1.dart';
Expand Down Expand Up @@ -69,7 +70,7 @@ final class VacuumStaleTasks extends RequestHandler<Body> {
final recentCommits = await _firestore.queryRecentCommitsAndTasks(
slug,
commitLimit: config.backfillerCommitLimit,
status: fs.Task.statusInProgress,
status: TaskStatus.inProgress,
branch: branch,
);
for (final CommitAndTasks(:commit, :tasks) in recentCommits) {
Expand Down Expand Up @@ -130,7 +131,7 @@ final class VacuumStaleTasks extends RequestHandler<Body> {
final task = fs.Task.fromDocument(intent.task);
switch (intent) {
case _ResetTaskStatusToNew():
task.setStatus(fs.Task.statusNew);
task.setStatus(TaskStatus.waitingForBackfill);
case _UpdateTaskFromLuciBuild():
task.updateFromBuild(intent.build);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ final class CommitTasksStatus {
FullTask(
tasks.first,
[...tasks.reversed.map((t) => t.buildNumber).nonNulls],
didAtLeastOneFailureOccur: tasks.any(
(t) => Task.taskFailStatusSet.contains(t.status),
),
didAtLeastOneFailureOccur: tasks.any((t) => t.status.isFailure),
lastCompletedAttemptWasFailure: _lastCompletedAttemptWasFailure(
tasks,
),
Expand All @@ -61,10 +59,10 @@ final class CommitTasksStatus {
// Iterate through the tasks.
// As soon as we find a PASSING or {FAILED, INFRA FAILURE, CANCELLED}, stop.
for (final task in tasks) {
if (task.status == Task.statusSucceeded) {
if (task.status.isSuccess) {
return false;
}
if (Task.taskFailStatusSet.contains(task.status)) {
if (task.status.isFailure) {
return true;
}
}
Expand Down
4 changes: 2 additions & 2 deletions app_dart/lib/src/service/build_status_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

import 'dart:async';

import 'package:cocoon_common/task_status.dart';
import 'package:cocoon_server/logging.dart';
import 'package:github/github.dart';
import 'package:meta/meta.dart';

import '../../cocoon_service.dart';
import '../model/firestore/github_build_status.dart';
import '../model/firestore/task.dart';
import 'build_status_provider/commit_tasks_status.dart';

/// Class that calculates the current build status.
Expand Down Expand Up @@ -70,7 +70,7 @@ interface class BuildStatusService {
}
if (collatedTask.lastCompletedAttemptWasFailure) {
failingTasks.add(collatedTask.task.taskName);
} else if (collatedTask.task.status == Task.statusSucceeded) {
} else if (collatedTask.task.status == TaskStatus.succeeded) {
toBePassing.remove(collatedTask.task.taskName);
}
}
Expand Down
3 changes: 2 additions & 1 deletion app_dart/lib/src/service/luci_build_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import 'dart:typed_data';

import 'package:buildbucket/buildbucket_pb.dart' as bbv2;
import 'package:cocoon_common/is_release_branch.dart';
import 'package:cocoon_common/task_status.dart';
import 'package:cocoon_server/logging.dart';
import 'package:fixnum/fixnum.dart';
import 'package:github/github.dart' as github;
Expand Down Expand Up @@ -1049,7 +1050,7 @@ class LuciBuildService {
) async {
// Update task status in Firestore.
task.resetAsRetry();
task.setStatus(fs.Task.statusInProgress);
task.setStatus(TaskStatus.inProgress);

await _firestore.batchWriteDocuments(
BatchWriteRequest(writes: documentsToWrites([task], exists: false)),
Expand Down
5 changes: 3 additions & 2 deletions app_dart/lib/src/service/scheduler.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'dart:convert';
import 'dart:math';

import 'package:cocoon_common/is_release_branch.dart';
import 'package:cocoon_common/task_status.dart';
import 'package:cocoon_server/logging.dart';
import 'package:collection/collection.dart';
import 'package:github/github.dart';
Expand Down Expand Up @@ -193,7 +194,7 @@ class Scheduler {
//
// See https://github.com/flutter/flutter/issues/163896.
if (skipAllTasks) {
task.setStatus(fs.Task.statusSkipped);
task.setStatus(TaskStatus.skipped);
continue;
}

Expand All @@ -208,7 +209,7 @@ class Scheduler {
);
if (priority != null) {
// Mark task as in progress to ensure it isn't scheduled over
task.setStatus(fs.Task.statusInProgress);
task.setStatus(TaskStatus.inProgress);
toBeScheduled.add(
PendingTask(
target: target,
Expand Down
Loading