SochDB v0.5.0 Release Notes
Release Date: February 15, 2026 Focus: Lock-free concurrency, MVCC consolidation, HNSW hot-path allocation removal, real compression, and the foundations for the Knowledge Fabric layer.
v0.5.0 is a core engine release. The bulk of the work lands in the Rust workspace crates (sochdb-core, sochdb-storage, sochdb-index). Most changes are internal performance and correctness improvements that are transparent to SDK callers β your existing Python, Node.js, Go, and Rust code keeps working unchanged.
The current shipping versions are: Core engine 2.0.3 Β· Python SDK 0.5.9 Β· Node.js SDK 0.5.3 Β· Go SDK 0.4.5. The notes below summarize the engine changelog as published for the 0.5.0 engine line.
Overviewβ
This release is about removing locks from the read/write hot paths, consolidating duplicated MVCC machinery into a single reusable version-chain abstraction, eliminating per-search heap allocations in HNSW, and replacing placeholder compression with real LZ4 and Zstd. It also introduces two new building blocks β the content-addressed Knowledge Object data model and the sochdb-fusion crate β that lay groundwork for fused vector + graph + temporal query execution.
Highlights:
- Lock-free epoch GC β the reader registry and version-chain store no longer take global write locks.
- Consolidated MVCC version chain β one generic
BinarySearchChain<E>backs both durable storage and concurrent MVCC. - Zero-DashMap HNSW hot path β searches resolve the entry point and neighbor nodes without
DashMaplookups, with reused scratch buffers. - Lock-free fat-node version chain β 8 version pointers per cache line, CAS-serialized slot reservation.
- SSI bloom filter β a 256-bit read-set bloom filter fast-rejects non-conflicting commits.
- Real LZ4 / Zstd compression β placeholders replaced with
lz4_flexandzstd. - Columnar zero-allocation row access β read a single value or a row view without materializing a per-row
HashMap. - Knowledge Object data model β content-addressed objects with BLAKE3 OIDs.
sochdb-fusioncrate β new workspace member for fused query execution.
Changedβ
Lock-Free Epoch GC (sochdb-core)β
Epoch-based garbage collection no longer serializes readers behind a global lock.
- Lock-free
ReaderRegistryβ the previousRwLock<HashMap<u64, u64>>is replaced by a fixed-size array of 256 cache-line-alignedAtomicU64slots.register()uses a CAS,unregister()is a single atomic store, andmin_active_epoch()is a relaxed scan. The registry is now fully lock-free with zero contention. - DashMap-backed
EpochGCβ the version-chain store moves fromRwLock<HashMap<K, VersionChain<T>>>to aDashMap, so a GC cycle no longer takes a global write lock. - Strict less-than epoch visibility β
version_at(epoch)now usesepoch < N(previously<=), matching MVCC snapshot semantics. - O(1) GC truncation β
VersionChain::gc()usestruncate(kept)instead of repeatedpop_back()calls.
Consolidated MVCC Version Chain (sochdb-core, sochdb-storage)β
The duplicated version-chain logic that previously lived in both durable_storage and mvcc_concurrent is unified behind one generic abstraction.
BinarySearchChain<E>β a new generic binary-search version chain insochdb-core::version_chaincaptures theO(log V)partition_pointlookup that was duplicated indurable_storage::VersionChainandmvcc_concurrent::VersionChain. Both modules now wrapBinarySearchChain<E>and delegate core operations to it.ChainEntrytrait β an abstraction over version entry types (commit_ts,txn_id,set_commit_ts), implemented bydurable_storage::Versionandmvcc_concurrent::VersionEntry.MvccVersionChain/MvccVersionChainMuttraits β a unified read/write interface for any version-chain implementation.MvccStoretrait β a unified store interface (mvcc_get,mvcc_put,mvcc_commit_key,mvcc_abort_key,mvcc_gc), implemented byMvccMemTable.- Compile-time concurrency markers β
ExternalLock,InternalRwLock, andLockFreeAtomicmarker types let callers select a version-chain strategy generically at compile time.
HNSW Search: Zero-DashMap Hot Path (sochdb-index)β
Vector searches no longer touch a DashMap on every step, and no longer allocate per query.
AtomicU32entry point β a newentry_point_densefield removes theDashMaplookup that previously resolved the entry point on every search. It is set during insert and read with anAcquireload.- Local
idβdensecache β each query builds a per-queryHashMap<u128, u32>cache populated frominternal_nodesneighbor traversal; every subsequentcurrnode resolves from the local cache instead of theDashMap. - Scratch buffer reuse β
fast_candidatesandfast_results_heapmove into a thread-localScratchBuffers, eliminating the per-search heap allocations that backed theFastCandidateheaps.
This release changes how the hot path executes, not the index parameters. Core HnswConfig defaults remain M=32, ef_construction=256, ef_search=500, metric Cosine, precision F32. The dimension-aware behavior in the engine is the brute-force flat-scan threshold (<=128D β 10000 vectors, <=384D β 4000, otherwise 1000) β there is no dimension-dependent ef_search split.
Lock-Free Fat-Node Version Chain (sochdb-storage)β
A new fat-node layout reduces pointer chasing during version traversal.
FatNodestruct β groups 8 version pointers per node, packed into a 64-byte cache line, reducing pointer chases fromO(v)toO(v/8). A CAS on anAtomicU8count serializes slot reservation within a node.LockFreeVersionChainβ a fat-node linked list;try_pushappends within the current node and only allocates a new node when the current one is full.
SSI Conflict Detection: Stack-Allocated Keys + Bloom Filter (sochdb-storage)β
Serializable Snapshot Isolation commit checks are faster and allocate less.
InlineKey(SmallVec<[u8; 32]>) β read and write sets use stack-allocated keys; keys of 32 bytes or fewer avoid heap allocation.record_read/record_writenow accept&[u8]instead ofVec<u8>.- 256-bit Bloom filter β each
SsiTransactioncarries a 4Γu64Bloom filter over its read set. Oncommit(), non-conflicting write sets are fast-rejected before the full read set is scanned. - DashMap-backed
SsiManagerβkey_writersmoves fromRwLock<HashMap>to aDashMapfor concurrent shard-level access.
Real LZ4 / Zstd Compression (sochdb-storage)β
Compression is no longer a placeholder.
- LZ4 block compression β implemented with
lz4_flex::compress_prepend_size()/decompress_size_prepended(). The wire format is[original_len: u32 LE][payload], with an uncompressed fallback sentinel (len=0). - Zstd compression β implemented with
zstd::encode_all()/zstd::decode_all()at a configurable compression level. - Faster dedup hashing β switched from
DefaultHasher(SipHash) totwox_hash::xxh3::hash64(), roughly 5Γ faster in this non-adversarial context.
LSCS Temperature Tracker: Lock-Free Threshold (sochdb-storage)β
AtomicU64hot threshold βhot_thresholdis stored as anAtomicU64bit pattern (f64::to_bits()/from_bits()) for lock-free reads, andset_hot_threshold()is now a real implementation (previously a no-op).- Selective hot-column merge β
compact_selective()reads and merges hot column stripes into L1, while cold columns get zero-I/OColumnStripeRefreferences.
Feature Flag Hygiene (workspace-wide)β
sochdb-vectorβsimd-kernelsis consolidated intosimd. A deprecated alias is kept for backward compatibility and will be removed in v0.6.sochdb-indexβasync-traitis now optional behind thellm-embeddingsfeature; a newasyncfeature gates the tokio opt-in.sochdb-coreβserde_jsonmoves from optional (analytics-only) to an always-on dependency;blake3is added as a workspace dependency.deny.tomlβsochdb-indexis added to the license-check exclusion list.- Workspace β the new
sochdb-fusioncrate is added to the workspace members.
Addedβ
Columnar Zero-Allocation Row Access (sochdb-core, sochdb-storage)β
You can now read columnar query results one value or one row at a time without building a per-row HashMap.
TypedColumn::value_at(idx)β extracts a singleSochValuefrom a columnar array without materializing a row map.ColumnarQueryResult::row_view(idx)β returns aColumnarRowViewthat resolves column values on demand from the underlying arrays:O(1)column lookup plusO(1)array read, with zero allocation per row.ColumnarRowView::get(column)β named-column access withoutHashMapoverhead.ColumnarQueryResult::into_query_result()β a backward-compatible materialization back to the row-orientedQueryResult.
DurableStorage Fast-Path APIs (sochdb-storage)β
Lightweight read paths that skip full MVCC bookkeeping for read-only access.
begin_read_only_fast()/abort_read_only_fast()β read transactions that bypass theactive_txnsDashMapand full MVCC bookkeeping.read_latest(key)β a single-key read at the current timestamp with no transaction overhead.scan_latest(prefix)β a prefix scan at the current timestamp with no transaction overhead.
Knowledge Object Data Model (sochdb-core) β New Moduleβ
knowledge_object.rsβ a content-addressedKnowledgeObjectwith a BLAKE3 object ID (OID), embedded edges, multi-space embeddings, bitemporal coordinates, and provenance chains. This is the foundation for the planned Knowledge Fabric layer.
The Knowledge Object module ships as a sochdb-core building block. It is not yet exposed as a first-class API in the language SDKs or the server in this release β treat it as a foundation for future work rather than an end-user feature.
sochdb-fusion Crate β Newβ
- A new workspace member for fused query execution across vector, graph, and temporal predicates.
sochdb-fusion is added to the workspace in this release as the home for fused execution. It is early-stage scaffolding for upcoming cross-modal query work, not yet a stable public API.
sochdb-bench Crate β Newβ
- A Criterion micro-benchmark suite covering HNSW, storage, and MVCC, with optimization results documented in the engine's
OPTIMIZATIONS.md.
Fixedβ
- Compression divide-by-zero β
CompressionEnginenow guards withcompressed.len() > 0before computing the compression ratio.
Version Bump: 0.4.9 β 0.5.0β
The engine line moved from 0.4.9 to 0.5.0 across all 13 workspace crates, plus sochdb-kernel, sochdb-plugin-logging, and sochdb-python (both its Cargo.toml and pyproject.toml). Docker tags, docs, and READMEs were updated to match.
Upgradingβ
For SDK users, no code changes are required by this release β the changes are internal to the engine. Make sure you are on a current toolchain and current SDK builds:
- Python
- Node.js
- Go
- Rust
pip install --upgrade sochdb
# General-purpose embedded usage (pure-Python SDK, v0.5.9).
# Database/Namespace/Collection come from this SDK package.
from sochdb import Database
db = Database.open("./my_db")
db.put(b"agent/session/1", b"hello")
print(db.get(b"agent/session/1"))
db.close()
sochdbThere are two importable sochdb packages. The pure-Python ctypes SDK (v0.5.9) above is the broad embedded + server SDK (Database, Namespace, Collection, Queue, AgentMemory, temporal-graph, semantic-cache, StudioClient) β prefer it for general use. The separate PyO3 native engine (v2.0.3) exposes index primitives such as HnswIndex, BM25Index, RRFFusion, ThreeLaneHybridIndex, MultiShardHnswIndex, TableDatabase, the build_index* helpers, and recommended_hnsw_params. MultiShardHnswIndex is a threaded scatter-gather wrapper that exists only in the native Python package; it is not a core-engine or server type.
npm install @sochdb/sochdb
import { EmbeddedDatabase } from '@sochdb/sochdb';
// EmbeddedDatabase.open() is synchronous.
const db = EmbeddedDatabase.open('./my_db');
const txn = db.begin();
txn.put('agent/session/1', 'hello');
await txn.commit(); // commit() returns Promise<void>
console.log(db.get('agent/session/1'));
db.close();
go get github.com/sochdb/sochdb-go
// The Go SDK is remote-first by default; the embedded FFI engine is
// behind the `sochdb_embedded` build tag.
import sochdb "github.com/sochdb/sochdb-go"
client, err := sochdb.Connect("grpc://localhost:50051")
if err != nil {
panic(err)
}
defer client.Close()
cargo add sochdb
# The published client crate is named `sochdb` (crate version tracks the
# core engine line, currently 2.0.3).
[dependencies]
sochdb = "2.0.3"
The sochdb-vector simd-kernels feature flag is deprecated in 0.5.0 in favor of simd. The alias still works in 0.5.x but will be removed in v0.6 β switch any explicit simd-kernels usage to simd now.
Licenseβ
SochDB is split-licensed by component:
- The core engine β the Rust workspace, the published
sochdbcrate, the server, and the MCP server β is AGPL-3.0-or-later, with commercial licensing available. - The language SDKs (Python, Node.js, Go) are Apache-2.0.
Resourcesβ
- Documentation: https://sochdb.dev
- GitHub: https://github.com/sochdb/sochdb
- Previous release: v0.4.0 Release Notes