{"record":{"id":"ee693c07dc2b874a","repo":"dotnet/orleans","slug":"azure-table-journal-row-entity-rowkey-does-not","errorCode":null,"errorMessage":"Azure Table journal row \"{entity.RowKey}\" does not contain journal data.","messagePattern":"Azure Table journal row \"(.+?)\" does not contain journal data\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Azure/Orleans.Journaling.AzureStorage/AzureTableJournalStorage.cs","lineNumber":937,"sourceCode":"                _ => throw new InvalidOperationException(\n                    $\"Azure Table journal row \\\"{entity.RowKey}\\\" property \\\"{propertyName}\\\" is not a binary value.\"),\n            };\n\n            if (chunk.IsEmpty)\n            {\n                throw new InvalidOperationException(\n                    $\"Azure Table journal row \\\"{entity.RowKey}\\\" property \\\"{propertyName}\\\" is empty.\");\n            }\n\n            foundChunk = true;\n            buffer.Write(chunk.Span);\n            length += chunk.Length;\n            consumer.Read(new JournalBufferReader(buffer.Reader, isCompleted: false), metadata);\n        }\n\n        if (!foundChunk)\n        {\n            throw new InvalidOperationException($\"Azure Table journal row \\\"{entity.RowKey}\\\" does not contain journal data.\");\n        }\n\n        return length;\n    }\n\n    private TableEntity CreateHeaderCountsPatch(HeaderProviderState providerState)\n        => new(_partitionKey, HeaderRowKey)\n        {\n            [JournalIdPropertyName] = _journalId.Value,\n            [RowCountPropertyName] = providerState.RowCount,\n            [LengthPropertyName] = providerState.Length,\n            [AppendRowCountPropertyName] = providerState.AppendRowCount,\n            [AppendLengthPropertyName] = providerState.AppendLength,\n        };\n\n    private TableEntity CreateHeaderFlipPatch(string generation, long rowCount, long length)\n        => new(_partitionKey, HeaderRowKey)\n        {","sourceCodeStart":919,"sourceCodeEnd":955,"githubUrl":"https://github.com/dotnet/orleans/blob/fca799fa70ecb6ad975224271703ca43221f58de/src/Azure/Orleans.Journaling.AzureStorage/AzureTableJournalStorage.cs#L919-L955","documentation":"A journal data row contained none of the expected DataNN chunk properties, so there is no journal payload to replay. ReadChunks sets foundChunk only when at least one chunk is read; if the loop completes with foundChunk still false (AzureTableJournalStorage.cs:935), the row is treated as invalid. Such orphan rows are not produced by the writer and indicate stray or corrupted entities.","triggerScenarios":"ReadChunks iterates all of ChunkPropertyNames and entity.TryGetValue returns false for every one, leaving foundChunk false, then throws at line 937.","commonSituations":"A placeholder/empty row was inserted by an external process; a previous failed write left a row skeleton with only header-like fields; the row was partially cleaned up leaving no data keys.","solutions":["Delete the orphan row (RowKey in the message) from the partition.","Verify no code path creates rows in the journal table without populating at least Data00.","Run a Replace on the journal to republish a clean generation and let old-row cleanup remove strays."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { await journalStorage.ReadAsync(...); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"does not contain journal data\"))\n{\n    // Treat row as orphan; delete and rebuild.\n}","preventionTips":["Do not create rows in the journal table without Data00.","Clean up aborted-write leftovers.","Use the provider's cleanup path instead of manual deletes."],"tags":["azure-table","data-corruption","journal"],"backgroundTag":null,"analyzedSha":"fca799fa70ecb6ad975224271703ca43221f58de","analyzedAt":"2026-08-13T19:55:57.938Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}