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

  1. Locate the offending row (RowKey is in the message) and delete or replace it so the journal can republish clean binary chunks.
  2. Audit all writers to the table to confirm none write non-binary values into DataNN properties.
  3. 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

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


AI-assisted analysis of dotnet/orleans@fca799fa70 (2026-08-13). Data as JSON: /api/errors/eceb9651cd4b6db2. Report an issue: GitHub.