github Basekick-Labs/arc v26.09.2
Arc 26.09.2

2 hours ago

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

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.2

Debian/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/health

RHEL/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 arc

Arch 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 arc

Kubernetes (Helm)

helm install arc https://github.com/basekick-labs/arc/releases/download/v26.09.2/arc-26.09.2.tgz

Download 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)

Documentation

Community

Don't miss a new arc release

NewReleases is sending notifications on new releases.