Skip to content

Build Not yet confirmed elsewhere1 publisher 2 min read Published

RustFS puts an Iceberg REST catalog on the same port as its S3 API

RustFS embeds an Apache-2.0 Iceberg REST catalog in its object store and serves it on the S3 port, according to a dev.to walkthrough. Teams can drop a separate metastore, but catalog metadata then shares a failure domain with the data.

The Engineer · Build desk

How we use AI Send a correction

Illustration accompanying RustFS puts an Iceberg REST catalog on the same port as its S3 API
Generated illustration
Catalog metadata has no separate failure domain The story has no quantities to chart, so this maps how RustFS's built-in Iceberg REST catalog affects a lakehouse, per a dev.to write-up.

S3 and the Iceberg REST catalog served on one port; catalog metadata has no separate failure domain; the transaction boundary is one table; stale concurrent writers are rejected, duplicates absorbed; Spark, PyIceberg and DuckDB are documented as connecting without a vendor plugin.

Catalog metadata has no separate failure domain
WhoHowKindClaim
Self-hosted lakehousesOne process on one port serves S3 and the Iceberg REST catalog, no separate Hive Metastore or Gluecapability1
Catalog metadataNo separate metadata failure domain; the RustFS backup story is also the catalog backup storyexposure6
Multi-table transactionsTransaction boundary is one table; cross-table consistency needs app logic or eventual consistencyconstraint9
Concurrent writersCompare-and-swap version checks reject stale writers; idempotency keys absorb duplicatescapability8
Spark, PyIceberg and DuckDBDocumented as connecting to the RustFS catalog without a vendor plugincapability4

What happened

  • Apache Spark, PyIceberg and DuckDB are documented as connecting with no vendor plugin, and enabling a table bucket does not require registering existing Parquet files first.
  • Table creation and snapshot commits go through the REST catalog, while the compute engine writes Parquet files straight into the bucket over the S3 API with no intermediate layer.
  • Enabling the catalog takes a dedicated bucket and one signed PUT with an empty body to /iceberg/v1/buckets/my-bucket.
  • Commits get two protections. A compare-and-swap check on the table version turns away a concurrent writer working from a stale version, and idempotency keys make a duplicate submission harmless.

Why it matters

  • exposure A damaged or lost bucket now takes the catalog with it, because backup and durability for the data are the only backup and durability the catalog has.
  • constraint Atomicity stops at one table. A schema change on one table plus a data load into another falls to application logic or eventual consistency.
  • decision The only run described is one author's single-node test on RustFS 1.0.1, so a team replacing a live catalog has to supply its own multi-node and write-contention testing.

Two guards sit between the S3 API and the catalog state. Pointers live under a reserved internal prefix, so an ordinary S3 request cannot create, overwrite or delete catalog metadata. The write-up says a stray aws s3 cp will not corrupt table state [7].

That protects against careless clients. It does nothing for the bucket itself. The Iceberg metadata JSON and manifests are written to the same bucket as the data [5], and the author states the consequence: there is no separate metadata failure domain [6]. With Hive Metastore, Glue, Nessie or Polaris beside the store [3], the catalog has its own state to lose and its own recovery. Here one backup covers both, and no independent metastore exists to fall back on [6]. In our view that is a fair price for one fewer service to run [1], provided the store's own durability is already trusted.

Whether an existing job moves over unchanged depends on how many tables it commits. Single-table jobs fit the boundary [9]. A job that loads a fact table and then updates its dimension table makes two commits, and each is atomic only by itself [9].

Setup has one sharp edge. Both the enable call and the status check return HTTP 200 with enabled: true and catalog-type: iceberg-rest [11]. The enable call signs an empty body, so it carries the well-known empty-body SHA-256 in the x-amz-content-sha256 header. Reuse that header on the namespace POST, which carries JSON, and the server rejects it with Sha256Mismatch and HTTP 400. Body-carrying requests need UNSIGNED-PAYLOAD or the real body hash [13]. Signing bugs tend to announce themselves this way.

With the header corrected, namespace creation returned {"namespace":["my-namespace"],"properties":{}} [15].

What to watch

  • Whether RustFS or independent users publish multi-node results for the catalog, including commit behavior when several writers target one table.
  • Whether RustFS adds multi-table commits, which would remove the per-table limit on fact-and-dimension jobs.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence50
Adoption
Insufficient
Hype gap−10
Incentives
Insufficient
Confidence55
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    RustFS S3 Tables is an Apache Iceberg REST Catalog built into the RustFS object storage kernel, so one process on one port serves both standard S3 and the Iceberg REST Catalog protocol, removing the separate Hive Metastore or Glue catalog a self-hosted lakehouse normally needs.

    Reported Supported Source: dev.to write-up on RustFS S3 TablesView cited source
  2. [2]

    RustFS S3 Tables is Apache 2.0 with no separate commercial edition.

    Reported Supported Source: dev.to write-up on RustFS S3 TablesView cited source
  3. [3]

    A typical self-hosted lakehouse pairs the object store with a catalog such as Hive Metastore, AWS Glue, Nessie, or Polaris.

    Reported Supported Source: dev.to write-up on RustFS S3 TablesView cited source

Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.

Add to ChatGPTAdd to Claude

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · October 12, 2026

    RustFS S3 Tables: A Built-In Iceberg REST Catalog in an Apache-2.0 Object Store

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Loading related stories