diff --git a/app/lib/fake/backend/fake_download_counts.dart b/app/lib/fake/backend/fake_download_counts.dart index e1df8214e9..179e736053 100644 --- a/app/lib/fake/backend/fake_download_counts.dart +++ b/app/lib/fake/backend/fake_download_counts.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:gcloud/storage.dart'; import 'package:pub_dev/service/download_counts/computations.dart'; import 'package:pub_dev/shared/configuration.dart'; +import 'package:pub_dev/shared/storage.dart'; import 'package:pub_dev/shared/utils.dart'; Future generateFakeDownloadCounts( @@ -14,12 +15,12 @@ Future generateFakeDownloadCounts( final file = File(dataFilePath).readAsBytesSync(); await storageService .bucket(activeConfiguration.downloadCountsBucketName!) - .writeBytes(downloadCountsFileName, file); + .writeBytesWithRetry(downloadCountsFileName, file); } Future generateFake30DaysTotals(Map totals) async { await storageService .bucket(activeConfiguration.reportsBucketName!) - .writeBytes( + .writeBytesWithRetry( downloadCounts30DaysTotalsFileName, jsonUtf8Encoder.convert(totals)); } diff --git a/app/lib/fake/backend/fake_topics.dart b/app/lib/fake/backend/fake_topics.dart index 2dd54ac14f..81d44603da 100644 --- a/app/lib/fake/backend/fake_topics.dart +++ b/app/lib/fake/backend/fake_topics.dart @@ -6,11 +6,12 @@ import 'package:gcloud/storage.dart'; import '../../service/topics/count_topics.dart'; import '../../shared/configuration.dart'; +import '../../shared/storage.dart'; import '../../shared/utils.dart'; Future generateFakeTopicValues() async { await storageService .bucket(activeConfiguration.reportsBucketName!) - .writeBytes(topicsJsonFileName, + .writeBytesWithRetry(topicsJsonFileName, jsonUtf8Encoder.convert({'ffi': 7, 'ui': 5, 'network': 6})); } diff --git a/app/lib/package/tarball_storage.dart b/app/lib/package/tarball_storage.dart index 858c75a3e0..e7750b2a97 100644 --- a/app/lib/package/tarball_storage.dart +++ b/app/lib/package/tarball_storage.dart @@ -147,7 +147,7 @@ class TarballStorage { required String package, required String version, }) async { - await _storage.copyObject( + await _storage.copyObjectWithRetry( sourceAbsoluteObjectName, _canonicalBucket.absoluteObjectName(tarballObjectName(package, version)), ); @@ -157,7 +157,7 @@ class TarballStorage { Future copyArchiveFromCanonicalToPublicBucket( String package, String version) async { final objectName = tarballObjectName(package, version); - await _storage.copyObject( + await _storage.copyObjectWithRetry( _canonicalBucket.absoluteObjectName(objectName), _publicBucket.absoluteObjectName(objectName), ); @@ -186,7 +186,7 @@ class TarballStorage { final objectName = tarballObjectName(package, version); final info = await _canonicalBucket.tryInfo(objectName); if (info != null) { - await _canonicalBucket.delete(objectName); + await _canonicalBucket.deleteWithRetry(objectName); } } @@ -232,11 +232,11 @@ class TarballStorage { _logger .warning('Updating missing object in public bucket: $objectName'); try { - await _storage.copyObject( + await _storage.copyObjectWithRetry( _canonicalBucket.absoluteObjectName(objectName), _publicBucket.absoluteObjectName(objectName), ); - final newInfo = await _publicBucket.info(objectName); + final newInfo = await _publicBucket.infoWithRetry(objectName); await updateContentDispositionToAttachment(newInfo, _publicBucket); updatedCount++; } on Exception catch (e, st) { @@ -307,7 +307,7 @@ class TarballStorage { for (final objectName in deleteObjects) { _logger.shout('Deleting object from public bucket: "$objectName".'); - await _publicBucket.delete(objectName); + await _publicBucket.deleteWithRetry(objectName); } return PublicBucketUpdateStat( diff --git a/app/lib/shared/storage.dart b/app/lib/shared/storage.dart index ef320c7290..540e1ff2b8 100644 --- a/app/lib/shared/storage.dart +++ b/app/lib/shared/storage.dart @@ -201,6 +201,27 @@ extension BucketExt on Bucket { ), ); } + + /// Create an new object in the bucket with specified content with the default retry. + Future writeBytesWithRetry( + String name, + List bytes, { + ObjectMetadata? metadata, + Acl? acl, + PredefinedAcl? predefinedAcl, + String? contentType, + }) async { + return await _retry( + () async => await writeBytes( + name, + bytes, + metadata: metadata, + acl: acl, + predefinedAcl: predefinedAcl, + contentType: contentType, + ), + ); + } } extension PageExt on Page { diff --git a/pkg/fake_gcloud/lib/retry_enforcer_storage.dart b/pkg/fake_gcloud/lib/retry_enforcer_storage.dart index 38a9d3e534..3b71e51c1e 100644 --- a/pkg/fake_gcloud/lib/retry_enforcer_storage.dart +++ b/pkg/fake_gcloud/lib/retry_enforcer_storage.dart @@ -59,7 +59,6 @@ class RetryEnforcerStorage implements Storage { Future bucketExists(String bucketName) async { return await _verifyRetry( () => _storage.bucketExists(bucketName), - ignore: true, ); } @@ -67,7 +66,6 @@ class RetryEnforcerStorage implements Storage { Future bucketInfo(String bucketName) async { return await _verifyRetry( () async => await _storage.bucketInfo(bucketName), - ignore: true, ); } @@ -75,7 +73,6 @@ class RetryEnforcerStorage implements Storage { Future copyObject(String src, String dest, {ObjectMetadata? metadata}) async { return await _verifyRetry( () => _storage.copyObject(src, dest, metadata: metadata), - ignore: true, ); } @@ -91,7 +88,6 @@ class RetryEnforcerStorage implements Storage { predefinedAcl: predefinedAcl, acl: acl, ), - ignore: true, ); } @@ -99,7 +95,6 @@ class RetryEnforcerStorage implements Storage { Future deleteBucket(String bucketName) async { return await _verifyRetry( () => _storage.deleteBucket(bucketName), - ignore: true, ); } @@ -112,7 +107,6 @@ class RetryEnforcerStorage implements Storage { Future> pageBucketNames({int pageSize = 50}) async { return await _verifyRetry( () => _storage.pageBucketNames(pageSize: pageSize), - ignore: true, ); } } @@ -134,7 +128,6 @@ class _RetryEnforcerBucket implements Bucket { Future delete(String name) async { return await _verifyRetry( () async => await _bucket.delete(name), - ignore: true, ); } @@ -142,7 +135,6 @@ class _RetryEnforcerBucket implements Bucket { Future info(String name) async { return await _verifyRetry( () async => await _bucket.info(name), - ignore: true, ); } @@ -167,7 +159,6 @@ class _RetryEnforcerBucket implements Bucket { delimiter: delimiter, pageSize: pageSize, )), - ignore: true, ); } @@ -222,7 +213,6 @@ class _RetryEnforcerBucket implements Bucket { predefinedAcl: predefinedAcl, contentType: contentType, ), - ignore: true, ); } } @@ -241,7 +231,6 @@ class _RetryEnforcerPage implements Page { Future> next({int pageSize = 50}) async { return await _verifyRetry( () async => _RetryEnforcerPage(await _page.next(pageSize: pageSize)), - ignore: true, ); } }