HDDS-15801. Add blogs on S3 compatibility and S3 conditional requests#488
HDDS-15801. Add blogs on S3 compatibility and S3 conditional requests#488peterxcli wants to merge 4 commits into
Conversation
|
cc @jojochuang |
jojochuang
left a comment
There was a problem hiding this comment.
Nice work — both posts are technically strong and well structured. I spotted a handful of Chinglish phrasing issues and two grammar breaks. Most are small word-choice fixes; the technical content reads well throughout.
Recurring patterns:
- Overuse of "really" (reads like 真的)
- "at the beginning" / "at the first time" (literal 一开始 / 第一次)
- A few section titles and word orders that sound translated
What reads well (no change needed):
- Blog 2 opening on shared-everything architectures, LSN union reads, and coordination
- TL;DR and atomic-rewrite explanation in blog 2
- Use-case sections (Turbopuffer, SlateDB, Iceberg, leader election, OSWALD)
- Mermaid sequence diagrams and figure captions
- Blog 1 lazy-loading / Parquet / search-index optimization section
- Both conclusion paragraphs (aside from the grammar note on blog 2)
Optional nits (low priority)
Blog 1 (ozone-s3-compatibility):
- "one-shotted" → "got most of it right on the first try"
- "overclaim" → "overstate"
- "backend-ish" → "the automation layer"
- "laggy" → "sluggish" (or keep if informal tone is intentional)
- Duplicate PMC-promotion mention in TL;DR and Insight #2 — consider keeping only one
Blog 2 (ozone-s3-conditional-request):
- "For more advanced usage, let's look at…" → "To see this in practice, let's look at…"
- Transition: "how Ozone keeps … fast" → "how Ozone implements … efficiently"
PR metadata:
- Title/description: "Add S3-compat and S3 conditional request blog" → "Add blogs on S3 compatibility and S3 conditional requests"
|
|
||
| Object storage has quietly crossed a line. It is no longer just where systems park their bytes. It has become the place where they coordinate. Metadata catalogs, write-ahead logs, leader election, job queues, model caches: all of these need a single point of truth about “who wrote last,” and increasingly they want to ask that question of the storage layer itself. | ||
|
|
||
| By bringing native S3 conditional requests to Apache Ozone, and doing it without a single extra RPC on the happy path. We turn Ozone into a first-class substrate for optimistic concurrency control. Applications can compare-and-swap directly against the objects they already store, and retire the external lock services, catalog databases, and consensus clusters they once needed just to avoid a lost update. |
There was a problem hiding this comment.
Grammar: This is a sentence fragment — the participial phrase ends with a period, then a new sentence starts with "We turn…"
Suggested: "By bringing native S3 conditional requests to Apache Ozone without adding an extra RPC on the happy path, we turn Ozone into a first-class substrate for optimistic concurrency control."
|
|
||
| ## Technical details | ||
|
|
||
| To keep the performance overhead minimal, thanks to [Ivan](https://github.com/ivandika3)’s suggestion, we coalesce the “conditional flag” with the normal client-to-server RPC message, so no additional RPC round trip is introduced. This characteristic is a great match for the optimistic path of conditional requests. |
There was a problem hiding this comment.
Grammar: "Thanks to Ivan's suggestion" is dangling mid-sentence.
Suggested: "To keep performance overhead minimal—thanks to Ivan's suggestion—we coalesce the "conditional flag" with the normal client-to-server RPC message, so no additional RPC round trip is introduced."
Also: "This characteristic is a great match for the optimistic path" → "This fits well with the optimistic concurrency path."
|
|
||
| ## Insight | ||
|
|
||
| 1. The main reason this really got adopted by other community members is that I posted it at the first time after I thought it could really work: [\[DISCUSS\] Nightly Ozone S3 compatibility report](https://lists.apache.org/thread/2td4jt8r26pwph5lwq3ncbnv97n27d5w). It was not perfect yet, but it was already useful enough for people to try. I think posting early was important. |
There was a problem hiding this comment.
Chinglish: English doesn't use "at the first time."
Suggested: "I posted it the first time I thought it was ready to share" or "I shared it as soon as it was useful enough for others to try."
| Sixth, use archived runs when you need history. Old runs are still there, but their details are loaded only when opened. This is helpful when you want to compare a failure today with an older run, or when a PR says “this test used to fail before the fix.” | ||
|  | ||
|
|
||
| Finally, the Parquet file inspector is there for people who want to inspect the published dataset itself. This is mostly for debugging the dashboard and data model, but it is surprisingly useful when you want to understand what files were generated, how many rows they contain, and whether the published data looks sane. Also thanks Xiangpeng for building the [Parquet Viewer](https://github.com/XiangpengHao/parquet-viewer), which let us inspect the parquet file content directly on the site. |
There was a problem hiding this comment.
Grammar: Missing preposition.
Suggested: "I also want to thank Xiangpeng for building the Parquet Viewer" or "Thanks also to Xiangpeng for building…"
|
|
||
| TL;DR: | ||
|
|
||
| - This really helped me get promoted as a PMC member of the Apache Ozone project. |
There was a problem hiding this comment.
Chinglish: "really" here reads like 真的. Also duplicated in Insight #2 — consider keeping only one PMC-promotion mention.
Suggested: "This helped me earn PMC membership" or "This played a role in my promotion to PMC."
| Apache Ozone will support conditional `PutObject`, `GetObject`, `HeadObject`, `CopyObject`, and `CompleteMultipartUpload` in the upcoming [2.2 release](https://github.com/apache/ozone/releases/tag/ozone-2.2.0-RC0) (RC0 is currently under a [vote](https://lists.apache.org/thread/gz567ljydh4ht63h6c9pjfclrbrrr9z7)), and will add conditional `DeleteObject` and `DeleteObjects` support in 2.3. | ||
| ::: | ||
|
|
||
| More database systems are moving their underlying storage to S3 in shared-everything architectures to reduce cost, dependencies, and operational complexity. In the Hadoop 🐘 era, we typically used ZooKeeper and HDFS as the control plane and data plane. Modern systems are moving the control plane to self-managed consensus groups or RDBMS-backed catalogs, while moving the data plane onto AWS S3 or S3-compatible storage. |
There was a problem hiding this comment.
Suggested: "An increasing number of database systems are moving storage to S3" (instead of "More database systems are moving their underlying storage").
| Source: [Amazon S3 conditional requests](https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html) | ||
| ::: | ||
|
|
||
| Conditional requests allow atomic CAS operations on target objects: clients can coordinate through S3 objects instead of asking external arbiters. Using S3 conditional requests is like moving part of the coordination logic into storage. |
There was a problem hiding this comment.
Suggested: "relying on external arbiters" (instead of "asking external arbiters").
|
|
||
| ## Application use cases | ||
|
|
||
| So who exactly can use this? |
There was a problem hiding this comment.
Suggested: "Who is this for?" or "Which workloads benefit?" (instead of "So who exactly can use this?").
|
|
||
| The leader should periodically update the lock file it acquired to signal liveness. Other nodes can poll the lock and check whether the lock was released or expired by looking at `Last-Modified`, which S3 exposes as standard object metadata. | ||
|
|
||
| ### WAL write/get with OSWALD |
There was a problem hiding this comment.
Suggested: ### WAL Writes and Reads with OSWALD (instead of "write/get").
|
|
||
| #### CompleteMultipartUpload | ||
|
|
||
| `CompleteMultipartUpload` compares the caller’s expected ETag or create-if-absent condition with the current database record on the server side. |
There was a problem hiding this comment.
Suggested: "current metadata record" or "committed key state" (instead of "database record on the server side"). Same note applies to the DeleteObject section (~line 354).
|
Optional nit (PR metadata):
|
jojochuang
left a comment
There was a problem hiding this comment.
Adding inline comments for the low-priority nits from the earlier review.
| I want to create a repo that runs [https://github.com/ceph/s3-tests](https://github.com/ceph/s3-tests) and [https://github.com/minio/mint](https://github.com/minio/mint) on GitHub Action and generate the compatibility report page on GitHub Pages nightly. Make the page pretty. My desired steps that run in the GitHub Action are: clone the Ozone repo, pull latest master change, compile, start running cluster, run Mint and s3-tests to get result, compile result to be the page. We can show the compatibility rate of each feature for each test (`s3-tests`, `mint`) daily change as a chart at the page top, followed by the report page, then also include the old result expansion button to allow users to check a specific date’s running result. BTW I have the local clone of Ozone at `~/Documents/oss/apache/ozone`, you can look into it directly without searching the codebase on the website. | ||
| ::: | ||
|
|
||
| Then it almost one-shotted this. Actually I still made some follow-ups on the result, like “attach `s3-tests` and `mint` as submodule” and “use `act` to test the GitHub Action really works locally within Docker”, but those were relatively minor compared with the first scaffold. |
There was a problem hiding this comment.
Optional nit: "one-shotted" is informal/slang.
Suggested: "got most of it right on the first try" or "nailed the scaffold in one pass."
| 7. Build the static Pages output, including the historical data. | ||
| 8. Publish to `gh-pages` for scheduled runs. | ||
|
|
||
| The frontend is Vue 3 \+ Vite. The backend-ish part is just scripts and GitHub Actions. The data processing is mostly Python. For the newer version, the published report data is JSON. |
There was a problem hiding this comment.
Optional nit: "backend-ish" reads informal.
Suggested: "the automation layer" or "the non-frontend parts."
|
|
||
| ### Optimization | ||
|
|
||
| After a few runs, I started to notice that the dashboard was becoming laggy. After some inspection, I found a few reasons. |
There was a problem hiding this comment.
Optional nit: "laggy" is fine for informal tone; for a more formal ASF blog voice, consider "sluggish" or "slow."
| Ozone has already improved since the dashboard was released. | ||
|  | ||
|
|
||
| I don’t want to overclaim that every improvement below was caused only by this dashboard, but I do think the dashboard changed the workflow. It gives us concrete failing cases, links that can be pasted into PRs, and an easy way to check whether the gap is still there after a patch. |
There was a problem hiding this comment.
Optional nit: "overclaim" is non-standard.
Suggested: "overstate" or "attribute every improvement solely to this dashboard."
There was a problem hiding this comment.
or "I don’t want to take credit for every improvement ..."
| ## Insight | ||
|
|
||
| 1. The main reason this really got adopted by other community members is that I posted it at the first time after I thought it could really work: [\[DISCUSS\] Nightly Ozone S3 compatibility report](https://lists.apache.org/thread/2td4jt8r26pwph5lwq3ncbnv97n27d5w). It was not perfect yet, but it was already useful enough for people to try. I think posting early was important. | ||
| 2. This also really helped me get promoted as a PMC member of the Apache Ozone project. Not because the dashboard itself is magical, but because it made a long-standing problem visible and gave the community a practical tool to keep improving it. |
There was a problem hiding this comment.
Optional nit: This repeats the PMC-promotion point from the TL;DR (line 16). Consider keeping only one mention unless both are intentional.
| - Use `If-Match: *` to delete only if the object exists. | ||
| - Use case: preventing a client from deleting an object that another writer has already replaced. | ||
|
|
||
| For more advanced usage, let’s look at how modern systems use these APIs. |
There was a problem hiding this comment.
Optional nit:
Suggested: "To see this in practice, let's look at how modern systems use these APIs."
|
|
||
| *Figure 7. OSWALD uses manifest, snapshot, and chunk objects to build a WAL on object storage. Source: [OSWALD](https://github.com/nvartolomei/oswald).* | ||
|
|
||
| Now let’s look at how Ozone keeps S3 conditional requests—the CAS primitive—fast. |
There was a problem hiding this comment.
Optional nit:
Suggested: "Now let's look at how Ozone implements S3 conditional requests efficiently." (instead of "keeps … fast").
What changes were proposed in this pull request?
Add blogs on S3 compatibility and S3 conditional requests
What is the link to the Apache Jira?
https://issues.apache.org/jira/browse/HDDS-15801
How was this patch tested?