feat(preprod): Gate snapshot objectstore writes behind an option - #124210
NicoHinderling wants to merge 3 commits into
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.
Adds the default-off boolean option
preprod.snapshots.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.