Skip to content

Build1 publisher3 min readPublished

A Bootstrap stylesheet in the docs folder sank Iceberg's first 1.12.0 candidate

Reviewers logged 10,991 passing tests on Iceberg's first 1.12.0 candidate before rejecting it over two vendored web files. The change most likely to break a downstream build is a removed partition-statistics helper.

The Engineer · Build desk

What happened

  • Yuya Ebihara reported that Trino's CI passed against the staged Iceberg artifacts, covering HMS, Glue, JDBC on PostgreSQL, the Polaris, Unity, S3 Tables and Tabular REST catalogs, Nessie and Snowflake.
  • The Iceberg community agreed to keep a change that makes type strings print resolved defaults and to record it under "Behavior Change" in the release notes, closing the prepared revert.
  • The RC1 vote opened on September 22 and drew a binding +1 from Renjie Liu after checksum, signature, license and test runs.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • cost Six failed candidates in one week means six repeats of a verification round that volunteer reviewers run by hand, triggered by files that no build script treats as a dependency.
  • constraint A project whose build forbids the Hadoop-based Parquet client cannot reach 1.12.0's partition statistics path at all, so a dependency rule sets its upgrade decision.
  • decision Anyone deriving identifiers from type strings, such as cached UDF function definition IDs, has to regenerate them or accept mismatches on upgrade; stored table metadata is unaffected.
  • precedent License and NOTICE auditing is now the step most likely to sink a candidate in these release lines. Adding a vendored asset to a docs folder invites a vote failure months later.

The problem started with a vendored stylesheet. Xuanwo found a Bootstrap file in Iceberg's docs site assets that kept its copyright line, but the package shipped without the MIT permission notice and the root LICENSE did not account for it [4]. Gianluca Graziadei found a Lottie JavaScript file in the same folder with the same gap [5]. Neither called it a blocker, because both files had shipped since 1.9.0 [6]. Neelesh Salian filed an issue, the fix merged, and he cut a new candidate [7]. Across the three release lines in this week's report, six candidates failed, and every rejection was attributed to license or notice metadata [1]. The two Iceberg files had ridden along in 1.9.0, 1.10.0 and 1.11.0 first [2]. The round that caught them was, in the newsletter's words, one of the most thorough verification rounds the project has seen in a while [26]. Anoop Johnson rebuilt the source tarball from the tag and confirmed it matched apart from two generated version files [11]. Xin Huang compared all 7,083 files common to the tarball and the commit and found them identical [12]. Manu Zhang ran 10,991 tests across the api, core and parquet suites with zero failures [10]. On RC1, Xuanwo reported 10,470 passing tests across the common, API, core and data modules, and Szehon Ho reported 8,400 core tests with a Spark 4.2 test built from verified source [20]. The 521-test difference between Zhang's number and Xuanwo's is a different module set [3]. For Yuya Ebihara's Trino result to say anything about your deployment, your catalog has to be one his CI exercises [8]. The item in the thread that can stop an upgrade is older than the release. Ebihara repeated a caveat he first raised months ago: 1.12.0 removes the old helper logic for reading and writing partition statistics, and the new logic depends on the Hadoop-based Parquet client, which some downstream projects forbid [9]. Steven Wu used the vote thread to flag a change that will surface as a failed string comparison [13]. Call toString() on a plain geometry type in 1.12.0 and you get geometry(OGC:CRS84); geography prints as geography(OGC:CRS84, spherical) [13]. Xin Huang wrote the original PR to persist resolved CRS and algorithm values in metadata even when they match the defaults, said the print change was a side effect he had not recognized as a behavior change, and had a revert ready [14]. Szehon Ho argued for keeping it, because two equal geography types printed differently depending on whether a user set the default explicitly, and the new form matches the canonical serialization in Appendix C of the spec [15]. Huaxin Gao added the case from her UDF work: function definition IDs are built from parameter type strings, so two equal types that print differently look like two different overloads [16]. Old metadata still loads, since geometry and geometry(OGC:CRS84) parse to the same type [17]. Two smaller items set the edges of the release. Alex Reid asked for a Kafka Connect fix that stops the connector from committing already committed files during certain rebalances, and because the PR had already merged it ships in 1.12 [21]. Reid also asked about the REST client side of "referenced-by", a spec field added last year, and Salian deferred it to 1.13.0 because it does not block the release [22]. The weekly ties all of this to one question, what a server or reader should do when it cannot deliver what the client asked for, and reports that Polaris, Iceberg and Parquet each landed on failing loudly and writing the behavior down [23]. The argument documented in full here is the geometry printing decision. It fixes a canonical output form.

What to watch

  • Whether the 1.13.0 milestone picks up the REST client work for "referenced-by" that Salian deferred out of 1.12.0.
  • Whether the partition statistics path drops its Hadoop-based Parquet client dependency; that decides whether downstreams with a ban on it can take the release.
  • Whether Polaris implements the REST API that Apache Ossie proposed ahead of Ossie's first source release.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories