Design Records
Design records document the engineering decisions behind PGSTY SILO: root causes, S3 and IAM protocol invariants, trade-offs against rejected alternatives, operational limits, and regression coverage.
November 9: Console Languages
- Adding Multilingual Support to SILO: Ten UI languages across Console 2.6.0 and Console 2.7.0 (including Portuguese from #83 and Turkish requested in silo#277), maintenance tiers, English fallback and Arabic RTL, with measured gzip and cache tradeoffs behind per-language assets and eager loading.
November 6: Found in Release Acceptance
- A Partial View Must Not Report an Existing Object as Missing: Why a node that reaches only some drives can answer 404 for an object that exists, and why “not found” must require an answer from every drive.
- A Failed Multipart Completion Can Strand the Upload: Why a completion that misses write quorum can strand the upload until stale-upload cleanup, and why the repair waits for fencing of storage operations.
November 4: Release-Blocking Lifecycle Fixes
- Multi-Pool Lifecycle Expiry: Decide on the Whole Object (#278, #279): Why an expiry decided on the versions of one pool hides, deletes, or resurrects versions in another pool, and why a recheck on the merged version list under the object lock is the minimum complete repair.
- Restored Copies: Expire the Copy, Not the Object (#281, #282): Why the expiry of a restored current version hid the object or stripped an older null version, and which storage and native-restore safeguards ship with the exact-version fix.
- Native Restore in Two Phases (#284): Why a native restore held the object lock for its whole tier download, why the first #281 safeguards also stranded failed ordinary uploads, and how staging outside the lock with a short, checked commit replaces the private upload.
- Audit Webhooks After a Peer Reload (#259): Why a runtime audit_webhook change leaves every server but the serving one with a stopped target, which logger subsystems share it, and why building logger targets on the server context plus opening the queue store first is the minimum complete repair.
- Failed Writes and Phantom Empty Prefixes (#285, #286): Why a write whose staged data vanished before the remote rename leaves an empty object directory that later lists as an empty prefix, and why removing it on both rename failure paths is sufficient.
- Heal Dry Run Must Not Delete Data (from #280): Why a dry-run heal could delete the last metadata copies of a dangling object and run a real bucket heal on remote nodes, and why an early return plus forwarding the dry-run flag to peers closes both paths.
- Lifecycle Delete-All Must Stay on One Key (found during review of #278): Why ExpiredObjectAllVersions, DelMarkerExpiration, and the default batch-expiration purge delete every other key under the expired key’s name, and why purging the key’s own versions by ID after a recheck is the minimum safe repair.
- Bucket Quota in the Console: List Display and Numeric Validation (silo-console#72, silo-console#73): Why a Console-set quota showed as “-” in the bucket list, why bucket creation could turn a huge quota into one byte, where both came from, and what the merged Console fix covers.
- Lock Domains of Large Single-Pool Clusters: Why DELETE and CopyObject fail to exclude PUT on the same key in single-pool clusters of 18 or more hosts, which layouts that covers, and the routing change that closes it.
November 1: Pool Migration Integrity Review
- Pool Migration Integrity Review: #261, #263, and #265: A maintainer review of three reports and their fixes, including the contributor merge of #266 and maintainer follow-up #276.
- Mixed EC Layouts and Migration Listing (#261, #262): Why a readable object can disappear from decommission and rebalance listings after an interrupted degraded overwrite, and why the narrow recount in #262 is sufficient.
- Tier Free Versions Are Internal Cleanup Records (#263, #264): Why a free version must stay visible to healing but must not become a user-visible delete marker or a migration version.
- ILM Expiry and Pool Migration Ordering (#265, #266, #276): Why a versioned Expiration marker must not cause the current version to be skipped, and how the maintainer follow-up preserves tier cleanup and completion semantics.
October 24: FULL_OBJECT Checksum Replication
- FULL_OBJECT Checksum Replication: Preserve the Type at Upload Initiation (
#254,#255): Why dropping the checksum type makes valid multipart CRC objects fail replication, how one shared header fix also restores the existing CopyObject path, and the source-upgrade and acceptance boundaries.
October 24: Multi-Pool Deletion and Placement
-
Multi-Pool Deletion: Preserve the Latest Copy on Failure (
#256,#257): Why an online-drive preflight cannot protect against later I/O failures, how staged cleanup preserves each item’s authoritative copy, and the retry, tier-reference, performance, and compatibility boundaries of the merged fix. -
Overwrite Pool Affinity: Why #245 Was Not Adopted (
#245): The original placement problem, request-aware quorum and health improvements, unversioned-only scope, two rounds of m3 performance measurements, and the decision to stop after small-object overwrite regressions remained. The experimental changes were not merged.
October 23: Alias Regions
- Alias regions: Persistent per-alias regions, client-cache isolation, and upgrade, downgrade and credential-rotation boundaries, reconciled with mcli 20261109.
October 23 IAM & KMS Design Notes
- LDAP Long DNs: Restoring Login Without Hiding Revocation Errors (
#250): How\xxhex escaping inNormalizeDNtriggers the 255-byte single-component filename limit on the object IAM backend, and whyloadIAMConfigBytesWithMetadataclassifies only impossible pure-ASCII path components (> 255bytes) aserrConfigNotFound. - IAM Policy Reloads: Lock Scope, Cancellation, and Time Budgets (
#251): Moving policy reload and KMS decryption outside the authentication-cache lock while retainingwriteMu, threading request cancellation end-to-end toKES.Decrypt, and keepingetcd30-second RPC deadlines separate from total decryption budgets.
Server 20261018 Key Design Notes
For the Server 20261018 release, see these core architecture notes:
- Object Lock Governance & Overwrite Protection (
SN-2026-015,SN-2026-016) - IAM Admin Credential Authorization (
SN-2026-017) - Durable IAM & Scoped STS Revocations (
SN-2026-013) - LIST Recovery Lock Cost
- ListMultipartUploads Rollback & Capacity Boundaries
- Multi-Pool Consistency & Rebalance Protection
- KES & OpenBao Integration
-
SigV4 Signed-Header Coverage: Rejecting Unsigned x-amz-* Headers
This article records the unsigned-header coverage repair committed to SILO as 123325430 in PR #173 (tracked as SN-2026-011) and the follow-up signing and payload-verification fixes in PR #177 (tracked as SN-2026-012), which shipped in Server …
This article records the unsigned-header coverage repair committed to SILO as 123325430 in PR #173 (tracked as SN-2026-011) and the follow-up signing and payload-verification fixes in PR #177 (tracked as SN-2026-012), which shipped in Server …
-
SILO Server 20260903 Pre-release Review
This is the pre-release engineering review behind SILO 20260903 (RELEASE.2026-09-03T13-18-01Z at 9b11dc9469e650815b775cb47b039610644f5da4, reviewed candidate 6e112d1856d4f3655f30fc81ee47e9f43d50d8f3, against baseline RELEASE.2026-08-06T00-00-00Z at …
This is the pre-release engineering review behind SILO 20260903 (RELEASE.2026-09-03T13-18-01Z at 9b11dc9469e650815b775cb47b039610644f5da4, reviewed candidate 6e112d1856d4f3655f30fc81ee47e9f43d50d8f3, against baseline RELEASE.2026-08-06T00-00-00Z at …
-
No I/O Before Auth, No Privilege From Headers
This note documents the CORS hot-path and replication-request trust repair merged in PR #101 (938603458 through 04b097fd9), tracked as SN-2026-008, and shipped in Server 20260903. Overview Two defects that appeared unrelated shared a single …
This note documents the CORS hot-path and replication-request trust repair merged in PR #101 (938603458 through 04b097fd9), tracked as SN-2026-008, and shipped in Server 20260903. Overview Two defects that appeared unrelated shared a single …
-
ListMultipartUploads Behavior and Design Trade-Offs
This note documents the ListMultipartUploads design across its full engineering lifecycle: the current MinIO-compatible contract in Server 20261018, the October 18 partial rollback after 16-drive erasure-set capacity testing, the October 17 on-disk …
This note documents the ListMultipartUploads design across its full engineering lifecycle: the current MinIO-compatible contract in Server 20261018, the October 18 partial rollback after 16-drive erasure-set capacity testing, the October 17 on-disk …
-
Read-Only Checksum Audit and Reliable CLI Output
This is the design and implementation record for MCLI’s read-only checksum verification workflow and pgsty/mc#5, the non-TTY output defect discovered during release review. The command merged into pgsty/mc through pull requests #8 and #13 and shipped …
This is the design and implementation record for MCLI’s read-only checksum verification workflow and pgsty/mc#5, the non-TTY output defect discovered during release review. The command merged into pgsty/mc through pull requests #8 and #13 and shipped …
-
Two SSE-C Keys, One CopyObject Response
This note documents the CopyObject SSE-C checksum response repair committed as e73436c99 and shipped in Server 20260903. It covers the successful CopyObject XML and HTTP response after the destination object has committed; stored object bytes, …
This note documents the CopyObject SSE-C checksum response repair committed as e73436c99 and shipped in Server 20260903. It covers the successful CopyObject XML and HTTP response after the destination object has committed; stored object bytes, …
-
Config Environment Files Are Not Shell Scripts
This note defines the startup contract for MINIO_CONFIG_ENV_FILE and documents the compatibility repair committed as 2aea7fe9c and shipped in Server 20260903. The file is a SILO input format; supporting an optional export prefix for operator …
This note defines the startup contract for MINIO_CONFIG_ENV_FILE and documents the compatibility repair committed as 2aea7fe9c and shipped in Server 20260903. The file is a SILO input format; supporting an optional export prefix for operator …
-
BadDigest, InvalidRequest, and the CompleteMultipartUpload Checksum Contract
The repairs for #48 and #50 shipped in Server 20260903, and the streaming-checksum follow-up (PR #143) shipped in Server 20260916. This record supersedes the earlier August proposal to leave CRC64NVME canonicalization unchanged. 20261018: Message …
The repairs for #48 and #50 shipped in Server 20260903, and the streaming-checksum follow-up (PR #143) shipped in Server 20260916. This record supersedes the earlier August proposal to leave CRC64NVME canonicalization unchanged. 20261018: Message …
-
A ListObjects Shortcut Must Not Turn a Missing Bucket into an Empty One
Shipped in SILO Server 20260903, PR #37 (commit e9c5340be, merged as 49c8aeac4, closing SILO #32) fixes an S3 compatibility regression where three early-return shortcuts in ListObjects, ListObjectsV2, and ListObjectVersions returned HTTP 200 OK with …
Shipped in SILO Server 20260903, PR #37 (commit e9c5340be, merged as 49c8aeac4, closing SILO #32) fixes an S3 compatibility regression where three early-return shortcuts in ListObjects, ListObjectsV2, and ListObjectVersions returned HTTP 200 OK with …
-
One Endpoint, Two Privileges: Separating User and Group Status
This article records the authorization design and verification for upstream issue minio/minio#21478, SILO PR #73 (commits 58735ee38 / 2e2377d1c), and the set-group-status follow-up (229fe2b3c), which shipped in Server 20260903. Too Long; Didn’t Read …
This article records the authorization design and verification for upstream issue minio/minio#21478, SILO PR #73 (commits 58735ee38 / 2e2377d1c), and the set-group-status follow-up (229fe2b3c), which shipped in Server 20260903. Too Long; Didn’t Read …
-
Conditional DELETE: One Condition, One Logical Object
Single-object conditional deletion (If-Match on DeleteObject) landed in PR #145, and PR #178 repaired multi-pool serialization and reconciliation. Both changes shipped in Server 20260916. An earlier August proposal around PR #12 sketched a broader …
Single-object conditional deletion (If-Match on DeleteObject) landed in PR #145, and PR #178 repaired multi-pool serialization and reconciliation. Both changes shipped in Server 20260916. An earlier August proposal around PR #12 sketched a broader …
-
Why CompleteMultipartUpload Must Return ChecksumType: Review of PR #57
PR #57, contributed by Shooks (@Dansyuqri), resolved #47 and shipped in Server 20260903. It restores the ChecksumType element in CompleteMultipartUpload XML responses whenever an object stores an additional S3 checksum. The Defect and Its Scope …
PR #57, contributed by Shooks (@Dansyuqri), resolved #47 and shipped in Server 20260903. It restores the ChecksumType element in CompleteMultipartUpload XML responses whenever an object stores an additional S3 checksum. The Defect and Its Scope …
-
Optional Checksums, Mandatory Failure: Repairing UploadPart and UploadPartCopy Compatibility
This is the design and implementation record for SILO #46 (merged as 7fea6d5a5 and shipped in Server 20260903, with follow-up items #63 and #64). It documents how handling an optional S3 part checksum header affected multipart completion semantics, …
This is the design and implementation record for SILO #46 (merged as 7fea6d5a5 and shipped in Server 20260903, with follow-up items #63 and #64). It documents how handling an optional S3 part checksum header affected multipart completion semantics, …
-
When the Total Is Unknown: Folder Download Progress
SILO Console v2.1.1 displayed NaN% in the Downloads / Uploads drawer while downloading a folder. Although the streamed ZIP archive continued transferring normally and stored objects were intact, the progress bar entered an invalid determinate …
SILO Console v2.1.1 displayed NaN% in the Downloads / Uploads drawer while downloading a folder. Although the streamed ZIP archive continued transferring normally and stored objects were intact, the progress bar entered an invalid determinate …
-
Preview Text, Never Execute It: SILO Console Text Preview Design
SILO Console previews images, PDFs, audio, and video, but in v2.1.1 it could not preview the small logs, text files, JSON documents, and XML documents that operators inspect every day. Even when an object stored an accurate Content-Type, the frontend …
SILO Console previews images, PDFs, audio, and video, but in v2.1.1 it could not preview the small logs, text files, JSON documents, and XML documents that operators inspect every day. Even when an object stored an accurate Content-Type, the frontend …
-
DSN-Only Database Notifications: A Compatibility Boundary for #53
Shipped in SILO Server 20260903 via commit f1ba68358, this design resolves SILO issue #53 by establishing the compatibility boundary, legacy-migration behavior, and startup error handling for PostgreSQL and MySQL bucket-notification targets. Decision …
Shipped in SILO Server 20260903 via commit f1ba68358, this design resolves SILO issue #53 by establishing the compatibility boundary, legacy-migration behavior, and startup error handling for PostgreSQL and MySQL bucket-notification targets. Decision …