dotnet/orleans · error · InvalidOperationException
Azure Table journal row "{entity.RowKey}" property "{propert
Error message
Azure Table journal row "{entity.RowKey}" property "{propertyName}" is not a binary value. What it means
A DataNN chunk property on a journal row held a value that is neither byte[] nor BinaryData. ReadChunks (AzureTableJournalStorage.cs:915) only accepts binary-typed properties because journal data is opaque bytes; any other CLR type means the schema contract was violated. The provider always writes byte[], so a non-binary value indicates tampering or an incompatible writer.
Source
Thrown at src/Azure/Orleans.Journaling.AzureStorage/AzureTableJournalStorage.cs:919
foreach (var propertyName in ChunkPropertyNames)
{
if (!entity.TryGetValue(propertyName, out var value))
{
foundGap = true;
continue;
}
if (foundGap)
{
throw new InvalidOperationException(
$"Azure Table journal row \"{entity.RowKey}\" contains a non-contiguous binary property \"{propertyName}\".");
}
ReadOnlyMemory<byte> chunk = value switch
{
byte[] bytes => bytes,
BinaryData binaryData => binaryData.ToMemory(),
_ => throw new InvalidOperationException(
$"Azure Table journal row \"{entity.RowKey}\" property \"{propertyName}\" is not a binary value."),
};
if (chunk.IsEmpty)
{
throw new InvalidOperationException(
$"Azure Table journal row \"{entity.RowKey}\" property \"{propertyName}\" is empty.");
}
foundChunk = true;
buffer.Write(chunk.Span);
length += chunk.Length;
consumer.Read(new JournalBufferReader(buffer.Reader, isCompleted: false), metadata);
}
if (!foundChunk)
{
throw new InvalidOperationException($"Azure Table journal row \"{entity.RowKey}\" does not contain journal data.");View on GitHub (pinned to fca799fa70)
Solutions
- Locate the offending row (RowKey is in the message) and delete or replace it so the journal can republish clean binary chunks.
- Audit all writers to the table to confirm none write non-binary values into DataNN properties.
- Use a dedicated table per writer schema to avoid name collisions with other code.
Defensive patterns
Strategy: try-catch
Try / catch
try { await journalStorage.ReadAsync(...); }
catch (InvalidOperationException ex) when (ex.Message.Contains("is not a binary value"))
{
// Quarantine row and Replace the journal generation.
} Prevention
- Keep the journal table exclusive to this provider.
- Audit external writers for type correctness on DataNN columns.
- Run schema-validation queries periodically.
When it happens
Trigger: The switch expression in ReadChunks falls to its default arm because entity[DataNN] resolved to a string, int, DateTime, or other TableEntity supported type instead of binary data.
Common situations: An external tool or a different application stored a typed scalar into a DataNN slot; a serialization change elsewhere reused the same property names; manual row edits via Storage Explorer inserted a string value.
Related errors
- Azure Table journal row "{entity.RowKey}" contains a non-con
- Azure Table journal row "{entity.RowKey}" property "{propert
- Azure Table journal row "{entity.RowKey}" does not contain j
- Azure Table journal header is missing its generation propert
- Azure Table journal header count or length properties are in
AI-assisted analysis of dotnet/orleans@fca799fa70 (2026-08-13).
Data as JSON: /api/errors/eceb9651cd4b6db2.
Report an issue: GitHub.