Orleans.Lattice.Storage.AzureTable
This page documents Orleans.Lattice.Storage.AzureTable 9.9.0, in the documentation for Orleans.Lattice 9.9.0 (release line 9.9), built 2026-10-04. It is also published as markdown, with every table and list, at README.md, and llms.txt lists every page.Durable Azure Table Storage-backed WAL provider for Orleans.Lattice. It plugs into the public IWalStorageProvider seam so replicated WAL entries can survive silo restarts, support retention windows, and run against Azure Table Storage or Azurite.
What is it?
Orleans.Lattice.Storage.AzureTable is the optional production WAL backend for the core lattice and replication packages:
- Durable WAL storage.
AzureTableWalStorageProviderstores per-tree, per-partition WAL batches in Azure Table Storage and implements the publicIWalStorageProvidercontract. - Atomic batch append. Each append batch is made visible all-or-nothing, and its caller-assigned offsets must be dense within the batch.
- Restart recovery. Activation-time reconciliation completes an interrupted batch that contiguously extends the stored tail and removes any other, so a crash never leaves a half-committed batch behind and never lowers the tail.
- Azure SDK integration.
AzureTableWalStorageOptionscontrols authentication, table selection, retry tuning, stored-payload compression, phase-two commit behaviour, and WAL saturation-aware retries. - Drop-in registration.
AddAzureTableWalStoragereplaces the in-memory WAL backend installed by core lattice registration, and wires the durable-WAL garbage-collection stack (WAL cursor registry, leaf reporter, and WAL GC) alongside it.
Core WAL semantics, provider selection, and placement are covered in WAL Storage Providers. Replication WAL consumption is covered in Replication WAL.
Core Properties
- Per-shard ordering. Offsets are stored verbatim and read back in ascending order within each
(tree, shard)stream. - Batch atomicity. A successful append is visible as a complete batch; a rejected append leaves no visible partial batch.
- Crash recoverability. Interrupted appends are reconciled before normal reads and writes rely on the stored tail.
- Bounded backend shape. The provider refuses a batch of more than 100 entries, the Azure Table transaction limit, and each entry must fit one 64 KiB binary property after compression: an entry is never split, so a larger one is rejected by the service and fails its whole batch. Tune WAL batching and pending depth with WAL tuning.
- Operational back-pressure. Optional saturation-aware retry short-circuiting cooperates with the core WAL saturation signal.
Features
| Feature | What it gives you | Docs |
|---|---|---|
| Azure Table WAL provider | Durable IWalStorageProvider implementation for production WAL retention and restart recovery. |
Architecture |
| Authentication modes | Connection string, service URI plus token credential, service URI plus shared key, or a pre-built TableServiceClient. |
Configuration |
| Atomic append pipeline | Entry rows become readable only once their batch's commit metadata is written, in ascending offset order within each commit. | Architecture |
| Phase-two pipelining | Overlaps commit completion with later appends while preserving ordering and recovery semantics. | Configuration |
| Hot-path commit reduction | EliminateCandidateRowOnHotPath removes an extra write from the normal append path while keeping recovery safe. |
Configuration |
| Retry telemetry and tuning | Retry attempt tracking plus nullable Azure SDK retry knobs separate transient retry storms from exhausted retries. | Configuration |
| Saturation-aware retries | SaturationAwareRetryPolicy abandons Azure SDK retries while the silo reports saturated WAL pressure. |
Configuration |
| Stored payload compression | LatticeCompression.Zstd is enabled by default for larger stored WAL payloads. |
Configuration |
| Chaos coverage | Azurite-backed chaos suite validates dense offsets and monotone reads under concurrent append load. | Chaos Tests |
Quick Start
Install the package and register it on the silo that owns the WAL:
dotnet add package Orleans.Lattice.Storage.AzureTable
using Orleans.Lattice.Storage.AzureTable;
siloBuilder.AddAzureTableWalStorage(o =>
{
o.ConnectionString = "UseDevelopmentStorage=true";
o.TableName = "OrleansLatticeWal";
});
For production, configure exactly one authentication mode. For example, with a service URI and a host-supplied token credential:
using Azure.Core;
using Orleans.Lattice.Storage.AzureTable;
TokenCredential credential = null!;
siloBuilder.AddAzureTableWalStorage(o =>
{
o.ServiceUri = new Uri("https://account.table.core.windows.net");
o.TokenCredential = credential;
});
The WAL is only half of a durable tree: each leaf's state row and its snapshots live in the grain storage provider AddLattice registers, and the WAL garbage collector trims entries once a snapshot there covers them, so a production deployment pairs this provider with a durable grain storage provider too. That grain storage provider must enforce ETags on write, as Orleans' Azure Table grain storage does; see The grain storage provider must enforce ETags.
Reference
For day-to-day use and operations:
- API Reference - public types, registration helper, and extension policies.
- Configuration - every
AzureTableWalStorageOptionsknob, default, and validation rule. - Architecture - storage layout, transactional batch contract, commit pipeline, and recovery behaviour.
- Chaos Tests - the Azurite-backed chaos suite and what it proves.
Related package docs:
- Core WAL Storage Providers - core provider seam, in-memory default, provider catalogue, and WAL placement.
- Core WAL - single-cluster WAL commit and replay semantics.
- WAL tuning - batching, pending depth, shard count, and saturation envelope.
- WAL saturation signal - classifier and observer model used by saturation-aware retries.
- Replication WAL - how replication consumes retained WAL entries.
- Replication package - end-to-end cross-cluster replication overview.