Repository navigation
Conversation
|
Claude finished @jcastro-dotcms's task in 4m 1s —— View job Review: durable S3 push-publishing bundles (#37774)
This is a careful, well-staged change. The private-staging-then-publish pattern ( New Issues
Prior findings (rollback-safety bot comments)
Notes (non-blocking)
Nothing here is blocking. The one Medium is a narrow flag-toggle edge with no data-loss impact. · |
|
Pull Request Unsafe to Rollback!!!
|
2da5728 to
4701296
Compare
05b261e to
4ae1a5c
Compare
4701296 to
fc1d9d5
Compare
4ae1a5c to
86992b7
Compare
fc1d9d5 to
a0e9eab
Compare
86992b7 to
4f778fe
Compare
4f778fe to
f552bdb
Compare
2a60b57 to
6964d89
Compare
f552bdb to
13879e9
Compare
6964d89 to
788f4d0
Compare
13879e9 to
6771ed3
Compare
Fifth slice of the S3 asset storage work. With FEATURE_FLAG_S3_ASSET_STORAGE on, generated and received publishing bundles are staged privately and published to the publishing-bundles S3 group before replacing the local archive, reads restore archives on demand, and committed bundle deletion schedules a retrying bundleArchiveCleanup job. The cleanup processor does not register while the flag is off, and flag-off bundle handling matches main.
…e paths These fixes apply only with FEATURE_FLAG_S3_ASSET_STORAGE on; flag-off bundle paths are unchanged. Durable bundle archives now age out. BinaryCleanupJob.cleanUpOldBundles calls a new expireDurableBundles method, which asks BundleArchiveStorage.expireOlderThan to delete S3 archives whose last-modified time is older than CLEANUP_BUNDLES_OLDER_THAN_DAYS, the same threshold the local bundle directory cleanup uses. Previously the S3 copies were only removed when a user deleted bundle history. The bundle pages no longer depend on S3 being reachable. Bundle.bundleTgzExists and the retry-button check in BundlerUtil use a new BundleArchiveStorage.existsForDisplay, which logs a storage failure and reports the archive as missing, while exists stays strict for publishing and retry decisions. view_unpushed_bundles.jsp and edit_publish_bundle.jsp check once per bundle instead of up to three times. Static publishing fails the bundle with an IOException when a File Asset's binary is missing, matching the flag-off failure, instead of skipping the file and reporting success. The cache lease is held across finding and copying the binary, and the log text with the wrong wording is gone. BundleArchiveStorage.receive derives the bundle id from the part of the file name before the first .tar.gz, the rule the receiving endpoints and BundlePublisher use, so names such as release.tar.gz-v2.tar.gz or x.tar.gzip are stored where they are read. The bundleArchiveCleanup job treats a bundle row that exists again as a successful no-op instead of a retryable failure, and holds a per-bundle lock, also held by BundleArchiveStorage.store, across its row check and delete. The download cleanup in RemotePublishAjaxAction now also catches unchecked storage exceptions. Adds BundleArchiveStorageTest and FileAssetBundlerTest, and documents retention, the page check, the id rule and the remaining cleanup race in BINARY_S3_STORAGE.md.
6771ed3 to
ed86935
Compare
788f4d0 to
4f3af4b
Compare
|
Pull Request Unsafe to Rollback!!!
|
Refs #37868
Proposed Changes
BundleArchiveStoragestores completed push-publishing archives (<bundle-id>.tar.gz, manifest included) in thepublishing-bundlesgroup, with the bundle directory as a cache. Bundle ids keep their case and cannot resolve outside the bundle directory. Stored and received archives use the same id rule the receivers use (the name up to the first.tar.gz).BundlePublisherResource,BundleResource,RemotePublishAjaxAction,TarGzipBundleOutput) are staged privately and published to S3 before they replace the last complete archive, so a partial upload never becomes visible. Manifest and payload reads restore the archive only when needed.BinaryCleanupJobexpires the S3 copies after the sameCLEANUP_BUNDLES_OLDER_THAN_DAYS(default 4) as the local bundle directory.bundleArchiveCleanupjob, which keeps the local bytes if remote deletion fails. If the bundle's row exists again when the job runs, because the bundle was received again, the job ends as a no-op.Behavior with the flag off
Unchanged from main. The bundle path is built the same way (only the
Fileconstruction differs), and the new path checks apply only with the flag on. The bundle pages now evaluate the existence check once per bundle instead of up to three times, with the same result. No REST annotations change, soopenapi.yamlis unchanged.Review fixes
The last commit on this branch (
fix(storage): bound durable bundle retention and harden flag-on bundle paths) addresses a full review of this PR. All of it is flag-on only:Checklist
BundleArchiveStorageTestandFileAssetBundlerTest. Integration on this branch before the review fixes, flag off: 75 run, 0 failures, across the newPublishingArchiveStorageTestand eight existing publishing tests (PublisherAPIImplTestx2,BundlePublisherTest,BundlerUtilTest,BundlerUtilIntegrationTest,ManifestReaderFactoryTest,ManifestUtilTest,BundleResourceTest,PushPublishBundleGeneratorTest); flag on: 21 run, 0 failures. After the review fixes,PublishingArchiveStorageTestandBundleResourceTestpassed flag off and on in the run on the top of the stack (feat(storage): serve renditions, compiled CSS and templates through S3 asset storage #37776).