Changelog
All notable changes to pgEdge ColdFront will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
coldfront.adopt_iceberg_table()gives a table that already exists in the Iceberg catalog a PostgreSQL wrapper view and a registry row, so it reads like one ColdFront created. The schema comes from the catalog, andp_typesrestores a type Iceberg cannot record. Adoption is read-only unlessp_writable => truearms the write path.coldfront.release_iceberg_table()hands an adopted table back: the wrapper view and the registry row go, and the Iceberg table keeps every row.
Changed
coldfront.tiered_viewscarries anis_writablecolumn and a unique constraint oniceberg_table. Every existing registration is writable, and one relation is registered per Iceberg table.coldfront.drop_iceberg_table()refuses a relation adopted read-only, and builds its catalog DDL from the stored Iceberg reference rather than from the PostgreSQL schema and table names.- The mesh bakery no longer needs the
dblinkextension. Claims, acks, releases and orphan reaping run over a libpq loopback connection that the extension opens fromcoldfront.dblink_self.
Fixed
- After one cold write on a mesh, an app role could run any SQL as the
loopback connection's user through the
coldfront_selfdblink connection the claim left open in its session, and by settingcoldfront.dblink_selfit could make the loopback run functions of its own as that user. An app role can no longer reach the loopback or set its connection string, and the loopback resolves names inpg_catalogonly. - A cold write on a mesh that failed or was cancelled during its claim left an advisory lock held for the rest of the session, and the node's other writers on that table waited on it. Every lock the claim takes now ends with a transaction.
- A mesh session whose loopback connection had died failed every later cold write. The loopback now reconnects.
- A transaction that made two cold writes to the same table on a mesh hung on its own first claim. A transaction now holds one claim per table.
- A writer terminated in the middle of its claim could leave a claim that the node's next writer on that table waited behind indefinitely.
- On a server that has
output_plugin_libraries(PostgreSQL 16.15, 17.11 and 18.6 in pgEdge's builds), no Spock subscription could create its replication slot, because the setting's default leaves outspock_output. The Docker image addsspock_outputto it on mesh nodes, and the per-node configuration in the usage guide lists it. - The compactor claimed a table made by
coldfront.create_iceberg_table()under a different spelling of its Iceberg reference than the one cold writes to it claimed, so compaction and snapshot expiry did not wait for those writes. Every registration now stores the reference with each part quoted, which is how the archiver and the compactor spell it. - The compactor read a table before taking its bakery claim. A run that had
to wait for a cold write then had its commit refused and exited with an
error, and an orphan-file pass with
--orphan-age 0scould delete the files that write had just committed. Each step now reads the table under its claim.
[1.0.0-beta2] - 2026-08-08
Added
coldfront.drop_iceberg_table()drops a decoupled or tiered table, with purge or keep-files for the stored objects.- Vended (minted) object-store credentials, so cold access can use short-lived credentials issued by Lakekeeper instead of static keys.
- Cross-tier row relocation: an UPDATE that moves a row's partition key across the cutoff now moves the row between tiers.
- Multi-arch base images: linux/amd64 and linux/arm64.
- An interactive walkthrough with four demos, runnable in Codespaces.
Changed
- DuckDB 1.5.4 via the merged pg_duckdb PR #1025.
- Registration refuses unlogged relations, names that the partition naming scheme cannot represent, and names differing only by case.
Fixed
- Cold-tier writes are refused on a standby in every path that reaches them.
- Exotic partition bounds parse correctly, DEFAULT partitions are refused, and timestamp-without-time-zone bounds are handled.
oidcolumns are rejected as unsupported rather than failing later.- Same-node cold writers serialise through a node-local advisory lock, and bakery acknowledgements match on the spock node name.
- Permanent cutover errors stop immediately instead of being retried.
[1.0.0-beta1] - 2026-06-18
First public beta of pgEdge ColdFront. Pre-release software; not for production use.
Added
- Tiered mode keeps recent data in native PostgreSQL partitions and archives older data to Apache Iceberg on a watermark, presented to the application as a single unified view.
- Decoupled mode stores a table entirely in Iceberg from the first row, with PostgreSQL holding a thin wrapper view and the coldfront extension handling every data-modifying statement on that view.
- Horizontal scale-out for decoupled mode across multiple PostgreSQL nodes sharing one Lakekeeper catalog and one object store, serialised by the bakery protocol; the protocol implements Lamport mutual exclusion with the Ricart-Agrawala optimisation and its safety is verified in TLA+.
- The coldfront PostgreSQL extension at version 1.0.
- Archiver and partitioner binaries for the tiered workflow, plus a separate compactor for Iceberg table maintenance.
- Support for PostgreSQL 16, 17, and 18 on stock upstream builds, with Iceberg reads and writes through pg_duckdb.
- Support for any S3-compatible object store, Azure Blob Storage, and Google Cloud Storage.