| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-03-24 | 15.0 kB | |
| v3.9.0 source code.tar.gz | 2026-03-24 | 7.7 MB | |
| v3.9.0 source code.zip | 2026-03-24 | 10.9 MB | |
| Totals: 3 Items | 18.7 MB | 1 | |
Memgraph v3.9.0 - March 25th, 2026
⚠️ Breaking changes
- HA coordinator data directories from previous versions contain corrupted cluster configuration log entries that cannot be recovered. When upgrading to 3.9, all coordinator data directories must be cleaned and coordinators restarted fresh; run setup queries again on the new coordinator leader. Data instances are not affected. See the migration guide. #3900
✨ New features
- Vector indexes can now be created with a function in the
WITH CONFIGclause:CREATE VECTOR INDEX ... WITH CONFIG fun();so you can generate index configuration dynamically instead of using a static map literal. #3801 - Added
--storage-floating-point-resolution-bitsto choose double (64), float (32), or half (16) precision for floating-point property values system-wide, so you can reduce memory use for graphs with many float properties when lower precision is acceptable. #3817 - Added coordinator setting
deltas_batch_progress_sizeto control how many deltas a replica processes before sending an in-progress heartbeat during replication. HA clusters can tune it to avoid RPC timeouts on large transactions (lower value) or reduce overhead on fast replicas (higher value). Set viaSET COORDINATOR SETTING; default is 100000 (unchanged behavior for existing clusters). #3797 SHOW TRANSACTIONSnow lists transactions in committing and aborting phases (in addition to running), and shows any snapshot creation in progress with phase and progress in metadata, so you can see what is running on the database at a glance. #3833- Added
--logger-typeflag (syncorasync, defaultsync). When set toasync, log messages are written by a background thread instead of inline, reducing latency on hot paths under high throughput. Default behavior is unchanged; use--logger-type=asyncto opt in. #3844 - Added
--log-retention-daysto control how many days daily log files are kept before automatic removal. Default is 35 (unchanged from previous behavior); set the flag to tune retention for storage or compliance. #3862 --storage-access-timeout-seccan now be updated at runtime via thestorage.access_timeout_secdatabase setting, so you can increase the timeout when you hit storage timeout errors without restarting the instance. #3882- Added server-side global parameters: define named values that persist across sessions and are resolved in queries. Use
SET GLOBAL PARAMETER,UNSET GLOBAL PARAMETER, andSHOW PARAMETERSto manage them, and reference values in Cypher with$param(client-provided parameters take precedence). Global parameters are replicated and recovered on restart, so you can use them as a durable, cluster-wide store for frequently used query values. #3717
🛠️ Improvements
SHOW STORAGE INFOnow splits memory intograph_memory_trackedandvector_index_memory_tracked, so you can see how much memory vector indices use versus graph data and better plan capacity or troubleshoot memory usage. #3847- Renamed the
SHOW STORAGE INFOkey fromembeddings_memory_trackedtovector_index_memory_trackedso the name reflects that it accounts for all vector index memory, not only embeddings data. #3863 - ARM platforms now install the correct Go and C# binaries for driver tests, so driver tests can run on ARM in addition to x86. #3776
- Error messages on storage access timeout are now more descriptive so you can identify and troubleshoot lock or contention issues more easily. #3778
- Reduced memory use for vertices and edges by packing boolean values in the delta pointer layout (8 bytes saved per vertex and per edge) with no performance impact. #3814
- When
--storage-snapshot-on-exitis false, any in-progress periodic snapshot is aborted on shutdown so the instance stops faster instead of waiting for the snapshot to finish. The snapshot digest is now updated only after a successful write, so a failed or aborted snapshot no longer causes the next periodic snapshot to be skipped. #3823 - License selection now considers the database, environment variables, and CLI together, automatically choosing the license with the furthest expiry (with source priority to break ties), so you no longer need to clear old database settings for a newer CLI or env license to apply. Malformed or expired keys are rejected immediately when set, and reported license info now matches actual feature availability. #3859
- EdgeSetProperty WAL delta has been expanded. This speeds up edge recovery and replication. Nothing to do, this is all automatic and back-compatible. #3799
🐞 Bug fixes
- Improved query planning for BFS with index lookup: a cost model now chooses between bidirectional and single-source BFS so you get better execution plans for shortest-path queries when both source and destination use an index. #3751
- Fixed a bug where
schema.assertcould not be used as a property name or value, which blocked backup and restore in someDUMP DATABASEscenarios. #3772 - When TLS/SSL certificate or key loading fails, Memgraph now logs an error message so you can see why startup or connection failed and fix path or permission issues. #3795
- With
--data-recovery-on-startupenabled, the system now recovers both users and databases as system metadata on startup, so all system metadata is restored consistently; user data is still not recovered. #3807 - Plan caching is now enabled again for queries that use BFS, fixing a performance regression where a new plan was created for every such query. #3821
- User and role details that apply only to enterprise licenses are now persisted when switching between enterprise and community, so they are not lost and apply again after upgrading back to an enterprise license. #3867
SHOW SCHEMA INFOnow correctly respects fine-grained label-based access control (LBAC) READ permissions, so restricted users see only the schema elements they are allowed to access. #3870- Edge removals in the text index are now fully tracked when using
DETACH DELETE, soSHOW INDEX INFOreports accurate edge counts instead of outdated metadata (search results were already correct). #3878 - Concurrent operations on vector indexes (nodes and edges) are now less contention-prone: internal locking allows multiple writers in parallel and reserves exclusive access only for resize and removal. Garbage collection of deleted entries is targeted instead of scanning the full index, improving GC performance and fixing a potential crash when vertices or edges were deleted in analytical mode before the vector index was cleaned up. #3856
- Fixed a bug where the parallel version of
DISTINCTcould invalidate other cursors in the query and cause failures. PARALLEL EXECUTION withDISTINCTnow runs correctly and faster. #3876 - Fixed inconsistent ordering in the parallel
DISTINCTcursor, which could make PARALLEL EXECUTION output unstable.DISTINCTused in PARALLEL EXECUTION now produces correct, stable results. #3815 - Fixed a bug in HA replication where concurrent edge deltas could be processed twice during durability traversal, causing replica inconsistency. #3836
- Fixed a crash that could occur when queries using Python user-defined functions were cleaned up on internal worker threads. Memgraph now acquires the Python GIL before releasing Python object references during query teardown, preventing segfaults when using Python query modules with custom functions. #3837
- Fixed a rare race in durability when a transaction that created concurrent edges aborted while the delta chain was being processed, which could cause duplicate or missed edge-delta encoding and durability integrity issues. #3839
- Fixed a segfault that could occur when closing Python query modules during Memgraph shutdown. A missing Python interpreter state check is now performed before cleanup so shutdown completes cleanly when Python modules are loaded. #3842
- Fixed a segfault during vector index garbage collection when vertices or edges were being inserted concurrently, which could occur with bulk create/delete/create workloads. #3846
- Fixed a data race in the high-availability coordinator's cluster configuration handling. Concurrent config loads and saves are now properly synchronized, preventing inconsistent state and coordinator instability during cluster membership changes. #3850
- Shutdown on SIGTERM and SIGINT no longer runs inside a signal handler, where logging and mutex use were unsafe. Signals are now consumed on the main thread so the full shutdown sequence runs in normal context, making shutdown more robust against rare crashes or hangs. #3851
- Fixed a Python binding assertion caused by unhandled import errors. When the system encounters errors (for example when over the memory limit), Python will fail to load modules. This was not gracefully handled and would cause termination. The Python bindings are now more robust. #3864
- Fixed a bug where periodic commit failure caused a double abort (which in turn caused an assert). Periodic commit failure is a special case and is now handled correctly by the interpreter. Users can run periodic commit without worrying about query failures. #3868
- Fixed a bug where incorrect queries using CALL + UNION would not throw an exception but would just produce wrong results. #3869
- Fixed occasional "Operation not permitted" error when vertices with concurrently imported edges are indexed. #3871
- Communication data parsing is now more robust when values do not match the expected type, so you get fewer unexpected communication errors between clients and the database. #3873
- The schema query module now works with ZonedDateTime properties, so you can use schema assertions and schema-based workflows (such as backup and restore) on graphs that store temporal data with time zones. #3874
- Fixed a bug where HA coordinator Raft cluster configuration log entries were not persisted correctly, causing coordinators to crash-loop on restart if uncompacted configuration entries existed on disk — most commonly triggered when a newly added coordinator restarts before a Raft snapshot compacts those entries. Users running HA clusters who experience a coordinator crash-loop after adding a new coordinator should upgrade to this version; all coordinator data directories should be wiped before restarting and setup queries should be run again on the new coordinator leader. #3900
- Fixed a crash in the
embeddingsquery module when multiple Bolt sessions calledembeddings.text()orembeddings.node_sentence()in parallel. Model initialization is now thread-safe with a global cache using double-checked locking, preventing race conditions and eliminating redundant model instantiation per request. #3914 - Python module cleanup during shutdown no longer crashes the process; previously, filesystem operations that failed while removing
__pycache__directories would throw exceptions inside a destructor, triggeringstd::terminateand an abrupt abort — now those operations use non-throwing error-code overloads and log warnings instead, so shutdown completes gracefully even when cached files have already been removed. #3908 - Fixed a crash that could occur when a coordinator's internal Raft consensus thread encountered an error during startup or operation — the process would terminate with a segmentation fault instead of exiting cleanly. This affected HA deployments where a coordinator node hit an unexpected state in its background commit path. No user action is required; the fix ensures the coordinator process exits immediately and cleanly without triggering a cascading failure in global cleanup. #3904
- Fixed a race condition during graceful shutdown (SIGTERM) of high-availability data instances where the internal management RPC server could process incoming coordinator health-check requests after the replication state had already been destroyed, resulting in a crash. The shutdown sequence now correctly stops the management server before tearing down replication state, so users running HA clusters should no longer observe unexpected crashes or error logs when stopping data instances with SIGTERM. No configuration changes or user action is required. #3903
- Fixed a bug in vector index garbage collection where the
equal_rangeiterator incorrectly yielded tombstone (deleted) entries as live matches, causing double-frees that corrupted size accounting and led to crashes. Users running workloads with frequent deletions on vector indexes were at risk of hitting this crash. #3899