Configuration Reference

ZoneTreeFactory<TKey, TValue> owns the configuration used to create or open a tree. Configure components and options before calling an open method.

Factory Entry Points

Purpose API
data and WAL location SetDataDirectory, SetWriteAheadLogDirectory
key behavior SetComparer, SetKeyHasher, SetKeySerializer
value behavior SetValueSerializer, deletion delegates
mutable segment SetMutableSegmentMaxItemCount, SetMutableSegmentBloomFilterBitsPerItem
persistent segments SetDiskSegmentMaxItemCount, SetDiskSegmentCompressionBlockSize
grouped options Configure, ConfigureWriteAheadLogOptions, ConfigureDiskSegmentOptions
providers SetRandomAccessDeviceManager, SetWriteAheadLogProvider, SetTransactionLog
opening Create, Open, OpenOrCreate, transactional variants

Known key/value types receive default serializers and, where applicable, comparers and key hashers. Custom types require explicit compatible components.

Core Defaults

Option Default Validated range or meaning
MutableSegmentMaxItemCount 1_000_000 at least 1_000
MutableSegmentBloomFilterBitsPerItem 8 0..64; 0 disables
DiskSegmentMaxItemCount 20_000_000 at least 10_000
mutable B+Tree lock mode NodeLevelMonitor defined BTreeLockMode value
mutable B+Tree node size 128 at least 16
mutable B+Tree leaf size 128 at least 16
single-segment garbage collection on load disabled boolean
unsafe numeric option values disabled boolean; does not bypass required-component or enum validation

The public property identifiers BTreeLockMode, BTreeNodeSize, and BTreeLeafSize configure ZoneTree's mutable B+Tree.

Key Components

Component Contract
Comparer defines key equality and total order
KeyHasher comparer-equal keys must hash equally
KeySerializer defines persisted key bytes
ValueSerializer defines persisted value bytes
deletion delegates define and create deletion markers

Metadata records all four component type names. On open, ZoneTree validates the comparer and serializer types, but it does not currently reject a changed key-hasher type. A comparer-order or serializer-format change is a storage migration even when the .NET type name stays the same. A replacement hasher does not change persisted data, but it must remain compatible with comparer equality.

Mutable-Segment Bloom Filter

The filter is sized from MutableSegmentMaxItemCount and MutableSegmentBloomFilterBitsPerItem. Allocation rounds up to a power of two and is capped at 2^30 bits.

using var zoneTree = new ZoneTreeFactory<long, string>()
    .SetMutableSegmentMaxItemCount(500_000)
    .SetMutableSegmentBloomFilterBitsPerItem(8)
    .OpenOrCreate();

Use 0 bits per item to disable the filter. A larger value is not free: it increases memory and does not eliminate comparer-based lookup after a possible match.

See mutable-segment Bloom filters for sizing, false-positive behavior, and hasher requirements.

WAL Defaults

Option Default Validated range or meaning
WriteAheadLogMode AsyncCompressed defined mode
CompressionBlockSize 256 KB 256 KB..16 MB
CompressionMethod Zstd compatible method/level pair
CompressionLevel Zstd level 0 method-specific
async empty-queue poll interval 100 ms non-negative
sync-compressed tail writer enabled boolean
sync-compressed tail writer interval 500 ms non-negative
incremental backup disabled used by transactional-log compaction

WAL options apply when new WALs are created. Existing WALs retain their stored options. The modes have different caller acknowledgment and failure boundaries; read WAL modes before changing them.

Disk-Segment Defaults

Option Default Validated range or meaning
DiskSegmentMode MultiPartDiskSegment defined mode
CompressionBlockSize 4 MB 1 MB..64 MB
CompressionMethod Zstd compatible method/level pair
CompressionLevel Zstd level 0 method-specific
MinimumRecordCount 1_500_000 at least 1_000
MaximumRecordCount 3_000_000 at least 2_000; must exceed minimum
DefaultSparseArrayStepSize 1024 non-negative; 0 disables
KeyCacheSize 1024 non-negative; 0 disables
ValueCacheSize 1024 non-negative; 0 disables
key cache record lifetime 10_000 ms non-negative
value cache record lifetime 10_000 ms non-negative
MaterializedEntryCacheSize 4096 chunks/block non-negative; 0 disables
SearchHintPrefetchSize 16 entries non-negative; 0 disables

Materialized chunks contain 16 aligned entries, so the default permits at most 65,536 cached materialized positions in one decompressed block. Actual memory depends on key/value shape and accessed positions.

using var zoneTree = new ZoneTreeFactory<long, string>()
    .ConfigureDiskSegmentOptions(options =>
    {
        options.DefaultSparseArrayStepSize = 512;
        options.MaterializedEntryCacheSize = 2048;
        options.SearchHintPrefetchSize = 16;
    })
    .OpenOrCreate();

The active disk-segment options are persisted in ZoneTree metadata. Individual segment files also retain the physical format information required to read their stored representation.

Iterator Defaults

Option Default Meaning
IteratorType AutoRefresh refresh behavior
IncludeDeletedRecords false hide deletion markers
ContributeToTheBlockCache false avoid warming shared blocks during scans
DiskSegmentPrefetchSize 0 values below 2 disable prefetch

Iterator options are per iterator and are not persisted.

Maintainer Defaults

The maintainer owns runtime jobs and cache cleanup rather than persisted tree options. Important defaults include a one-minute inactive block lifetime and a 30-second inactive-block cleanup interval.

using var maintainer = zoneTree.CreateMaintainer();

maintainer.BlockCacheLifeTime = TimeSpan.FromMinutes(1);
maintainer.InactiveBlockCacheCleanupInterval = TimeSpan.FromSeconds(30);

These settings apply to a created maintainer. The zoneTree.Maintenance API exposes state, events, and operations for custom maintenance policy.

Validation

The factory validates required components, enum values, compression compatibility, numeric ranges, multipart bounds, and a common case-insensitive string comparer/hasher mismatch.

AllowUnsafeOptionValues bypasses numeric range checks for advanced or test configurations. It does not make invalid component combinations safe and should not be a production tuning shortcut.

Complete Configuration Example

using ZoneTree;
using ZoneTree.Options;
using ZoneTree.WAL;

using var zoneTree = new ZoneTreeFactory<long, string>()
    .SetDataDirectory("data/app")
    .SetMutableSegmentMaxItemCount(500_000)
    .SetMutableSegmentBloomFilterBitsPerItem(8)
    .ConfigureWriteAheadLogOptions(options =>
    {
        options.WriteAheadLogMode = WriteAheadLogMode.AsyncCompressed;
    })
    .ConfigureDiskSegmentOptions(options =>
    {
        options.DiskSegmentMode = DiskSegmentMode.MultiPartDiskSegment;
        options.MaterializedEntryCacheSize = 4096;
        options.SearchHintPrefetchSize = 16;
    })
    .OpenOrCreate();

using var maintainer = zoneTree.CreateMaintainer();

See disk-segment tuning, read-path caching, and key components.