Fix large-payload recovery and export-history parity with .NET - #304
Varshitha Bachu (bachuv) wants to merge 2 commits into
Conversation
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Entity serialization must preserve standard short escapes for five control characters to maintain byte-for-byte parity.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 1
Open (1)
What changed in this PR
This PR fixes large-payload recovery, preserves timestamp precision, and aligns entity-history exports with .NET behavior.
Changes:
- Adds generation-aware container recreation and upload retry.
- Preserves sub-millisecond timestamps.
- Updates entity export serialization and regression coverage.
| File | Summary |
|---|---|
exporthistory/src/test/resources/golden/reference-entity-history-events.jsonl |
Adds golden entity-history fixtures. |
exporthistory/src/test/java/com/microsoft/durabletask/exporthistory/HistoryEventSerializerTest.java |
Tests entity serialization behavior. |
exporthistory/src/test/java/com/microsoft/durabletask/exporthistory/HistoryEventSerializerParityTest.java |
Tests .NET serialization parity. |
exporthistory/src/test/java/com/microsoft/durabletask/exporthistory/ExportInstanceHistoryActivityTest.java |
Tests export activity behavior. |
exporthistory/src/test/java/com/microsoft/durabletask/exporthistory/ExportBlobNamingTest.java |
Tests precise blob naming. |
exporthistory/src/main/java/com/microsoft/durabletask/exporthistory/HistoryEventSerializer.java |
Implements entity-history serialization. |
exporthistory/src/main/java/com/microsoft/durabletask/exporthistory/ExportBlobNaming.java |
Preserves timestamp precision in names. |
exporthistory/README.md |
Documents export format changes. |
client/src/test/java/com/microsoft/durabletask/OrchestrationMetadataTest.java |
Tests metadata timestamp precision. |
client/src/test/java/com/microsoft/durabletask/HistoryEventConverterTest.java |
Tests precise history conversion. |
client/src/main/java/com/microsoft/durabletask/OrchestrationMetadata.java |
Preserves metadata timestamp precision. |
client/src/main/java/com/microsoft/durabletask/HistoryEventConverter.java |
Preserves history timestamp precision. |
client/src/main/java/com/microsoft/durabletask/Helpers.java |
Supports precise protobuf timestamps. |
CHANGELOG.md |
Records the behavioral changes. |
azure-blob-payloads/src/test/java/com/microsoft/durabletask/azureblobpayloads/BlobPayloadStoreTest.java |
Tests container recovery and concurrency. |
azure-blob-payloads/src/main/java/com/microsoft/durabletask/azureblobpayloads/BlobPayloadStore.java |
Adds container recovery and retry logic. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The real protobuf conversion path turns absent failure stack traces into empty strings, breaking the promised entity-export parity.
Get a fresh assessment by requesting another Copilot review.
Review effort: Balanced
Findings: 2
wangbill (YunchuWang)
left a comment
There was a problem hiding this comment.
Requesting changes for one remaining value-level mismatch in the new .NET-compatible entity-failure export. Reviewed commit 5ec000e88240e91f62d19e3769662a800baf4974.
| result.put("StackTrace", failure.getStackTrace()); | ||
| result.put("InnerFailure", entityFailureMap(failure.getInnerFailure())); | ||
| result.put("IsNonRetriable", failure.isNonRetriable()); | ||
| result.put("Properties", failure.getProperties() == null ? Collections.emptyMap() : failure.getProperties()); |
There was a problem hiding this comment.
[P2] Decode date-valued failure properties in the export projection
Copying failureDetails.getProperties() directly preserves the dt:/dto: transport prefixes that .NET uses for date-valued properties. Java's protobuf conversion leaves those strings unchanged, whereas the reference .NET conversion recursively decodes them before Newtonsoft serializes the entity response. For example, a streamed EntityOperationFailed property containing dt:2026-06-30T12:00:00.0000000Z exports with that prefix here, but as 2026-06-30T12:00:00Z in .NET. Consumers parsing the reference ISO date value therefore receive a different, non-date string.
Please add an export-local recursive property projection matching the reference date decoding/formatting, preserving ordinary and invalid tagged strings, and extend the streamed-history parity cases to include dt:, dto:, nested maps/lists, and inner failures. This can fix the new export representation without changing the public Java FailureDetails contract.

Issue describing the changes in this PR
Follow-up to #280 and #293. Addresses three behavioral differences from .NET that existed when the Java large-payload and export-history features were merged.
Pull request checklist
CHANGELOG.mdAdditional information
Changes
Validation
Compatibility
The preview entity-export format changes from Java-native entity objects to the .NET-compatible representation. Re-exporting instances previously named using millisecond-truncated timestamps may create different blob names; existing blobs are not renamed or removed.