{"record":{"id":"73566b13136f1bfd","repo":"dotnet/orleans","slug":"failed-to-read-azure-storage-table-tablename","errorCode":null,"errorMessage":"Failed to read Azure Storage table {TableName}","messagePattern":"Failed to read Azure Storage table (.+?)","errorType":"exception","errorClass":"OrleansException","httpStatus":null,"severity":"error","filePath":"src/Azure/Shared/Storage/AzureTableDataManager.cs","lineNumber":552,"sourceCode":"                {\n                    pageCount++;\n                    results.EnsureCapacity(results.Count + page.Values.Count);\n                    foreach (var value in page.Values)\n                    {\n                        results.Add((value, value.ETag.ToString()));\n                    }\n                }\n\n                return (results, pageCount > 1);\n            }\n            catch (Exception exc) when (exc is not OperationCanceledException)\n            {\n                if (!AzureTableUtils.TableStorageDataNotFound(exc))\n                {\n                    LogWarningReadTable(Logger, exc, TableName);\n                }\n\n                throw new OrleansException($\"Failed to read Azure Storage table {TableName}\", exc);\n            }\n            finally\n            {\n                CheckAlertSlowAccess(startTime, operation);\n            }\n        }\n\n        /// <summary>\n        /// Inserts a set of new data entries into the table.\n        /// Fails if the data does already exists.\n        /// </summary>\n        /// <param name=\"collection\">Data entries to be inserted into the table.</param>\n        /// <returns>Completion promise for this storage operation.</returns>\n        public async Task BulkInsertTableEntries(IReadOnlyCollection<T> collection)\n        {\n            const string operation = \"BulkInsertTableEntries\";\n            if (collection == null) throw new ArgumentNullException(nameof(collection));\n            if (collection.Count > this.StoragePolicyOptions.MaxBulkUpdateRows)","sourceCodeStart":534,"sourceCodeEnd":570,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/Azure/Shared/Storage/AzureTableDataManager.cs#L534-L570","documentation":"Thrown as an OrleansException that wraps the original exception when an Azure Table Storage read (ReadTableEntries/ReadAllEntries) fails and the failure is not classified as a 'data not found' condition. The original exception is preserved as the InnerException and a warning is logged via LogWarningReadTable before the rethrow. The finally block still runs CheckAlertSlowAccess, so slow-read metrics are recorded even on failure.","triggerScenarios":"Any exception other than OperationCanceledException occurs inside the table-read try block of AzureTableDataManager, and AzureTableUtils.TableStorageDataNotFound(exc) returns false. This covers HTTP 5xx from the storage account, authentication/authorization failures, throttling (429), DNS/network errors, or SDK-level RequestFailedException instances whose status is not in the 'not found' set.","commonSituations":"Expired or rotated storage account keys, wrong connection string, firewall/service-endpoint blocking the silo, hitting Azure Table request-rate throttling under load, transient regional outage, or using an emulator that returned an unexpected status. Also seen after renaming the deployment with a mismatched ClusterId/ServiceId so the table does not exist under the expected name.","solutions":["Inspect the wrapped InnerException and its Status/ErrorCode (RequestFailedException) to identify the real HTTP cause before changing anything.","Verify the Azure Storage connection string and that the identity used has Table Data Contributor permissions; test with az storage table list or Storage Explorer using the same credentials.","For transient statuses (5xx, 429, timeout), rely on the configured AzureStoragePolicyOptions retry policy / transient error detector; confirm the silo's network route to the account endpoint is open.","If the table genuinely does not exist, allow the membership/storage subsystem to create it (ensure the configured initializer runs) or pre-create the table.","Check Orleans logs for the LogWarningReadTable entry just before this throw to see the exact failure."],"exampleFix":"// before: rely on default policy only, surface the raw OrleansException\ntry { await tableManager.ReadAll(); }\ncatch (OrleansException) { /* swallow */ }\n\n// after: unwrap and react to the real storage failure\ntry { await tableManager.ReadAll(); }\ncatch (OrleansException ex) when (ex.InnerException is RequestFailedException rfe)\n{\n    logger.LogError(rfe, \"Table read failed status={Status} code={ErrorCode}\", rfe.Status, rfe.ErrorCode);\n    throw;\n}","handlingStrategy":"retry","validationCode":"// No caller-side validation prevents transient storage failures;\n// configure the retry policy instead.\nservices.AddAzureStoragePolicyOptions(o =>\n{\n    o.MaxBulkUpdateRows = 100;\n    // ensure a transient-fault retry/detector is configured\n});","typeGuard":null,"tryCatchPattern":"try { await tableManager.ReadAll(); }\ncatch (OrleansException ex) when (ex.InnerException is RequestFailedException rfe && (rfe.Status >= 500 || rfe.Status == 429))\n{\n    // transient: log + let the configured retry policy, or rethrow for higher-level retry\n    throw;\n}\ncatch (OrleansException ex)\n{\n    // non-transient (auth, not found, schema): surface to ops\n    throw;\n}","preventionTips":["Monitor Azure Storage throttling and scale the account/partitioning","Rotate storage keys through the connection string before expiry","Keep the silo's egress to the storage account endpoint open"],"tags":["azure-storage","table-storage","transient","io-error","network"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}