dotnet/orleans · error · OrleansException
Failed to read table {tableName}: {exc.Message}
Error message
Failed to read table {tableName}: {exc.Message} What it means
Thrown by the DynamoDB read/scan path when any exception escapes the paged ScanAsync loop while reading a table. The library logs the underlying exception and re-throws it wrapped in a generic OrleansException so callers see a single error type for arbitrary DynamoDB read failures. The inner exception carries the real cause.
Source
Thrown at src/AWS/Shared/Storage/DynamoDBStorage.cs:866
}
}
if (response.LastEvaluatedKey == null || response.LastEvaluatedKey.Count == 0)
{
break;
}
else
{
exclusiveStartKey = response.LastEvaluatedKey;
}
}
return resultList;
}
catch (Exception exc)
{
LogWarningFailedToReadTable(_logger, exc, tableName);
throw new OrleansException($"Failed to read table {tableName}: {exc.Message}", exc);
}
}
/// <summary>
/// Crete or replace multiple entries in a DynamoDB table (Batch put)
/// </summary>
/// <param name="tableName">The name of the table to search for the entry</param>
/// <param name="toCreate">List of key values for each entry that must be created or replaced in the batch</param>
/// <returns></returns>
public Task PutEntriesAsync(string tableName, IReadOnlyCollection<Dictionary<string, AttributeValue>> toCreate)
{
LogTracePutEntries(_logger, tableName);
if (toCreate == null) throw new ArgumentNullException(nameof(toCreate));
if (toCreate.Count == 0)
return Task.CompletedTask;
View on GitHub (pinned to fca799fa70)
Solutions
- Inspect the inner Exception (exc.Message is included in the text) to identify throttling, auth, or ResourceNotFound.
- If throttling: raise read capacity or switch the table to PAY_PER_REQUEST / on-demand.
- If the table is missing, recreate it (or re-run Init so the provider recreates it).
- For transient errors, rely on Orleans' built-in retries or add a caller-side retry policy around the read.
Example fix
// The exception wraps the real cause; surface the inner exception for diagnosis
// before
try { await storage.Read...; } catch (OrleansException e) { log.Error(e.Message); }
// after
try { await storage.Read...(); }
catch (OrleansException e) when (e.InnerException is ProvisionedThroughputExceededException)
{
// raise capacity or switch to on-demand, then retry
} Defensive patterns
Strategy: try-catch
Validate before calling
// Pre-flight: confirm the table exists and has read capacity headroom before heavy reads
var desc = await DescribeExistingTableAsync(tableName);
if (desc is null) throw new InvalidOperationException($"Table {tableName} does not exist"); Type guard
static bool IsReadableFailure(Exception inner) => inner switch
{
ProvisionedThroughputExceededException => true,
ResourceNotFoundException => true,
AmazonDynamoDBException => true,
_ => false
}; Try / catch
try { await storage.ReadAllAsync(...); }
catch (OrleansException ox) when (ox.InnerException is ProvisionedThroughputExceededException)
{
_logger.LogWarning("DynamoDB read throttled; raising read capacity or retrying");
throw;
} Prevention
- Provision enough read capacity (or use on-demand) for your scan workload.
- Inspect the inner exception to distinguish throttling from missing-table/auth errors.
- Avoid full-table scans; use Query with a partition key when possible.
- Add a retry policy with backoff/jitter around read-heavy paths.
When it happens
Trigger: Produced during a paginated consistent-read Scan used by clustering/persistence/reminders lookups when ScanAsync throws. Triggered by DynamoDB throttling (ProvisionedThroughputExceededException), a missing table (ResourceNotFoundException surfaced as inner), network/timeout errors, auth errors, or item-size/expression errors.
Common situations: Read capacity exceeded on a provisioned table; transient network blips to DynamoDB; expired/invalid credentials surfacing during a read; a table that was deleted while the silo was running; malformed filter expressions.
Related errors
- Request rate exceeded, wait {remainingSeconds}s before retry
- Configuration for DynamoDBGrainStorage {name} is invalid. Ta
- Configuration for DynamoDBGrainStorage {name} is invalid. Re
- Configuration for DynamoDBGrainStorage {name} is invalid. Wr
- Data too large to write to DynamoDB table. Size={dataSize} M
AI-assisted analysis of dotnet/orleans@fca799fa70 (2026-08-13).
Data as JSON: /api/errors/edf2245a3e95493a.
Report an issue: GitHub.