{"record":{"id":"6cd0208eb225532d","repo":"dotnet/orleans","slug":"storage-state-corrupted-no-record-for-committed-s-6cd020","errorCode":null,"errorMessage":"Storage state corrupted: no record for committed state v{this.key.CommittedSequenceId}","messagePattern":"Storage state corrupted: no record for committed state v(.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"critical","filePath":"src/Azure/Orleans.Transactions.AzureStorage/TransactionalState/AzureTableTransactionalStateStorage.cs","lineNumber":73,"sourceCode":"\n                    // first time load\n                    _storeRequiresLoad = false;\n                    return new TransactionalStorageLoadResponse<TState>();\n                }\n                else\n                {\n                    TState committedState;\n                    if (this.key.CommittedSequenceId == 0)\n                    {\n                        committedState = new TState();\n                    }\n                    else\n                    {\n                        if (!FindState(this.key.CommittedSequenceId, out var pos))\n                        {\n                            var error = $\"Storage state corrupted: no record for committed state v{this.key.CommittedSequenceId}\";\n                            LogCriticalPartitionError(partition, error);\n                            throw new InvalidOperationException(error);\n                        }\n                        committedState = states[pos].Value.GetState<TState>(this.jsonSettings);\n                    }\n\n                    var PrepareRecordsToRecover = new List<PendingTransactionState<TState>>();\n                    for (int i = 0; i < states.Count; i++)\n                    {\n                        var kvp = states[i];\n\n                        // pending states for already committed transactions can be ignored\n                        if (kvp.Key <= key.CommittedSequenceId)\n                            continue;\n\n                        // upon recovery, local non-committed transactions are considered aborted\n                        if (kvp.Value.TransactionManager == null)\n                            break;\n\n                        ParticipantId tm = JsonConvert.DeserializeObject<ParticipantId>(kvp.Value.TransactionManager, this.jsonSettings);","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/Azure/Orleans.Transactions.AzureStorage/TransactionalState/AzureTableTransactionalStateStorage.cs#L55-L91","documentation":"Thrown by AzureTableTransactionalStateStorage during Load when the stored metadata references a committed sequence id (key.CommittedSequenceId) but no state entity for that version exists in the partition. This indicates the transactional state table is internally inconsistent / corrupted.","triggerScenarios":"External modification or deletion of rows in the Azure Table that back transactional state; partial writes from a crashed silo that left metadata ahead of the actual state rows; manual table tampering.","commonSituations":"Operator deleting state entities manually; a storage account migration that dropped rows; an Orleans upgrade bug that changed the row-key scheme; catastrophic partial failure in an earlier batch.","solutions":["Restore the missing state entity from a backup of the Azure Table.","If recovery is impossible, reset the affected grain's transactional state (delete the partition so it re-initializes) and accept data loss for that actor.","Engage Orleans transactional state recovery tooling or open an issue with the partition key and sequence id for diagnosis.","Audit for external processes writing to the same table."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { await storage.Load(); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"Storage state corrupted\"))\n{ /* quarantine partition, alert, do not retry blindly */ throw; }","preventionTips":["Never manually edit or delete rows in the transactional state table.","Back up the table before Orleans upgrades.","Restrict write access to the storage account to Orleans silos only."],"tags":["transactions","azure-table","storage-corruption","azure"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}