Skip to content

HDDS-15801. Add blogs on S3 compatibility and S3 conditional requests#488

Open
peterxcli wants to merge 4 commits into
masterfrom
feat/add-blog
Open

HDDS-15801. Add blogs on S3 compatibility and S3 conditional requests#488
peterxcli wants to merge 4 commits into
masterfrom
feat/add-blog

Conversation

@peterxcli

@peterxcli peterxcli commented Jul 9, 2026

Copy link
Copy Markdown
Member

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?

image image image

@peterxcli peterxcli changed the title Add S3-compat and S3 conditional request blog HDDS-15801. Add S3-compat and S3 conditional request blog Jul 9, 2026
@peterxcli

Copy link
Copy Markdown
Member Author

cc @jojochuang

@jojochuang jojochuang left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.”
![archived-runs](archived-runs.png)

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested: "relying on external arbiters" (instead of "asking external arbiters").


## Application use cases

So who exactly can use this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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).

@jojochuang

Copy link
Copy Markdown
Contributor

Optional nit (PR metadata):

  • Title: HDDS-15801. Add S3-compat and S3 conditional request blogHDDS-15801. Add blogs on S3 compatibility and S3 conditional requests
  • Description: Add S3-compat and S3 conditional request blogAdd blogs on S3 compatibility and S3 conditional requests

@jojochuang jojochuang left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.
![s3-tests-compatibility-rate](s3-tests-compatibility-rate.png)

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional nit: "overclaim" is non-standard.

Suggested: "overstate" or "attribute every improvement solely to this dashboard."

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional nit:

Suggested: "Now let's look at how Ozone implements S3 conditional requests efficiently." (instead of "keeps … fast").

@peterxcli peterxcli changed the title HDDS-15801. Add S3-compat and S3 conditional request blog HDDS-15801. Add blogs on S3 compatibility and S3 conditional requests Jul 15, 2026
@peterxcli peterxcli requested a review from jojochuang July 15, 2026 04:41
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.

2 participants