Files
ZoneTree/docs/usage/maintenance.md
T
2026-06-08 13:22:16 +02:00

3.0 KiB

Maintenance

ZoneTree uses maintenance to move data through the LSM-tree lifecycle. Maintenance keeps write throughput high while gradually producing optimized disk segments.

Why Maintenance Matters

Writes enter the mutable segment. When that segment fills, it becomes read-only and a new mutable segment is created. Read-only segments are later merged into disk segments.

Without maintenance, data can accumulate in in-memory read-only segments and memory usage can grow.

Use The Maintainer

For long-running applications, create a maintainer and keep it alive while the tree is active.

using var zoneTree = new ZoneTreeFactory<int, string>()
    .SetDataDirectory("data/app")
    .OpenOrCreate();

using var maintainer = zoneTree.CreateMaintainer();

The maintainer created by zoneTree.CreateMaintainer() starts a periodic inactive-cache cleanup job and listens to segment lifecycle events. It starts merge work when read-only segments cross configured thresholds.

Default maintainer settings:

Setting Default
MaximumReadOnlySegmentCount 64
ThresholdForMergeOperationStart 0 records
BlockCacheLifeTime 1 minute
InactiveBlockCacheCleanupInterval 30 seconds
inactive-cache cleanup job from CreateMaintainer() enabled

EnableJobForCleaningInactiveCaches is false on a raw maintainer instance before the timer starts. The usual zoneTree.CreateMaintainer() path starts the cleanup job by default.

Useful settings:

maintainer.MaximumReadOnlySegmentCount = 32;
maintainer.ThresholdForMergeOperationStart = 500_000;
maintainer.EnableJobForCleaningInactiveCaches = true;
maintainer.BlockCacheLifeTime = TimeSpan.FromMinutes(1);
maintainer.InactiveBlockCacheCleanupInterval = TimeSpan.FromSeconds(30);

Before shutdown, wait for background work if needed:

maintainer.WaitForBackgroundThreads();

To move current in-memory data toward disk on demand:

maintainer.EvictToDisk();
maintainer.WaitForBackgroundThreads();

Manual Maintenance

Advanced applications can use the maintenance API directly to move mutable segments and start merge operations.

Manual control is useful when:

  • you want maintenance only during specific windows,
  • you are building a storage service with its own scheduler,
  • you need predictable resource usage,
  • you want to coordinate maintenance with backups.

Core maintenance operations include:

  • MoveMutableSegmentForward,
  • StartMergeOperation,
  • StartBottomSegmentsMergeOperation,
  • TryCancelMergeOperation,
  • TryCancelBottomSegmentsMergeOperation,
  • SaveMetaData.

Memory And Maintenance

Write-side memory depends heavily on how quickly frozen segments are moved to disk. If memory grows during heavy writes, check:

  • mutable segment max item count,
  • number of read-only segments,
  • maintainer activity,
  • merge throughput,
  • value size.

See memory usage.

Iterators Can Pin Segments

Long-lived iterators can keep segments alive. Dispose iterators when scans finish.