Skip to content

Commit a3ef662

Browse files
authored
Fix aborted token handling in task scheduler. (#8511)
1 parent b1960d3 commit a3ef662

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

app/lib/task/backend.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,6 @@ class TaskBackend {
482482
),
483483
});
484484
state.derivePendingAt();
485-
state.abortedTokens?.removeWhere((t) => t.expires.isAfter(clock.now()));
486485

487486
_log.info('Update state tracking for $packageName');
488487
tx.insert(state);

app/test/task/task_test.dart

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import 'package:pub_dev/tool/test_profile/importer.dart';
2121
import 'package:pub_dev/tool/test_profile/models.dart';
2222
import 'package:test/test.dart';
2323

24+
import '../shared/handlers_test_utils.dart';
2425
import '../shared/test_services.dart';
2526
import 'fake_time.dart';
2627

@@ -695,6 +696,88 @@ void main() {
695696
TestUser(email: '[email protected]', likes: []),
696697
],
697698
));
699+
700+
testWithFakeTime(
701+
'new version during ongoing analysis',
702+
testProfile: TestProfile(
703+
defaultUser: '[email protected]',
704+
packages: [
705+
TestPackage(
706+
name: 'neon',
707+
versions: [TestVersion(version: '1.0.0')],
708+
),
709+
],
710+
users: [
711+
TestUser(email: '[email protected]', likes: []),
712+
],
713+
),
714+
(fakeTime) async {
715+
await taskBackend.backfillTrackingState();
716+
await taskBackend.start();
717+
await fakeTime.elapse(minutes: 15);
718+
{
719+
final instances = await cloud.listInstances().toList();
720+
// There is only one package, so we should only get one instance
721+
expect(instances, hasLength(1));
722+
723+
final instance = instances.first;
724+
final payload = instance.payload;
725+
726+
// There should only be one version
727+
expect(payload.versions, hasLength(1));
728+
final v = payload.versions.first;
729+
730+
// Create new versions, removing the token from the first version
731+
await importProfile(
732+
source: ImportSource.autoGenerated(),
733+
profile: TestProfile(
734+
defaultUser: '[email protected]',
735+
packages: [
736+
TestPackage(
737+
name: 'neon',
738+
versions: [
739+
TestVersion(version: '1.1.0'),
740+
TestVersion(version: '1.2.0'),
741+
TestVersion(version: '2.0.0'),
742+
TestVersion(version: '3.0.0'),
743+
TestVersion(version: '4.0.0'),
744+
TestVersion(version: '5.0.0'),
745+
],
746+
),
747+
],
748+
),
749+
);
750+
751+
await fakeTime.elapse(minutes: 15);
752+
753+
// Use token to get the upload information
754+
final api = createPubApiClient(authToken: v.token);
755+
await expectApiException(
756+
api.taskUploadResult(
757+
payload.package,
758+
v.version,
759+
),
760+
status: 400,
761+
code: 'TaskAborted',
762+
message: 'neon/1.0.0 has been aborted.',
763+
);
764+
765+
// Report the task as finished
766+
await expectApiException(
767+
api.taskUploadFinished(payload.package, v.version),
768+
status: 400,
769+
code: 'TaskAborted',
770+
message: 'neon/1.0.0 has been aborted.',
771+
);
772+
}
773+
// Leave time for the instance to be deleted (takes 1 min in fake cloud)
774+
await fakeTime.elapse(minutes: 5);
775+
776+
await taskBackend.stop();
777+
778+
await fakeTime.elapse(minutes: 10);
779+
},
780+
);
698781
}
699782

700783
extension<T> on Stream<T> {

0 commit comments

Comments
 (0)