Skip to content

docs(26.7.2): cover release-note gaps (HA, security, sparse-vector, write-counter, Bolt)#418

Merged
robfrank merged 5 commits into
mainfrom
docs/26.7.2-release-updates
Jul 10, 2026
Merged

docs(26.7.2): cover release-note gaps (HA, security, sparse-vector, write-counter, Bolt)#418
robfrank merged 5 commits into
mainfrom
docs/26.7.2-release-updates

Conversation

@robfrank

Copy link
Copy Markdown
Contributor

Summary

Documents the user-facing changes introduced in ArcadeDB 26.7.2 that were missing from the docs. Every new fact was verified against the ArcadeDB source at tag 26.7.2 (enum names, JSON/proto field names, METADATA keys, allow-lists) rather than paraphrased from the release notes.

Organized as four focused commits.

1. HA durable Raft storage & Bolt temporal — breaking changes (45dfe42c)

  • arcadedb.ha.raftPersistStorage now defaults to true: corrected the default in settings.adoc and the HA settings table, added raftStorageDirectory to the HA table, and a new Durable Raft Storage section.
  • Fixed the now-stale "Raft log is wiped on every restart / do not copy / do not mount" guidance in upgrade.adoc (What-to-copy, HA cluster upgrade, Docker/Kubernetes).
  • Added the committed-remotely contract (TransactionCommittedRemotelyException → HTTP 409, do not retry) and the leader auto-recovery of a follower's replication channel after a pod-IP/DNS change.
  • Bolt temporal values are now native PackStream structures (not ISO-8601 strings) — breaking NOTE in the Bolt data-type mapping + two upgrade.adoc breaking-change entries.

2. Security hardening (6bd4a9be)

  • New updateDatabaseSettings group permission (GHSA-8vr5-263f-x5r3), incl. the admin-group auto-migration.
  • DEFINE FUNCTION ... LANGUAGE js now requires updateSecurity; sql/cypher require updateSchema (GHSA-vwjc-v7x7-cm6g); documented the polyglot sandbox (IOAccess.NONE / PolyglotAccess.NONE).
  • JS trigger host-class allow-list narrowed to java.util / java.time / java.math (java.lang.* removed — GHSA-x9f9-r4m8-9xc2).

3. Sparse-vector posting-weight quantization — #5143 (89dadf0f)

  • Documented the weightQuantization METADATA key (INT8 default, FP16, FP32) on LSM_SPARSE_VECTOR; removed it from the "future work" list in vector-search.adoc.

4. Cypher write-counter (stats) over HTTP & gRPC — #5015 (d43e533a)

  • HTTP /command Write statistics section (camelCase stats object, 11 counters + containsUpdates, emitted only for writes).
  • gRPC ExecuteCommandResponse / QueryUpdateStats message (snake_case), cross-linked to the HTTP shape.

Note on scope

The release bullet "Point datatype and spatial index (#3401)" is not a doc gap: the engine added no new Type or INDEX_TYPE (the enum is unchanged), and #3401 was closed against the existing WKT GEOSPATIAL index + geo.* functions, already documented in geospatial.adoc. No native Point type was invented. Internal engine-audit fixes, parallel-scan/async fixes and dependency bumps have no user-facing surface and are intentionally not documented.

Verification

  • docs-validator.py passes: filenames, anchors, and all cross-references valid.
  • All commits pass the repo pre-commit hooks (incl. typos).

🤖 Generated with Claude Code

robfrank and others added 4 commits July 10, 2026 12:24
…king changes

Cover the two 26.7.2 breaking changes and related HA contracts:

- arcadedb.ha.raftPersistStorage now defaults to true (durable Raft
  storage). Correct the default in settings.adoc and the HA settings
  table, add ha.raftStorageDirectory to the HA table, and add a
  "Durable Raft Storage" section. Fix the now-stale "wiped on every
  restart / do not copy" guidance in upgrade.adoc (What to copy, HA
  cluster upgrade, Docker/Kubernetes).
- Bolt temporal values (date/time/datetime/...) are now native
  PackStream structures instead of ISO-8601 strings. Add a breaking-
  change NOTE to the Bolt data type mapping and a bolt-datatypes anchor.
- Add the committed-remotely response contract
  (TransactionCommittedRemotelyException -> HTTP 409, do not retry).
- Note leader auto-recovery of a follower's replication channel after
  a pod-IP/DNS change.
- Add 26.7.2 entries to the upgrade Breaking changes section.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tions and triggers

Cover the 26.7.2 security advisories that change user-visible behavior:

- Add the updateDatabaseSettings group permission (GHSA-8vr5-263f-x5r3)
  to groups.adoc, including the auto-migration of admin groups and the
  new default admin access list.
- Document required privileges for DEFINE FUNCTION in sql-custom-
  functions.adoc: LANGUAGE js now requires updateSecurity, sql/cypher
  require updateSchema (GHSA-vwjc-v7x7-cm6g), plus the polyglot sandbox
  (IOAccess.NONE / PolyglotAccess.NONE).
- Expand the JS trigger sandbox note in sql-triggers.adoc with the
  narrowed host-class allow-list (java.util/java.time/java.math only;
  java.lang.* removed) and the RCE advisory GHSA-x9f9-r4m8-9xc2.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…M_SPARSE_VECTOR

The sparse vector index now exposes posting-weight quantization through
the weightQuantization index METADATA key (INT8 default, FP16, FP32),
at parity with the dense LSM_VECTOR quantization knob. Previously the
choice was hard-wired to INT8.

- sql-indexes.adoc: add weightQuantization to the LSM_SPARSE_VECTOR
  METADATA example and a values/trade-off table.
- vector-search.adoc: remove weight quantization from the "tracked
  separately" future-work list and point to CREATE INDEX; fix a
  pre-existing typo flagged by the typos hook.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…P and gRPC

The QueryStatistics write counters (nodes/relationships/properties/labels/
indexes/constraints created/removed, containsUpdates), previously only on
Bolt, are now surfaced over HTTP and gRPC, with counts aggregated across
UNION branches and CALL subqueries.

- http.adoc: add a "Write statistics (stats)" section to the command
  endpoint documenting the camelCase stats object, its keys, and an
  example response. Emitted only for write queries.
- grpc-api.adoc: document ExecuteCommandResponse and the QueryUpdateStats
  message (snake_case fields) with a cross-link to the HTTP shape.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mergify

mergify Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the documentation for ArcadeDB v26.7.2, covering key changes such as configurable posting-weight quantization for sparse vector indexes, native PackStream temporal structures for Bolt clients, new database settings permissions, and stricter JavaScript sandboxing. It also documents HA improvements, including durable Raft storage by default and write statistics in HTTP/gRPC responses. The review feedback correctly points out that mounting wildcard paths like raft-storage-* is unsupported by container runtimes and Kubernetes, recommending that users configure arcadedb.ha.raftStorageDirectory to a static path instead.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.


Durable storage lets a restarted node rejoin by *replaying its own persisted log* rather than always requiring a full snapshot resync from the leader.

*Migration:* mount `raft-storage-*` (or the directory named by `arcadedb.ha.raftStorageDirectory`) on durable storage before upgrading. On Kubernetes, back it with a `PersistentVolumeClaim` — see <<kubernetes,Kubernetes>>. A throwaway or test cluster that intentionally wants ephemeral behavior can opt out with `arcadedb.ha.raftPersistStorage=false`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Mounting a wildcard path like raft-storage-* is not supported by container runtimes (Docker) or Kubernetes volume mounts. Doing so will result in a literal directory named raft-storage-* being created, which will not match the actual peer directories. Instead, users should configure arcadedb.ha.raftStorageDirectory to a static path and mount that static path.

*Migration:* Configure +arcadedb.ha.raftStorageDirectory+ to a static path (e.g., /home/arcadedb/raft-storage) and mount that directory on durable storage before upgrading. (Note: Mounting a wildcard path like raft-storage-* is not supported by container runtimes or Kubernetes). On Kubernetes, back it with a +PersistentVolumeClaim+ — see <<kubernetes,Kubernetes>>. A throwaway or test cluster that intentionally wants ephemeral behavior can opt out with +arcadedb.ha.raftPersistStorage=false+.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct — a dynamically-named raft-storage-<nodeName> directory cannot be mounted as a volume, which is precisely what arcadedb.ha.raftStorageDirectory exists for. Reworded the migration note to set raftStorageDirectory to a static path and mount that, keeping the plain-filesystem copy path as an alternative. Fixed in 8fec0fe.

* Mount `/home/arcadedb/databases` on a persistent volume — this is the equivalent of "copy the `databases/` folder".
* Mount `/home/arcadedb/config` only if you have edited the files listed in <<upgrade-config-files>>; otherwise let the image ship its defaults.
* Do *not* mount `/home/arcadedb/raft-storage-*` on a persistent volume; the Raft log is ephemeral and is rebuilt from peers on every pod restart.
* Mount `/home/arcadedb/raft-storage-*` (or the path set by `arcadedb.ha.raftStorageDirectory`) on a persistent volume. Since v26.7.2 the Raft log is durable by default (`arcadedb.ha.raftPersistStorage=true`) so a restarted pod can replay its own log instead of resyncing from peers. On releases before v26.7.2, or with `raftPersistStorage=false`, the log is ephemeral and this mount is unnecessary.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Mounting a wildcard path like /home/arcadedb/raft-storage-* is not supported by container runtimes (Docker) or Kubernetes volume mounts. Doing so will result in a literal directory named raft-storage-* being created, which will not match the actual peer directories. Instead, users should configure arcadedb.ha.raftStorageDirectory to a static path and mount that static path.

* Mount +arcadedb.ha.raftStorageDirectory+ (configured to a static path, e.g., /home/arcadedb/raft-storage) on a persistent volume. (Note: Mounting a wildcard path like /home/arcadedb/raft-storage-* is not supported by container runtimes or Kubernetes). Since v26.7.2 the Raft log is durable by default (+arcadedb.ha.raftPersistStorage=true+) so a restarted pod can replay its own log instead of resyncing from peers. On releases before v26.7.2, or with +raftPersistStorage=false+, the log is ephemeral and this mount is unnecessary.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct for the container case. Changed the Docker/Kubernetes bullet to set arcadedb.ha.raftStorageDirectory to a static path and mount that path, and noted that the raft-storage-* wildcard is created literally rather than expanded. Fixed in 8fec0fe.

… Raft mounts

Address review: a dynamically-named raft-storage-<nodeName> directory
cannot be mounted as a Docker/Kubernetes volume (a raft-storage-* wildcard
is created literally, not expanded) — which is exactly why
arcadedb.ha.raftStorageDirectory exists. Update the durable-storage
migration note (ha.adoc) and the Docker/Kubernetes upgrade bullet
(upgrade.adoc) to set raftStorageDirectory to a static path and mount that,
while keeping the plain-filesystem "copy the directory" path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@robfrank robfrank merged commit e9a3a06 into main Jul 10, 2026
3 of 4 checks passed
@robfrank robfrank deleted the docs/26.7.2-release-updates branch July 10, 2026 11:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant