Curio v1.27.4
Curio v1.27.4
✨ Overview
Curio v1.27.4 brings the PDP proving stack out of the parallel pdpv0 branch and into the main release train. From this release on, every Curio node ships with PDP support by default, with a long tail of stabilisation fixes for retrieval, partial content, and the proof pipeline. Storage Providers running PDP no longer need a separate build.
Beyond PDP, this release ships meaningful Market 2.0 (mk20) hardening.
Building from source now requires Go 1.26 or newer.
Storage Providers are strongly encouraged to upgrade, particularly those running HTTPS retrieval, those on the pdpv0 branch (now folded into main), or anyone who hit the parked_pieces uniqueness or config-layer ordering issues from v1.27.3.
| Field | Value |
|---|---|
| Version | v1.27.4 |
| Type | Stable |
| Compare | v1.27.3...v1.27.4 (33 commits) |
| Build | Go 1.26+ required to build from source |
| Schema | parked_pieces uniqueness migration applied automatically |
⭐ Highlights
🛰️ PDP V0 lands in main
The PDP proving stack moves out of the parallel pdpv0 branch and into the primary release train. From this release on, every Curio node ships with PDP support. No separate build, no separate config layer.
#1106 Merge pdpv0 into main
#1127 Post-migration fixes
#1129 Partial-content serving for pieces
#1150 frisbii update + fast-path Has() for head requests
#1112 Urgent: tx in taskFunc callbacks unblocks pdpv0 upgrades
🛒 Market 2.0 (mk20) hardening
Backpressure and client filter on inbound deals, DDO start_duration clamps, contract-as-client authentication path, and a follow-up on the mk12 indexing regression that v1.27.3 surfaced.
#1087 Mk20 updates
#1130 Fix mk12 indexing
#1169 marketAddress client toggle and improvements
📡 IPNI ad chain race condition fixed
Concurrent IPNI ad publishers could read the same ipni_head, build different ads against the same predecessor, and last-writer-wins the head update. The visible result was a disconnected provider head chain. Fixed with an optimistic compare-and-swap on ipni_head so an ad is only inserted when the head still matches the predecessor it was built and signed against.
#1149 Fix IPNI Ad creation race condition
🎯 Unseal-by-piece
Accepts a list of PieceCIDs and resolves the minimal covering set of sectors to unseal. Hit-rate-sorted best-effort (true bin-packing is NP-hard), biased toward sectors already marked to keep an unsealed copy. Logs which sectors were already selected and which are now selected, plus the relationships.
#1100 unseal-by-piece
🛠️ Upgrade prep for Storage Providers
Read this before upgrading.
| Concern | What to know |
|---|---|
| HTTPS retrieval | Upgrade. The goroutine + fd leak fix in #1141 is real. |
parked_pieces |
Migration tightens an existing uniqueness constraint (#1163). Duplicate active rows from the previous behavior are logged rather than silently consolidated. Worth a glance before upgrade. |
ParkPieceMinFreeStoragePercent |
Default lowered from 20 to 5 (#1142). Storage Providers who relied on the previous default for headroom should set the value explicitly. |
| PDP V0 branch users | pdpv0 is now merged into main. Existing pdpv0 builds will pick up main for their next build. |
| Building from source | Go 1.26+ is now required (#1155). The Debian apt packages still ship a self-contained binary, no Go install needed. |
| FFI | Updated (#1177). Source builds will pull the new version automatically; no operator action needed. |
🐛 Bug fixes
| PR | Title |
|---|---|
#1141 |
Goroutine and fd leak in Reader/ReaderPiece/cachedreader |
#1149 |
IPNI ad creation race condition |
#1147 |
Snap edge case: CommR == CommK on all-zero data |
#1163 |
parked_pieces entries truly unique |
#1130 |
mk12 indexing |
#1127 |
PDPv0 issues after migration |
#1129 |
Partial content serving for pieces |
#1112 |
Urgent: use tx in taskFunc callbacks |
#1113 |
IPNI: urlhelper.FromURLWithPort for correct multiaddr generation |
#1116 |
Include CommR in proofshare client request idempotency key |
#1119 |
Cap CanAccept slice to len(ids) (out-of-bounds panic) |
#1117 |
Preserve config layer ordering during dedup |
#1161 |
0315sql multi-query rewrite (hours of delay on large SPs) |
#1172 |
Filter SQL bug |
#1169 |
marketAddress client toggle and improvements |
🔧 Improvements
| PR | What it adds |
|---|---|
#1138 |
Respect PostedTime in scheduling |
#1100 |
Unseal-by-piece |
#1098 |
Singleton task run-now in WebUI |
#1164 |
TaskID clickable in Recent Failures |
#1080 |
Snark consumer integration and docs |
#1167 |
Replace local savecache with upstream commp-hash-hash |
#1142 |
ParkPieceMinFreeStoragePercent default lowered to 5 |
📦 Dependencies
| PR | Update |
|---|---|
#1177 |
FFI |
#1170 |
ipld-prime |
#1155 |
Go 1.26 |
#1104 |
google.golang.org/grpc 1.77.0 → 1.79.3 |
#1107 |
github.com/buger/jsonparser 1.1.1 → 1.1.2 |
#1056 |
Bulk dependency updates for security advisories |
🏗️ Build & CI (click to expand)
| PR | Change |
|---|---|
#1159 |
Switch to Postgres template itests |
#1162 |
CI speed test, runner type retuned (AMD c5a 2xlarge) |
#1160 |
AMI test workflow |
#1166 |
PDPv0: switch to AWS CI (also bumped Go 1.25) |
#1140 |
End-to-end deal tests |
#1115 |
Better DB-in-transaction test |
#1144 |
Cached reader tests |
#1168 |
Downgrade test friendly with template DBs |
#1143 |
Coverage report on forks |
#1171 |
Fix apt cache for CI tests |
#1158 |
Trap command + topdir extraction |
#1135 |
Prevent "add to FOC project" workflow failure for existing items |
⏪ Reverts
| PR | Note |
|---|---|
#1123 |
Revert "itests should try pg / scylla" (#1094). The replacement landed as Postgres template itests in #1159. |
🙏 Contributors
@LexLuthr · @magik6k · @snadrus · @beck-8 · @rvagg · @TippyFlitsUK · @galargh · @rjan90 · @lordshashank · @BigLep · @Reiers
Thanks to everyone who built, reviewed, and tested this release.
📜 Full Changelog: v1.27.3...v1.27.4
🐛 Issues: https://github.com/filecoin-project/curio/issues
💬 Help: Filecoin Slack #fil-curio-help