dotnet/orleans · error · InvalidOperationException
Table {tableName} has failed to reach the desired status of
Error message
Table {tableName} has failed to reach the desired status of {desiredStatus} What it means
Thrown by TableWaitOnStatusAsync after its poll loop when the table exited the 'while' status but did not reach the desired status. The loop keeps waiting while the table is in whileStatus (e.g. CREATING/UPDATING) and then asserts the final status equals desiredStatus (typically ACTIVE); a transition to any other status (e.g. FAILED, DELETING) trips this guard.
Source
Thrown at src/AWS/Shared/Storage/DynamoDBStorage.cs:428
}
private async Task<TableDescription> TableWaitOnStatusAsync(string tableName, TableStatus whileStatus, TableStatus desiredStatus, int delay = 2000, CancellationToken cancellationToken = default)
{
TableDescription ret = null!;
do
{
if (ret != null)
{
await Task.Delay(delay, cancellationToken);
}
ret = (await GetTableDescription(tableName, cancellationToken))!;
} while (ret.TableStatus == whileStatus);
if (ret.TableStatus != desiredStatus)
{
throw new InvalidOperationException($"Table {tableName} has failed to reach the desired status of {desiredStatus}");
}
return ret;
}
private async Task<TableDescription> TableIndexWaitOnStatusAsync(string tableName, string indexName, IndexStatus whileStatus, IndexStatus? desiredStatus = null, int delay = 2000, CancellationToken cancellationToken = default)
{
TableDescription ret;
GlobalSecondaryIndexDescription? index = null;
do
{
if (index != null)
{
await Task.Delay(delay, cancellationToken);
}
ret = (await GetTableDescription(tableName, cancellationToken))!;View on GitHub (pinned to fca799fa70)
Solutions
- Re-run DescribeTable on the named table to see its current status and any service-side error.
- Address the upstream cause (raise account/service quotas, stop concurrent deletes, fix throughput settings) and restart the silo so Init re-attempts.
- If the table is stuck FAILED, delete it and let the provider recreate it (data loss), or recreate it manually as ACTIVE.
- For intermittent eventual-consistency cases, simply retry silo startup after confirming the table is ACTIVE.
Example fix
// before: requesting throughput beyond account quota -> table fails to become ACTIVE opt.UseProvisionedThroughput = true; opt.ReadCapacityUnits = 100000; opt.WriteCapacityUnits = 100000; // after: use on-demand or stay within quota opt.UseProvisionedThroughput = false; // PAY_PER_REQUEST // or request a capacity increase from AWS first, then deploy
Defensive patterns
Strategy: retry
Validate before calling
// Pre-flight: confirm the table is ACTIVE (or will be created) before the silo tries to manage it
var desc = await DescribeExistingTableAsync(tableName);
if (desc is not null && desc.TableStatus != TableStatus.ACTIVE)
_logger.LogWarning("Table {Table} is {Status}; silo init may fail if it does not reach ACTIVE", tableName, desc.TableStatus); Type guard
static bool IsActiveOrWillBe(TableStatus? s) => s is null || s == TableStatus.ACTIVE;
Try / catch
try { await silo.StartAsync(); }
catch (InvalidOperationException ix) when (ix.Message.Contains("failed to reach the desired status"))
{
_logger.LogCritical("DynamoDB table did not reach ACTIVE; check quotas/concurrent deletes and retry startup");
throw;
} Prevention
- Stay within DynamoDB account quotas for provisioned throughput.
- Prevent concurrent delete operations during deployment windows.
- For intermittent cases, confirm the table is ACTIVE in the console, then retry silo startup.
- Prefer PAY_PER_REQUEST during schema changes to avoid backfill capacity issues.
When it happens
Trigger: Produced while waiting for a newly created or updated table to become ACTIVE. Triggered by the table moving from CREATING/UPDATING directly to a non-ACTIVE terminal status (UPDATE_FAILED, DELETING, ARCHIVED), by throttling/quota errors during creation, or by an out-of-band delete interleaving with the wait.
Common situations: Table creation failing due to insufficient account quota for the requested throughput; an operator deleting the table mid-create; an UpdateTable that the service rolled back; eventual-consistency hiccups returning a stale non-ACTIVE status.
Related errors
- Table {tableDescription.TableName} has a status of {tableDes
- Index {indexName} in table {tableName} has failed to reach t
- You have already created 5 polls, which is enough for anybod
- Configuration for DynamoDBGrainStorage {name} is invalid. Ta
- Configuration for DynamoDBGrainStorage {name} is invalid. Re
AI-assisted analysis of dotnet/orleans@fca799fa70 (2026-08-13).
Data as JSON: /api/errors/9c6d19a9776e3450.
Report an issue: GitHub.