feat(preprod): Gate snapshot objectstore writes behind an option - #124210
Conversation
Sentry Snapshot Testing
|
def5081 to
20a9161
Compare
20a9161 to
03d1484
Compare
|
Closing: we're moving size-analysis content to its own objectstore usecase instead of moving snapshots, so no CLI change is needed. |
c2b90bf to
30fd559
Compare
…124194) Prepares snapshot storage to move from the shared `preprod` Objectstore usecase into `preprod_snapshots`. This PR registers the new usecase and adds cross-usecase reads, HEAD checks, and deletes through `SnapshotStorage`. Writes remain on `preprod`, so this deploy does not move stored content or change the write destination. The fallback metric records when reads use the secondary usecase. The upload-options endpoint also accepts `usecase=auto` and echoes the chosen usecase in its response. Requests without the parameter keep receiving `preprod` tokens for compatibility with existing CLI releases. getsentry/sentry-cli#3408 and getsentry/cli#1587 opt into this contract; #124210 adds the default-off option that selects `preprod_snapshots` for new writes. Register `preprod_snapshots` in the Objectstore service configuration **before deploying this prerequisite**: fallback reads may access it whenever an object is missing from `preprod`. Deploy the backend stack fully before enabling the write-selection option. No content-copy migration is required; existing uploads remain readable through the fallback.
Add preprod.snapshots.snapshots-usecase.enabled (default false). When on, server writes and usecase=auto tokens target the snapshots usecase instead of preprod. Reads keep falling back across both.
30fd559 to
e3cc176
Compare
Adds `UsecaseId.PREPROD_SIZE` (`preprod_size`) and explicit `image_type` handling in the shared image endpoint. Uses the shared snapshot reader introduced by #124194, now on `master`. - `preprod_size_app_icon`: read `preprod_size`, then `preprod` if missing. - `preprod_snapshots`: delegate to `get_snapshot_storage`, preserving its two-namespace reader. - No `image_type`: use the shared snapshot reader for legacy requests. IDs remain opaque; no prefix selects a reader. - Any other value: reject before storage access. The independent #124210 controls the snapshot reader's primary/write usecase. The reader defaults to `preprod` first; when that option is enabled, it tries `preprod_snapshots` first and falls back to `preprod`. This PR neither enables that option nor resolves its outstanding rollout blocker. Both size-icon fallback reads and snapshot GET/HEAD fallback reads emit `preprod.objectstore.fallback` logs with the reader's `image_type`, `operation`, and `found` result for the Preprod Health dashboard. The logs count completed secondary reads, not primary hits or storage errors; the snapshot secondary namespace depends on the write option. Marks `UsecaseId.PREPROD` deprecated for new code while retaining migration compatibility. Cleanup is tracked in EME-1313, and both January 1, 2027 TODOs remain. Companion frontend: #124330. Companion writer: getsentry/launchpad#684. Confirm the Objectstore expiration safeguards from getsentry/ops#23486 are deployed, deploy the shared reader and this backend change, then deploy the frontend before switching Launchpad writes. Cached clients that omit `image_type` can still miss icons stored only in `preprod_size` until refreshed; the default reader does not infer icon type from IDs.
jamieQ
left a comment
There was a problem hiding this comment.
Changes generally make sense. The (presumed) bot comment seems like it probably needs a solution:
Outstanding review blocker: comparison outputs currently reuse artifact-pair keys. Recomputing a comparison across a usecase switch and then rolling back can read an older manifest or mask while the database describes the newer result. Before rollout, comparison generations need authoritative, generation-qualified storage references with rolling-deploy compatibility.
| ) | ||
|
|
||
| register( | ||
| "preprod.snapshots.snapshots-usecase.enabled", |
There was a problem hiding this comment.
nit: 'snapshots-usecase.enabled' seems slightly vague since it doesn't imply that it has something to do specifically with objectstore/storage.
There was a problem hiding this comment.
changed the name
Rename preprod.snapshots.snapshots-usecase.enabled to preprod.snapshots.objectstore.snapshots-usecase.enabled so the option name makes clear it selects the objectstore usecase for snapshot writes.
i thought for a while about this and: in order to "patch" this concern, we'd have to add some sort of versioning.. and honestly I feel like this change should go through pretty smoothly so I'm biased to just ship as is since we don't do the recompare oftens anyways and this should work out |
Snapshot uploads now request `usecase=auto` and build their Objectstore session from the usecase returned by the server rather than hardcoding `preprod`. Both batched HEAD checks and image uploads use that session, keeping their paths aligned with the minted token. This lets the backend move new snapshot content into `preprod_snapshots` without another CLI change. Servers that omit the response field default to `preprod`, so existing Sentry versions retain their current behavior. The integration coverage exercises actual upload-options requests, authenticated Objectstore batches, and snapshot creation for `preprod_snapshots`, explicit `preprod`, and an omitted usecase. Object keys stay unchanged; the first upload after a usecase switch re-uploads images once because deduplication is scoped by usecase. Pairs with getsentry/sentry#124194 (cross-usecase reads and the upload-options contract) and getsentry/sentry#124210 (default-off write selection). getsentry/cli#1587 implements the same contract in the replacement CLI; both clients are being updated. Register `preprod_snapshots` in Objectstore before deploying the backend prerequisite and enable the option only after the backend rollout. Older CLI releases keep writing to `preprod` and remain readable through fallback reads.
Snapshot uploads now request `usecase=auto` from the upload-options endpoint and use the server's returned usecase for both HEAD deduplication checks and PUT uploads, rather than hardcoding `preprod`. This keeps Objectstore paths aligned with the minted token and lets the backend move new snapshot content into `preprod_snapshots` without another CLI change. When older servers omit `usecase`, response parsing defaults it to `preprod`, preserving the existing upload behavior. Object keys remain unchanged; because deduplication is scoped by usecase, the first upload after a server-side switch re-uploads images once. Pairs with getsentry/sentry#124194 (cross-usecase reads and the upload-options contract) and getsentry/sentry#124210 (server-controlled write selection). getsentry/sentry-cli#3408 implements the same contract in the legacy CLI; both clients are being updated. The backend option remains off by default: register `preprod_snapshots` in Objectstore before deploying the backend prerequisite, then enable the option only after the backend rollout. Older CLI releases keep writing to `preprod` and remain readable through fallback reads.
Snapshot uploads now request `usecase=auto` from the upload-options endpoint and use the server's returned usecase for both HEAD deduplication checks and PUT uploads, rather than hardcoding `preprod`. This keeps Objectstore paths aligned with the minted token and lets the backend move new snapshot content into `preprod_snapshots` without another CLI change. When older servers omit `usecase`, response parsing defaults it to `preprod`, preserving the existing upload behavior. Object keys remain unchanged; because deduplication is scoped by usecase, the first upload after a server-side switch re-uploads images once. Pairs with getsentry/sentry#124194 (cross-usecase reads and the upload-options contract) and getsentry/sentry#124210 (server-controlled write selection). getsentry/sentry-cli#3408 implements the same contract in the legacy CLI; both clients are being updated. The backend option remains off by default: register `preprod_snapshots` in Objectstore before deploying the backend prerequisite, then enable the option only after the backend rollout. Older CLI releases keep writing to `preprod` and remain readable through fallback reads.
Snapshot uploads now request `usecase=auto` from the upload-options endpoint and use the server's returned usecase for both HEAD deduplication checks and PUT uploads, rather than hardcoding `preprod`. This keeps Objectstore paths aligned with the minted token and lets the backend move new snapshot content into `preprod_snapshots` without another CLI change. When older servers omit `usecase`, response parsing defaults it to `preprod`, preserving the existing upload behavior. Object keys remain unchanged; because deduplication is scoped by usecase, the first upload after a server-side switch re-uploads images once. Pairs with getsentry/sentry#124194 (cross-usecase reads and the upload-options contract) and getsentry/sentry#124210 (server-controlled write selection). getsentry/sentry-cli#3408 implements the same contract in the legacy CLI; both clients are being updated. The backend option remains off by default: register `preprod_snapshots` in Objectstore before deploying the backend prerequisite, then enable the option only after the backend rollout. Older CLI releases keep writing to `preprod` and remain readable through fallback reads.
Adds the default-off boolean option
preprod.snapshots.objectstore.snapshots-usecase.enabledto select the destination for new snapshot content, using the shared storage reader introduced by #124194, now onmaster.With the option off, writes remain on
preprod. When enabled, server-side writes (manifests, precomputed head images, comparison results, diff masks, and ZIP archives) usepreprod_snapshots, and reads prefer that namespace before falling back topreprod. Upload-options requests withusecase=autoreceive a token for the selected usecase and its name in the response; getsentry/sentry-cli#3408 and getsentry/cli#1587 use that contract for direct screenshot uploads. Requests withoutusecase=autocontinue receivingpreprodtokens even when the option is enabled.The Objectstore policy change in getsentry/ops#23486 is merged; confirm it is deployed and deploy the backend stack fully before enabling the option through sentry-options-automator. Because deduplication is scoped by usecase, upgraded clients re-upload images once after the switch; later uploads deduplicate normally.
Outstanding review blocker: comparison outputs currently reuse artifact-pair keys. Recomputing a comparison across a usecase switch and then rolling back can read an older manifest or mask while the database describes the newer result. Before rollout, comparison generations need authoritative, generation-qualified storage references with rolling-deploy compatibility. This is a broader follow-up than cleanup; do not enable getsentry/sentry-options-automator#9713 until it is addressed.