Arc v26.09.2
Arc is a high-performance time-series database built on DuckDB, optimized for IoT, observability, and analytics workloads.
What's Changed
- fix(iceberg): publish version hint after metadata copy by @bferanmi806-sketch in #663
- fix(iceberg): validate reconcile interval at config load by @bferanmi806-sketch in #664
- fix(iceberg): skip unreadable databases during reconciliation by @bferanmi806-sketch in #665
- fix(sqlite): harden dedicated WAL and SHM permissions by @bferanmi806-sketch in #666
- perf(iceberg): cache empty measurement negatives by @bferanmi806-sketch in #667
- fix(storage): use errors.As for azure response error inspection (#319) by @Thundercloud12 in #670
- fix(backup): make live SQLite backup and restore safe by @atirna in #678
- fix(compaction): avoid retaining evicted job history entries (#315) by @bferanmi806-sketch in #679
- fix: bound the local directory cache by @mah1104ahm in #674
- test(cluster): deflake multi-writer election test on starved runners by @xe-nvdk in #680
- fix(tiering): prune partitions per tier in multi-tier queries by @xe-nvdk in #681
- fix(query): pin DuckDB session TimeZone to UTC by @xe-nvdk in #684
- test(cluster): wait for config replication before stopping the leader by @xe-nvdk in #685
- fix(tiering): register day-level daily-compacted files for migration by @xe-nvdk in #686
- fix(tiering): register spoke-namespace files; harden tier-drop rule by @xe-nvdk in #688
- feat(tiering): cold migration of spoke-namespace files, receipt-aware by @xe-nvdk in #691
- fix(backup): report restart_required for config-only restores by @atirna in #689
- feat(backup): stage metadata restores; apply at boot by @xe-nvdk in #692
- fix(iceberg,backup): complete #639 items 2, 5, 7, 8 by @xe-nvdk in #693
- feat(iceberg): clear catalog artifacts on database drop by @xe-nvdk in #694
- fix(storage): use calendar days for S3 ranges by @copacabanaservice01 in #690
- fix(storage): anchor S3 range paths to UTC calendar days by @xe-nvdk in #695
- docs: add pre-26.06.1 token upgrade runbook by @mah1104ahm in #672
- fix: await MQTT unsubscribe tokens during shutdown by @mah1104ahm in #673
- fix: prune expired tier cache entries by @mah1104ahm in #675
- fix(wal): chunk oversized payloads so wide-row ingest stays durable (#677) by @atirna in #696
- feat(cla): require a signed CLA on every pull request by @xe-nvdk in #699
- fix(cluster): add periodic file replication reconciliation (#393) by @bferanmi806-sketch in #697
- fix(helm): protect WAL recovery with a startup probe by @atirna in #700
- test(query): cover Arrow IPC stream failures by @be-student in #706
- feat(telemetry): report arcli installations seen per instance by @xe-nvdk in #708
- docs(readme): add arcli to the ecosystem by @xe-nvdk in #709
- chore(deps): bump google.golang.org/grpc from 1.83.1 to 1.83.2 in the go_modules group across 1 directory by @dependabot[bot] in #710
- docs(release-notes): record the gRPC 1.83.2 bump in 26.09.2 by @xe-nvdk in #711
- fix(auth): enforce token expiry on cache hits by @xe-nvdk in #712
- fix(query): apply queryTimeout to queryMeasurement endpoint by @MrBeldum in #701
- fix(cluster): authenticate every coordinator handshake field and response by @xe-nvdk in #713
- fix(query): enforce query governance on every user-SQL endpoint by @xe-nvdk in #705
- fix(tiering): push measurement/time-range filters into SQL WHERE by @pujitha24 in #707
- security(cluster): bind SupportsBinaryEntries into the replicate-sync HMAC by @pujitha24 in #715
- fix(query): release Arrow IPC resources when the stream panics by @xe-nvdk in #718
- docs(release-notes): disclose the arcli telemetry fields (#708) by @xe-nvdk in #719
- fix(api): recover from panics in every response stream writer by @xe-nvdk in #720
- fix(query): mark truncated Arrow IPC streams so clients cannot read them as complete by @xe-nvdk in #722
- fix(query): mark truncated JSON responses instead of reporting success by @xe-nvdk in #725
- Mark results an Enterprise governance row cap truncated (#724) by @xe-nvdk in #730
- fix(query): record a governance row cap in the query registry by @xe-nvdk in #732
- Publish Arrow IPC trailers from the connection goroutine (#729) by @xe-nvdk in #734
- fix(query): register the measurement endpoint with the query registry by @xe-nvdk in #735
- Free Arrow IPC resources from one defer, not two call sites (#733) by @xe-nvdk in #736
- security(query): harden the read-SQL validator (GHSA-w6w2-x8xv-q8x2) by @xe-nvdk in #738
- Reject edge-sync spoke IDs containing a parent-directory sequence (#737) by @xe-nvdk in #742
- Reject malformed local storage paths instead of rewriting them (#741) by @xe-nvdk in #745
- Enforce one storage key contract across local, S3 and Azure (#743) by @xe-nvdk in #748
- Reserve the write-staging suffix and stop manifests overflowing (#744) by @xe-nvdk in #753
- Quarantine permanently unusable storage keys instead of retrying them (#747) by @xe-nvdk in #755
- fix(storage): route the read path through the key contract (#746) by @xe-nvdk in #754
- docs(sandbox): record why per-tenant allowed_directories scoping is not buildable (#641) by @xe-nvdk in #763
- fix(backup): report data files no listing returns (#756) by @xe-nvdk in #765
- security(query): add PREPARE and EXECUTE to dangerousSQLPattern (#739) by @Thundercloud12 in #767
- fix(tiering): quarantine a permanently unusable storage key instead of retrying it every cycle (#758) by @xe-nvdk in #773
- fix(mqtt): prevent TOCTOU race in RestartSubscription with nil-placeholder (#301) by @Thundercloud12 in #766
- fix(backup): a restore no longer reports success while dropping files (#762) by @xe-nvdk in #778
- fix(ingest): log numeric host coercion at debug level by @lecodev-26 in #769
- refactor(sql): centralize DuckDB path quoting by @efegokdemir in #780
- fix(retention): report unusable storage files by @efegokdemir in #775
- fix(edgesync): reject colon in spoke IDs by @efegokdemir in #776
- fix(tiering): remove redundant metadata mutex by @efegokdemir in #777
- fix(compaction): list each measurement once in the candidates preview by @alexeymoskalev-devops in #789
- fix(sql): centralize remaining DuckDB string escaping by @efegokdemir in #782
- fix(backup): classify temp write failures correctly by @efegokdemir in #784
- fix(edgesync): bound source paths to storage budget by @efegokdemir in #783
- fix(mqtt): validate placeholder reservation in startSubscriber before… by @Thundercloud12 in #788
- fix(cluster): reopen the replication query gate when a manifest entry is deleted (#759, #795) by @xe-nvdk in #800
- fix(shutdown): retain the WAL when the shutdown flush loses data (#803) by @xe-nvdk in #806
- fix(cluster): sync a follower's manifest with the leader before the startup catch-up walk (#799) by @xe-nvdk in #808
- fix(metrics): wire buffer, audit and MQTT metrics that were never populated (#802) by @xe-nvdk in #811
- fix(metrics): count requests and successes on the Arrow query endpoint (#801) by @xe-nvdk in #812
- fix(deploy): correct storage env var, enable WAL, drop no-op autoscaling values (#804) by @xe-nvdk in #814
- fix(shutdown): honour server.shutdown_timeout instead of a hardcoded 30s (#805) by @xe-nvdk in #815
- fix(cluster): FSM delete callback no longer takes the coordinator lock; Stop cannot deadlock on a delete applied during shutdown (#797) by @xe-nvdk in #816
- fix(metrics): remove arc_replication_sequence_gaps_total (#810) by @xe-nvdk in #820
- fix(metrics): populate the DuckDB connection-pool gauges (#809) by @xe-nvdk in #821
- fix(metrics): remove arc_decomp_buffer_discards_total (#817) by @xe-nvdk in #822
- fix(iceberg): snapshot-expiry data-file deletion (#632) and spoke-namespace export (#634) by @xe-nvdk in #824
- fix(test): make the buffer flush-counter test independent of execution order by @xe-nvdk in #829
- fix(iceberg): refuse incomplete exports by @efegokdemir in #785
- fix(compaction): clean exact job temp directory by @efegokdemir in #786
- fix(cluster): propagate manifest apply context by @efegokdemir in #787
- fix(rbac): preserve case in table reference deduplication (#750) by @Thundercloud12 in #832
- test(cluster): make the forward-apply deadline test independent of a two-voter election by @xe-nvdk in #833
- fix(query): keep DECIMAL JSON values numeric by @tayfuryldz in #831
- fix(iceberg): re-register files the delete API rewrote in place (#633) by @xe-nvdk in #836
- fix(backup): back up an Iceberg warehouse outside the storage root and stop the restore wedge (#637) by @xe-nvdk in #839
- fix(mqtt): validate database, mapping targets and measurement names before they reach the buffer (#300) by @xe-nvdk in #840
- Clarify minimum files for hourly compaction by @jallegri in #838
- test(cluster): let the forward-apply deadline test wait for the context timer by @xe-nvdk in #843
- fix(query): track Arrow IPC queries in the query registry and slow-query log (#309) by @xe-nvdk in #842
- fix(iceberg): keep a compacted file out of the table until its compaction has committed (#638) by @xe-nvdk in #844
- fix(api): wrap the arcx stream writers in safeStream (#717) by @xe-nvdk in #845
- fix(cluster): authorise forwarded writes from the FSM node table and refill the registry on snapshot restore (#807) by @xe-nvdk in #852
- fix(cluster): join subsystems outside the coordinator and Raft locks on Stop (#813) by @xe-nvdk in #855
- fix(cluster): elect a primary writer, and let the promotion reach the gate that reads it (#850) by @xe-nvdk in #859
- fix(sql): make the read-SQL gates' view of quoted constructs match DuckDB's by @xe-nvdk in #860
- fix(cluster): stop trusting a forwarded-apply connection the leader has dropped (#851) by @xe-nvdk in #861
- fix(cluster): announce the nodes a snapshot restore dropped (#847) by @xe-nvdk in #863
- fix(cluster): announce a heartbeat from a node the cluster has forgotten (#849) by @xe-nvdk in #864
- chore(helm): default to three writers, the minimum for HA in both patterns by @xe-nvdk in #865
- fix(shutdown): run equal-priority hooks in registration order, and stop schedulers before the coordinator (#854) by @xe-nvdk in #866
- fix(cluster): stop replication during shutdown, and stop it without holding the coordinator lock (#853) by @xe-nvdk in #867
- feat(api): add GET /ready/write, a write-pool health check (#857) by @xe-nvdk in #868
- feat(cluster): warn when a cluster has too few writer-role nodes (#856) by @xe-nvdk in #873
- fix(cluster): an unlimited license no longer rejects every cluster join (#869) by @xe-nvdk in #874
- fix(helm): the compactor pod never joined the cluster (#870) by @xe-nvdk in #877
- fix(cluster): an unrecognised node role is no longer treated as standalone (#848) by @xe-nvdk in #878
- feat(cluster): only nodes that can ingest vote in Raft elections (#862) by @xe-nvdk in #879
- fix(cluster): a node that leaves gracefully and restarts re-joins again (#858) by @xe-nvdk in #881
- chore(ci): gofmt the eight dirty files and turn the gate on (#875) by @xe-nvdk in #882
- feat(cluster): elect a primary writer even when automatic failover is off (#872) by @xe-nvdk in #883
- fix(compaction): check the cluster gate on every tick, not only at Start (#876) by @xe-nvdk in #884
- fix(cluster): replicate from the primary writer, and survive its restart (#885, #887) by @xe-nvdk in #891
- fix(compaction): append the implicit "time" sort key like ingest does by @pujitha24 in #890
- feat(cluster): add DELETE /api/v1/cluster/files endpoint (#794) by @Thundercloud12 in #830
- fix(cluster): move the compactor lease to a dedicated compactor, and let an operator move it (#876) by @xe-nvdk in #893
- feat(cluster): report and converge a Raft voter set that disagrees with node roles (#880) by @xe-nvdk in #896
- test(replication): make sequence handshake tests deterministic by @xe-nvdk in #900
- fix(compaction): prevent input filename collisions by @efegokdemir in #898
- fix(cluster): enforce overall peer fetch timeout by @efegokdemir in #899
- fix(compaction): configure cycle deadline and account for cancellation by @efegokdemir in #922
- fix(query): bind measurement fields the same over every time range by @xe-nvdk in #929
- feat(query): answer a proven-empty time range from the schema anchor (experimental) by @xe-nvdk in #931
- fix(backup): keep field schema anchors out of the database inventory by @xe-nvdk in #932
- fix(backup): back up compaction recovery state and reconcile it on restore by @xe-nvdk in #933
- feat(metrics): count compaction manifests parked as unparseable by @xe-nvdk in #934
- docs: reconcile the 26.09.2 notes for the compaction, schema anchor and backup entries by @xe-nvdk in #935
- test: native acceptance run for range-independent field binding (#914) by @xe-nvdk in #938
- fix(ci): replace the retired MinIO image with SeaweedFS in the objectstore step by @xe-nvdk in #943
- feat(compaction): per-database exclusion list (compaction.exclude_databases) by @xe-nvdk in #942
- feat(deploy): replace bundled MinIO with SeaweedFS across chart, compose and docs by @xe-nvdk in #944
- fix(deploy): restore bucket pre-creation and honest crash semantics in the SeaweedFS stacks by @xe-nvdk in #947
- docs(release-notes): document at-least-once WAL crash-recovery replay (#948) by @xe-nvdk in #949
- fix(tiering): gate migration on the primary writer in shared-storage mode by @xe-nvdk in #951
- fix(storage): buffer unrewindable bodies so S3 uploads work over plain HTTP by @xe-nvdk in #952
- fix(tiering): keep the cluster manifest in step with migration; gate replicating per-node clusters by @xe-nvdk in #953
- fix(tiering): read an all-cold measurement without a time range; retire hot rows for vanished files by @xe-nvdk in #954
- fix(config): drop the cold tier's storage-class and retrieval keys, which were never read by @xe-nvdk in #955
- refactor(pruning): move the tier-file walk into the pruning package by @xe-nvdk in #956
- fix(cluster): never drop a local delete, and drain the pending ones on stop by @xe-nvdk in #958
- fix(reconciliation): stop reporting replicated files as orphan storage on per-node clusters by @xe-nvdk in #960
- fix(cluster): re-pull a node's own files after an empty-disk restore; hold the manifest sweep until then by @xe-nvdk in #961
New Contributors
- @bferanmi806-sketch made their first contribution in #663
- @Thundercloud12 made their first contribution in #670
- @atirna made their first contribution in #678
- @mah1104ahm made their first contribution in #674
- @copacabanaservice01 made their first contribution in #690
- @be-student made their first contribution in #706
- @MrBeldum made their first contribution in #701
- @pujitha24 made their first contribution in #707
- @lecodev-26 made their first contribution in #769
- @efegokdemir made their first contribution in #780
- @alexeymoskalev-devops made their first contribution in #789
- @tayfuryldz made their first contribution in #831
- @jallegri made their first contribution in #838
Full Changelog: v26.09.1...v26.09.2
Quick Start
Docker
docker run -d \
-p 8000:8000 \
-v arc-data:/app/data \
ghcr.io/basekick-labs/arc:26.09.2Debian/Ubuntu (amd64, arm64)
# Download and install
wget https://github.com/basekick-labs/arc/releases/download/v26.09.2/arc_26.09.2_amd64.deb
sudo dpkg -i arc_26.09.2_amd64.deb
# Start and enable
sudo systemctl enable arc
sudo systemctl start arc
# Check status
curl http://localhost:8000/healthRHEL/Fedora/Rocky (x86_64, aarch64)
# Download and install
wget https://github.com/basekick-labs/arc/releases/download/v26.09.2/arc-26.09.2-1.x86_64.rpm
sudo rpm -i arc-26.09.2-1.x86_64.rpm
# Start and enable
sudo systemctl enable arc
sudo systemctl start arcArch Linux / Omarchy (x86_64, aarch64)
# Download and install
wget https://github.com/basekick-labs/arc/releases/download/v26.09.2/arc-26.09.2-1-x86_64.pkg.tar.zst
sudo pacman -U arc-26.09.2-1-x86_64.pkg.tar.zst
# Start and enable
sudo systemctl enable arc
sudo systemctl start arcKubernetes (Helm)
helm install arc https://github.com/basekick-labs/arc/releases/download/v26.09.2/arc-26.09.2.tgzDownload Artifacts
| Platform | Architecture | Package |
|---|---|---|
| Docker | amd64, arm64 | ghcr.io/basekick-labs/arc:26.09.2
|
| Debian/Ubuntu | amd64 | arc_26.09.2_amd64.deb
|
| Debian/Ubuntu | arm64 | arc_26.09.2_arm64.deb
|
| RHEL/Fedora | x86_64 | arc-26.09.2-1.x86_64.rpm
|
| RHEL/Fedora | aarch64 | arc-26.09.2-1.aarch64.rpm
|
| Arch Linux / Omarchy | x86_64 | arc-26.09.2-1-x86_64.pkg.tar.zst
|
| Arch Linux / Omarchy | aarch64 | arc-26.09.2-1-aarch64.pkg.tar.zst
|
| Kubernetes | - | arc-26.09.2.tgz (Helm)
|