Replication Public API Reference
This page documents Orleans.Lattice.Replication 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 api.md, and llms.txt lists every page.This document is the contract for the public Orleans.Lattice.Replication surface. It describes behaviour in caller-visible terms: what each public type is for, which members matter to callers, and where to find the operational detail. It does not name internal grains or implementation classes that are not public. For the how, follow the topic cross-references in each section.
Setup
Install the packages you need:
dotnet add package Orleans.Lattice.Replication
dotnet add package Orleans.Lattice.Replication.Grpc
dotnet add package Orleans.Lattice.Storage.AzureTable
Import the replication namespace:
using Orleans.Lattice.Replication;
Register replication on an Orleans silo, then bind a transport. The gRPC package is the canonical live-push and remote-snapshot binding. See Configuration for every option and named-options behaviour.
using Orleans.Lattice.Replication;
using Orleans.Lattice.Replication.Grpc;
siloBuilder.AddLatticeReplication(opts =>
{
opts.ClusterId = "site-a";
opts.ReplicatedTrees = new Dictionary<string, LatticeMergeMode>(StringComparer.Ordinal)
{
["orders"] = LatticeMergeMode.LwwRegister,
};
opts.ReplicationPeers = new[] { "site-b" };
});
siloBuilder.Services.AddLatticeReplicationGrpc(grpc =>
{
grpc.Peers["site-b"] = new Uri("https://site-b.example:5001");
});
On the receiving HTTP pipeline, map the gRPC endpoints with MapLatticeReplicationGrpc. The gRPC binding is a separate package with its own docs - see Orleans.Lattice.Replication.Grpc and Transport Security.
Registration and DI
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
LatticeReplicationServiceCollectionExtensions |
static class | Registers replication services on an Orleans silo. | AddLatticeReplication, ConfigureLatticeReplication, ReplicateLatticeSystemTrees, AddLatticeAutoSharedDictionary, AddLatticeReplicationHealthCheck, AddWalSaturationReceiverFlowControl, AddLatticeSagaParticipant |
LatticeReplicationSecurityServiceCollectionExtensions |
static class | Registers shared-secret sources and security options. | AddLatticeReplicationSecrets, AddLatticeReplicationSecretsFromConfiguration, ConfigureLatticeReplicationSecurity |
AddLatticeReplication wires the replication pipeline and default no-op transport. A production deployment replaces the transport by adding the gRPC binding or a custom IReplicationTransport. ConfigureLatticeReplication follows .NET named options: the overload without a tree name sets global defaults; the treeName overload overrides a single tree.
The gRPC transport and the Azure Table WAL backend ship as separate packages with their own API references - see Orleans.Lattice.Replication.Grpc (AddLatticeReplicationGrpc, MapLatticeReplicationGrpc, LatticeReplicationGrpcOptions) and Orleans.Lattice.Storage.AzureTable (AddAzureTableWalStorage, AzureTableWalStorageProvider, AzureTableWalStorageOptions).
Replication modes and configuration types
See Replication Modes and Replication Drivers.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
LatticeReplicationOptions |
class | Main replication options. | Identity, tree opt-in, WAL, apply, ship, bootstrap, compression, wire-version, and remediation properties. See Configuration. |
FallOffLogDecision |
readonly record struct | Result of a receiver-side fall-off check: whether the receiver's per-origin high-water mark is older than the sender's oldest retained WAL entry, and whether a bootstrap was triggered or absorbed. | FellOffLog, LocalHighWaterMark, BootstrapTriggered, Suppressed |
OperatorReseedDecision |
readonly record struct | Result of an operator snapshot request. | Triggered, LastRequestedAt, RetryAfter |
ReplicatedTrees is the static opt-in map from tree id to LatticeMergeMode. Trees not in the map do not ship unless runtime replication config is enabled (AddLatticeReplication(..., enableRuntimeConfig: true)), in which case a tree enabled at runtime through ILatticeReplicationConfigAuthority replicates too - see Runtime Replication Config. KeyFilter and KeyPrefixes narrow which keys the shipper emits from opted-in trees; snapshot exports do not apply them.
Change feed
See Change Feed.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IChangeFeed |
interface | Cursor-driven, pull-based read of locally-authored WAL entries for a tree. | Subscribe(string, HybridLogicalClock, bool, CancellationToken), Subscribe(string, ChangeFeedCursor, bool, CancellationToken), GetCurrentCursorAsync |
ChangeFeedCursor |
readonly struct | Per-partition offset cursor for lossless WAL consumption. | Initial, constructor from offsets, GetOffsetForPartition, PartitionOffsets |
The feed is for locally-authored writes. Entries installed by inbound apply are visible in local state but are not re-emitted through this feed; consumers that need to observe receiver-side installs should decorate IReplicationApplier. The HybridLogicalClock overload is a source-compatible shim: the default implementation ignores its cursor and reads every partition from the start, so resume with the ChangeFeedCursor overload.
Transport and wire envelope
See Transport, Orleans.Lattice.Replication.Grpc, and Wire Format.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IReplicationTransport |
interface | Sends a batch to a peer cluster and returns the receiver ack. | SendAsync(ReplicationBatch, CancellationToken) |
ReplicationBatch |
readonly record struct | Logical outbound batch routing metadata plus payload. | TargetClusterId, TreeName, OriginClusterId, Payload, Envelope, EncodedEnvelope |
ReplicationBatchEnvelope |
readonly record struct | Decoded transport envelope. | WireVersion, TreeName, OriginClusterId, Entries; the CurrentVersion and CurrentMinorVersion constants |
ReplicationBatchEncodedEnvelope |
readonly record struct | Pre-encoded envelope used by transport implementations. | Header (an EncodedBatchHeader), EncodedEntries (the pre-encoded entry segments) |
ReplicationAck |
readonly record struct | Receiver acknowledgement and hints. | Accepted, HighestAppliedHlc, BlockedAtHlc, the flow-control hints SuggestedBatchSize / PauseForMs, and the capability hints SupportedWireVersion, AdvertisedDictionaryIds, AdvertisedDictionaries |
EncodedBatchHeader |
readonly record struct | Fixed 32-byte wire framing header. | Magic, WireVersion, OriginClusterIdHash, EntryCount, BatchSequence, AtomicBatchSpanCount, Mode, Compression, and the in-process DictionaryId (carried in the compressed tail, not the fixed header) |
A transport must be idempotent at the batch boundary: sender retries can redeliver a batch, and the receiver deduplicates by exact (origin, hlc, key, op) record identity. The gRPC binding that implements this seam (LatticeReplicationGrpcOptions and the registration helpers) is documented in Orleans.Lattice.Replication.Grpc.
Replication apply
See Replication Apply and Deltas.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IReplicationApplier |
interface | Applies inbound WAL records to the local tree. | ApplyAsync, ApplyBatchAsync |
ApplyResult |
readonly record struct | Apply outcome and high-water-mark visibility. | Applied, HighWaterMark, Deferred (the batch was held back by an inbound receive fence and must be retried) |
IReplicationLocalVcSeeder |
interface | Rebuilds a tree's local vector clock from the vector-clock slots on its values after an intra-cluster snapshot restore, so inbound dependency checks do not run against a zeroed vector. A no-op for a non-replicated tree. | SeedFromTreeAsync(string, CancellationToken) returning LocalVcSeedReport |
LocalVcSeedReport |
readonly record struct | Observable result of local version-vector seeding. | TreeName, Frontier, EntriesScanned, SeedApplied |
ApplyAsync preserves the source cluster HLC and origin id. ApplyBatchAsync is the preferred batch seam because implementations can collapse high-water-mark updates and drain causal buffers once per batch. Its default interface implementation applies each entry through ApplyAsync in order and aggregates the results - Applied when any entry applied, the pointwise-maximum HighWaterMark, and Deferred when any entry was deferred - so a custom applier that implements only ApplyAsync still has a receive-fence deferral re-shipped by the sender rather than acknowledged past.
Bootstrap and snapshots
See Snapshot Bootstrap, Auto-Bootstrap, and Automatic Drift Remediation.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
ISnapshotProvider |
interface | Exports a streaming as-of-HLC view of a tree. | ExportAsync(string, HybridLogicalClock, CancellationToken), source-cluster overload, range-scoped overload |
IBootstrapSnapshotSource |
interface | Marker and specialization for bootstrap snapshot sources. | Inherits ISnapshotProvider |
ILatticeBootstrapCoordinator |
interface | Drives receiver-side snapshot bootstrap. | GetStateAsync, GetStatusAsync, BootstrapAsync |
LatticeBootstrapState |
enum | Bootstrap state-machine state. | Idle, RequestingSnapshot, ApplyingSnapshot, IncrementalHandoff, LiveIncremental, Failed |
BootstrapCoordinatorStatus |
readonly record struct | Observable bootstrap phase and source cluster. | Phase, SourceClusterId |
SnapshotEntry |
readonly record struct | One row in a snapshot stream. | Key, value, timestamp, prepared/tombstone flags, transaction id, source-shard index, atomic-batch size/index, TTL expiry, delta, and merge-mode slots |
SnapshotStream |
sealed class | Async snapshot stream wrapper. | TreeName, AsOfHlc, CausalStableFrontier, Entries |
IRemoteSnapshotTransport |
interface | Fetches snapshot metadata and stream items from a remote cluster. | GetMetadataAsync, RequestSnapshotAsync |
LatticeRemoteSnapshotService |
sealed class | Public remote snapshot transport service. | Implements IRemoteSnapshotTransport |
RemoteSnapshotProvider |
sealed class | Snapshot provider backed by a remote transport. | Implements IBootstrapSnapshotSource |
RemoteSnapshotMetadata |
readonly record struct | Remote snapshot metadata response. | TreeName, SourceClusterId, AsOfHlc, CausalStableFrontier |
RemoteSnapshotMetadataRequest |
readonly record struct | Remote metadata request. | TreeName, SourceClusterId, FromAsOfHlc (a strict upper-bound filter; HybridLogicalClock.Zero disables it) |
RemoteSnapshotStreamItem |
readonly record struct | One item returned by remote snapshot streaming. | Entry (one SnapshotEntry per streamed message) |
LatticeBootstrapTransientFaultClassifier |
static class | Default transient-fault classifier for the receiver-side bootstrap drain: timeouts, HTTP / socket / IO faults, retryable gRPC statuses (Unavailable, DeadlineExceeded, Aborted), and an expired Orleans enumeration session retry with bounded backoff; anything else pivots the bootstrap to Failed. |
IsTransient(Exception) |
Bootstrap applies snapshot entries through the same public apply seam as incremental replication, then hands off to live shipping at the snapshot frontier.
Dead-letter queue
See Dead-Letter Queue.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
ILatticeReplicationDeadLetters |
interface | Lists, discards, and replays quarantined apply failures. | ListAsync, CountAsync, DiscardAsync, ReplayAsync |
DeadLetterEntry |
readonly record struct | Retained failed apply entry. | EntryId, Entry, FailureReason, RetryCount, EnqueuedAtTicks |
Replay runs the parked entry through the canonical applier and removes it on any non-throwing, non-deferred return, whether or not the entry applied. A replay that an in-flight coordinated restore's receive fence defers leaves the entry parked, as does a thrown exception (see Replay semantics).
Operator, admin, and WAL introspection
See Auto-Bootstrap, WAL, and Observability.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
ILatticeReplicationAdmin |
interface | Operator-driven snapshot re-seed controls. | RequestSnapshotAsync, ForceRequestSnapshotAsync |
ILatticeWalIntrospection |
interface | Sender-side view of retained WAL availability. | GetOldestAvailableHlcAsync, GetOldestAvailableHlcByOriginAsync |
ILatticeFallOffLogDetector |
interface | Receiver-side check of the local per-origin high-water mark against a sender's oldest retained WAL entry; on fall-off it records the metric and, when AutoBootstrapOnFallOffLog is on, starts a bootstrap. |
CheckAndTriggerAsync returning FallOffLogDecision |
The admin surface rate-limits routine re-seeds through OperatorReseedMinInterval; the force method bypasses that rate limit for disaster-recovery and scheduled re-seed scenarios.
Cursor and GC surface
Public cursor state is represented by ChangeFeedCursor (per-partition offsets for change-feed consumers) and by the core IWalCursorRegistry, into which each per-peer shipper reports its durable ship cursor and the blocked floor the receiver stamps on each ack; ILatticeWalIntrospection reports how far back the retained WAL reaches. WAL retention is controlled through LatticeReplicationOptions.WalRetention and MaintenanceGcInterval; the public contract is that consumers advance cursors and GC trims only what policy permits. See WAL.
Encoder and wire-version surface
See Wire Format.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IReplicationBatchEncoder |
interface | Encodes and decodes replication batches. | ContentType, CurrentWireVersion, Encode, Decode, and the default-implemented EncodeFraming / TryDecodeFraming |
EncodedBatchHeader |
readonly record struct | Fixed frame header. | WriteTo, ReadFrom, HashClusterId, and the WireSize (32), MagicValue, and CurrentWireVersion (currently 5) constants |
WireVersionNegotiation |
static class | Computes an effective wire version from local and peer capabilities. | Negotiate |
WireVersionNegotiationResult |
readonly record struct | Negotiation result. | EffectiveWireVersion, DowngradeActive, PeerCapabilityKnown |
WireVersionDownEncoder |
static class | Down-stamps frames for older receivers. | MinimumDownEncodableWireVersion, EnsureDownEncodable, PrepareHeader |
ReplicationTypeAliases |
static class | Centralises the stable olr.-prefixed Orleans serialization aliases of the replication wire types. |
None: every alias constant is internal, so the class exposes no public members |
Use this surface when writing a transport or compatibility shim. Most application hosts only configure the related options in Configuration.
Metrics types
See Observability and Health Check.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
LatticeReplicationMetrics |
static class | Meter, counter, histogram, and tag names for replication telemetry. | Public constants and instrument names |
ReplicationPeerStats |
class | Per-peer metrics accumulator. | RecordBacklog, RecordInFlight, RecordSuccess, RecordError, RecordInboundSuccess, RecordInboundError, Snapshot |
ReplicationPeerSnapshot |
readonly record struct | Point-in-time per-peer telemetry. | Tree, Peer, EntriesBehind, BytesBehind, ConsecutiveErrors, LastContactSeconds, Direction, InFlight |
ReplicationContactDirection |
enum | Direction tag for peer contact. | Outbound, Inbound |
WireVersionNegotiationState |
class | Runtime wire-version telemetry state. | Record, Snapshot |
WireVersionNegotiationSnapshot |
readonly record struct | Wire-version telemetry snapshot. | Tree, Peer, NegotiatedVersion, DowngradeActive, PeerCapabilityKnown |
LatticeReplicationHealthCheckOptions |
sealed class | Health-check thresholds. | EntriesBehind, LastContactSeconds, ConsecutiveErrors, UnhealthyAfter, InboundDegradedAfter, InboundCriticalAfter; the nested LongTier / DoubleTier threshold records; the matching Default* values (DefaultEntriesBehind, DefaultLastContactSeconds, DefaultConsecutiveErrors, DefaultUnhealthyAfter, DefaultInboundDegradedAfter, DefaultInboundCriticalAfter); DefaultName |
Flow control
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IReceiverFlowControlPolicy |
interface | Maps receiver state to ack hints. | EvaluateAsync |
ReceiverFlowControlContext |
readonly record struct | Input to a flow-control policy. | TreeName, OriginClusterId, EntryCount, ApplyDurationMs |
ReceiverFlowControlHint |
readonly record struct | Suggested sender limits. | SuggestedBatchSize, PauseForMs, None |
NoOpReceiverFlowControlPolicy |
sealed class | Policy that returns no hints. | Instance, EvaluateAsync |
WalSaturationReceiverFlowControlOptions |
sealed class | Tunes how the throttled and saturated WAL states map to hints (a healthy WAL returns no hint). | ThrottledBatchRatio, ThrottledPauseMs, SaturatedBatchSize, SaturatedPauseMs, and the matching DefaultThrottledBatchRatio, DefaultThrottledPauseMs, DefaultSaturatedBatchSize, DefaultSaturatedPauseMs constants |
WalSaturationReceiverFlowControlPolicy |
sealed class | Built-in WAL-saturation-aware policy. | EvaluateAsync |
Flow-control hints are advisory. The sender clamps its next batch size and pause to the ack it receives, but a receiver must still tolerate redelivery and retries.
Anti-entropy and remediation
See Automatic Drift Remediation, digest probes, Merkle walks, leaf re-replay, bootstrap fallback, and remediation guards.
| Type | Kind | Purpose |
|---|---|---|
IReplicationDigestProbeTransport |
interface | Transport seam for the read-only peer RPCs: ProbeDigestAsync, ProbeMerkleWalkAsync, GetPeerHighWaterMarkAsync, plus the shipping-side ExchangeContentManifestAsync (payload elision) and PullCompressionDictionaryAsync. Every member except ProbeDigestAsync has a default implementation (an unavailable or not-supported response, or HybridLogicalClock.Zero for the watermark read), so a custom transport implements only what it can answer. |
DigestProbeComparer |
static class | Compares a local digest with a peer's digest probe response (Compare). |
DigestProbeOutcome |
enum | Digest comparison outcome: Match, Mismatch, VersionSkew, RemoteUnavailable. |
DigestProbeRequest, DigestProbeResponse |
readonly record structs | Digest probe request and response. |
ContentManifestRequest, ContentManifestResponse, ContentManifestEntry |
readonly record structs | Content-hash manifest exchange shapes used by payload elision. |
MerkleWalkProbeRequest, MerkleWalkProbeResponse, MerkleWalkOutcome |
readonly record structs | Merkle walk request, response, and outcome. |
MerkleWalkAbortReason |
enum | Reason a Merkle walk stopped before repair: None, DepthCapExceeded, ByteBudgetExceeded, RemoteUnavailable, VersionSkew. |
PeerHighWaterMarkRequest, PeerHighWaterMarkResponse |
readonly record structs | High-water-mark probe shapes. |
LeafReReplayRange, LeafReReplayOutcome |
readonly record structs | Targeted leaf replay range and result. |
LeafReReplaySkipReason |
enum | Reason targeted replay was skipped: None, Disabled, RangeEmpty, WalTrimmed. |
BootstrapFallbackOutcome |
readonly record struct | Result of snapshot fallback repair. |
BootstrapFallbackSkipReason |
enum | Reason snapshot fallback was skipped: None, Disabled, RangeEmpty, Empty. |
RemediationGuard |
sealed class | Budget and circuit-breaker guard for automatic repair. |
RemediationDisabledReason |
enum | Reason automatic remediation is disabled: OptOut, BudgetExhausted, CircuitOpen. |
These types are public so custom transports and operators can integrate with the opt-in anti-entropy stack without depending on implementation details.
Compression-dictionary negotiation
See Compression and Wire Format.
| Type | Kind | Purpose |
|---|---|---|
SharedDictionaryNegotiation |
static class | Computes dictionary negotiation decisions. |
SharedDictionaryNegotiationResult |
readonly record struct | One negotiation decision. |
SharedDictionaryNegotiationState |
sealed class | Tracks peer dictionary state. |
SharedDictionaryNegotiationSnapshot |
readonly record struct | Observable dictionary negotiation state. |
AdvertisedCompressionDictionary |
readonly record struct | Dictionary advertised by a peer. |
CompressionDictionaryAdvertisement |
static class | Builds the (id, fingerprint) set a receiver advertises on its acks. |
CompressionDictionaryFingerprint |
static class | Computes dictionary fingerprints. |
CompressionDictionaryConvergence |
static class | Pulls and installs the peer-advertised dictionaries the local provider does not hold (ConvergeAsync). |
CompressionDictionaryPullRequest, CompressionDictionaryPullResponse |
readonly record structs | Pull protocol for missing dictionaries. |
Dictionary negotiation is opt-in and separate from the default dict-less Zstandard framing compression.
Topology and peer membership
See Replication Drivers.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IReplicationTopology |
interface | Runtime source of peer cluster membership. | CurrentPeers, Subscribe |
PeerChanged |
readonly record struct | Membership change notification. | PeerClusterId, Kind |
PeerChangeKind |
enum | Kind of membership change. | Added, Removed |
The default topology projects LatticeReplicationOptions.ReplicationPeers. Register a custom singleton IReplicationTopology before replication setup to source membership from a service registry or configuration provider.
Security
See Transport Security.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
ILatticeReplicationSecretSource |
interface | Supplies shared secrets for peer authentication. | GetOutboundSecretAsync, GetAcceptedSecretsAsync |
ConfigurationBindingSecretSource |
sealed class | Secret source backed by configuration. | Constructor taking the bound IConfiguration section; GetOutboundSecretAsync, GetAcceptedSecretsAsync |
LatticeReplicationAcceptedSecrets |
sealed class | Accepted shared-secret set. | Secrets, Version, Empty |
LatticeReplicationSecurityOptions |
sealed class | Shared-secret authentication options. | RequireAuthentication, BindCredentialToOriginCluster, SecretRefreshInterval, ScanConfigurationForSecrets |
LatticeReplicationEnvironmentVariables |
static class | Environment-variable names for replication secrets. | Prefix, Secret, AcceptedSecrets, PeerSecretPrefix, AllowSourceTreeSecrets |
LatticeReplicationSharedSecret |
static class | Shared-secret generation and validation helpers. | MinimumLength, Generate, IsWellFormed, FixedTimeEquals |
The gRPC binding requires HTTPS endpoints unless AllowPlaintextEndpoints is enabled. Shared-secret authentication is configured through the security extension methods above; origin binding (BindCredentialToOriginCluster) is on by default - see Configuration.
Cross-cluster saga participation
The saga service-provider interfaces let a host join the coordinated cross-cluster commit protocol that backs a fleet-wide restore. Register an implementation with AddLatticeSagaParticipant. See Coordinated restore.
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
ISagaParticipant |
interface | Service-provider interface a host implements to take part in a cross-cluster saga: it votes on prepare, then applies or discards its staged work. | PrepareAsync, CommitAsync, AbortAsync, GetStatusAsync |
ISagaControlChannel |
interface | Outbound control channel the coordinator uses to drive a named peer cluster through the saga phases. | PrepareAsync, CommitAsync, AbortAsync, GetStatusAsync (each taking the target clusterId) |
ISagaPeerAuthorizer |
interface | Fail-closed gate deciding whether an inbound saga control request from a claimed origin cluster is accepted. | IsAuthorizedAsync(string? originClusterId, CancellationToken) |
ILatticeSagaControlHandler |
interface | Server-side delegation seam for the inbound saga control channel. The gRPC saga service validates the request and enforces peer authorization, then delegates each imperative RPC to this handler. | PrepareAsync, CommitAsync, AbortAsync, GetStatusAsync (each taking a SagaControlRequest) |
NoParticipantSagaControlHandler |
sealed class | The transport-only fallback handler the gRPC binding registers with TryAddSingleton. AddLatticeReplication registers its own durable handler - which routes each inbound saga call to the per-saga participant - with TryAddSingleton too, so on a silo that calls it before the gRPC binding (as the setup above does) the durable handler is the effective one and this class is never used. Holds no participant state: it reports SagaPhase.None for every saga and votes SagaVote.Abort on prepare, because a participant that cannot durably prepare must not let the coordinator commit. |
PrepareAsync, CommitAsync, AbortAsync, GetStatusAsync |
SagaPhase |
enum | The durable phase a participant reports for a saga. | None = 0, Prepared = 1, Committed = 2, Aborted = 3 |
SagaVote |
enum | A participant's prepare-phase vote. | None = 0, Commit = 1, Abort = 2 |
SagaControlRequest |
readonly record struct | The request every saga control call carries. | SagaId, TargetTree, ManifestId, CoordinatorClusterId, SetId |
SagaControlResponse |
readonly record struct | A participant cluster's answer to a saga control call. | SagaId, Phase, Vote, Detail |
SagaParticipantPrepareResult |
readonly record struct | An ISagaParticipant prepare vote. |
Vote, Detail |
LatticeSystemTreeNames |
static class | The reserved system-tree names the replication package owns. | MembershipGroups, MembershipEdges, AuthPolicy, AuthAudit, ReplicationConfig, ReplicationConfigMapKey, BuildEnrolmentMap, BuildReplicationConfigEnrolmentMap |
Tenant isolation and runtime configuration authority
| Type | Kind | Purpose | Key public members |
|---|---|---|---|
IReplicationTenantIsolationGate |
interface | Evaluates whether an inbound replicated entry is admissible for the tenant its tree id names - the tenant must exist, be resident in this region, and be active - so a peer can never widen tenant or region scope. The replication package's default gate is inactive; the tenancy add-on supplies a real gate. | IsActive, EvaluateAsync(string, CancellationToken) returning ReplicationTenantIsolationDecision |
ReplicationTenantIsolationDecision |
enum | The gate's verdict. | Admit = 0, RejectUnknownTenant = 1, RejectOutOfRegion = 2, RejectSuspendedTenant = 3 |
ILatticeReplicationConfigAuthority |
interface | The engine-level authoring seam for runtime per-tree replication config: authors enable / disable onto the sys-replication-config tree and reports the reconciled per-tree status (the runtime tree unioned with the static ReplicatedTrees map). It performs no authorization - the control facade authorizes first. Registered by AddLatticeReplication(..., enableRuntimeConfig: true). See Runtime configuration. |
EnableReplicationAsync, DisableReplicationAsync, GetTreeStatusAsync, GetAllTreeStatusesAsync |
LatticeReplicationEnableResult, LatticeReplicationDisableResult |
readonly record structs | Authority outcomes. | TreeId, Mode, AlreadyEnabled, BootstrapRequested / TreeId, AlreadyDisabled |
LatticeReplicationTreeStatus |
readonly record struct | One tree's reconciled replication status. | TreeId, Enabled, Mode, Ambiguous, Source |
LatticeReplicationEnrollmentSource |
enum | Which enrollment source puts a tree's status in force. | Runtime = 0, Static = 1, RuntimeAndStatic = 2 |
LatticeReplicationConfigEntry |
sealed class | One tree's CRDT config entry in the sys-replication-config OR-Map: a disable-wins enablement flag plus a multi-value merge-mode register, so concurrent divergent modes stay detectable. |
Enabled (RwFlag), Mode (MvRegister), IsEnabled, HasAmbiguousMode, Modes, IsBottom, TryGetMode, Enable, Disable, SetMode, MergeFrom, Clone, and the static EncodeMode / DecodeMode |
ILatticeReplicationPreconditionValidator |
interface | Validates the runtime preconditions a tree must meet to replicate under a merge mode (today: a flag mode requires a configured local replica id). Shared by the boot-time validation of statically declared trees and the runtime enable path. | Validate(string, LatticeMergeMode) returning LatticeReplicationPreconditionResult |
LatticeReplicationPreconditionResult |
readonly record struct | A precondition verdict. | IsSatisfied, FailureReason, Satisfied, Rejected(string) |
LatticeReplicationModeChangeRejectedException |
exception | Thrown when an enable would change the merge mode of an already-enabled tree, or the tree's mode is currently ambiguous. | TreeId, RequestedMode, CurrentMode, CurrentModeAmbiguous |
LatticeReplicationPreconditionFailedException |
exception | Thrown when a replication precondition fails. | TreeId, RequestedMode |
Azure Table WAL durability
The durable Azure Table WAL backend ships as the separate Orleans.Lattice.Storage.AzureTable package. Use AddAzureTableWalStorage when the replication WAL must survive silo restarts and support production retention, bootstrap, and replay windows. Its public surface (AzureTableWalStorageProvider, AzureTableWalStorageOptions, and the retry policies) and configuration are documented in Orleans.Lattice.Storage.AzureTable - see its API Reference and Configuration. For the core WAL provider seam, see WAL and core WAL Storage Providers.