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

  1. Re-run DescribeTable on the named table to see its current status and any service-side error.
  2. Address the upstream cause (raise account/service quotas, stop concurrent deletes, fix throughput settings) and restart the silo so Init re-attempts.
  3. If the table is stuck FAILED, delete it and let the provider recreate it (data loss), or recreate it manually as ACTIVE.
  4. 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

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


AI-assisted analysis of dotnet/orleans@fca799fa70 (2026-08-13). Data as JSON: /api/errors/9c6d19a9776e3450. Report an issue: GitHub.