Skip to content

s3proxy: Go backend disconnect behind an env var - #47

Merged
shreyas-blacksmith merged 2 commits into
patchsetfrom
shreyas/go-backend-disconnect
Sep 17, 2026
Merged

shreyas-blacksmith merged 2 commits into
patchsetfrom
shreyas/go-backend-disconnect

Conversation

@shreyas-blacksmith

@shreyas-blacksmith shreyas-blacksmith commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

The cut itself, per the go-l1-minio-disconnect design (default-to-cut, one-region canary): BAZEL_REMOTE_GO_BACKEND_DISCONNECT=1 makes every Go-cache request bypass the S3 backend entirely.

What

  • Get/Contains: clean misses for all entry kinds on Go requests (labels or storage-prefix tool segment), counted on backendLookupsSkipped{reason=go_disconnect} — distinct from the always-on AC-only go_ac skip it extends.
  • Put: write-through dropped before the upload queue, counted on the new bazel_remote_s3_backend_uploads_skipped_total — deliberately no operation outcome, since web accounting reads dropped/error statuses as failures and a policy skip is neither.
  • LRU artifacts: Go-tenant artifact uploads (…/go/lru/…) skip as successful no-ops — the zero-S3-ops contract covers advisory writes too; their only consumer (the retention sweep) is paused for Go namespaces during the canary window.
  • Toggle read once at proxy construction, threaded to every backend (single and multi-backend map mode). Roll-in/roll-out is an inventory env re-render + restart, minutes either way.

What it deliberately does NOT do

  • No data migration, no deletion: MinIO's existing Go bytes stay put as the rollback warm store until the keep-cut decision is final.
  • No fa/web changes in this PR. The canary checklist on the fa side: pause Go-scoped retention sweeps + cap/RO pins for the window (a cap-driven RO pin on a stale footprint would contaminate the measurement), and pin the toggle in the canary region's inventory.

Measurement

Rides the observability released in v2.6.1-blacksmith.8: census (per-tenant resident/put/hit/evict), byte-weighted eviction ages, retention window, plus the skip counters above for cut verification (bazel_remote_s3_* for Go pinned at zero).

Testing

go test + bazel test green on cache/s3proxy: skip coverage for all kinds × both Go-detection paths, put-enqueue gating on/off, artifact-key classification, and non-Go traffic untouched.

Made with Cursor


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled. (Staging)

shreyas-blacksmith and others added 2 commits September 17, 2026 17:23
The Go cache's MinIO write-through is being cut in a one-region canary.
BAZEL_REMOTE_GO_BACKEND_DISCONNECT=1 makes every Go-cache request bypass
the S3 backend — Get and Contains answer clean misses for all entry
kinds (counted on backendLookupsSkipped with the new go_disconnect
reason, distinct from the always-on go_ac AC-only skip) and Put closes
the payload without enqueueing (counted on the new
bazel_remote_s3_backend_uploads_skipped_total counter, deliberately
with no operation outcome: the web-side accounting reads
dropped/error/rejected statuses as failures). The toggle is read once
at proxy construction and threaded to every backend, so it covers both
single-backend and multi-backend map mode; the env var makes
roll-in/roll-out an inventory env change rather than a binary roll.

With Puts skipped, the L1's forwarded-to-created accounting for Go
flatlines — intended, paired with a web-side enforcement pause during
the canary window.

Co-authored-by: Cursor <cursoragent@cursor.com>
Completes the disconnect's zero-S3-ops contract: with the toggle on, a
Go namespace's advisory LRU artifacts stop uploading along with the
cache bytes they describe (their only consumer, the web retention
sweep, is paused for Go namespaces during the canary). Skips are
successful no-ops counted on backend_uploads_skipped_total - failing
them would make the flusher log every pass. Keyed on the artifact key
(tool segment before lru/) because flush timers carry no tenant
context.

Co-authored-by: Cursor <cursoragent@cursor.com>
@shreyas-blacksmith
shreyas-blacksmith marked this pull request as ready for review September 17, 2026 21:31
@shreyas-blacksmith
shreyas-blacksmith merged commit 49e3da3 into patchset Sep 17, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant