dotnet/orleans · error · InvalidOperationException

Azure Table journal row "{entity.RowKey}" does not contain j

Error message

Azure Table journal row "{entity.RowKey}" does not contain journal data.

What it means

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.

Source

Thrown at src/Azure/Orleans.Journaling.AzureStorage/AzureTableJournalStorage.cs:937

                _ => 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.");
        }

        return length;
    }

    private TableEntity CreateHeaderCountsPatch(HeaderProviderState providerState)
        => new(_partitionKey, HeaderRowKey)
        {
            [JournalIdPropertyName] = _journalId.Value,
            [RowCountPropertyName] = providerState.RowCount,
            [LengthPropertyName] = providerState.Length,
            [AppendRowCountPropertyName] = providerState.AppendRowCount,
            [AppendLengthPropertyName] = providerState.AppendLength,
        };

    private TableEntity CreateHeaderFlipPatch(string generation, long rowCount, long length)
        => new(_partitionKey, HeaderRowKey)
        {

View on GitHub (pinned to fca799fa70)

Solutions

  1. Delete the orphan row (RowKey in the message) from the partition.
  2. Verify no code path creates rows in the journal table without populating at least Data00.
  3. Run a Replace on the journal to republish a clean generation and let old-row cleanup remove strays.
Defensive patterns

Strategy: try-catch

Try / catch

try { await journalStorage.ReadAsync(...); }
catch (InvalidOperationException ex) when (ex.Message.Contains("does not contain journal data"))
{
    // Treat row as orphan; delete and rebuild.
}

Prevention

When it happens

Trigger: ReadChunks iterates all of ChunkPropertyNames and entity.TryGetValue returns false for every one, leaving foundChunk false, then throws at line 937.

Common situations: 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.

Related errors


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